您的位置:首页 > 其它

集群环境下log4j日志文件命名方式

2015-05-28 15:49 330 查看
在项目中,通过log4j可以实现对不同模块不同级别日志输出到不同的日志文件中。

以xml格式为例:

<appender name="FILE_INFO" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/usr/local/logs/xxx_info.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] [%M]:%L - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>

按这种方式在单机环境下可以很方便的查询日志。

但是在集群环境下,因为项目同时部署在多个机器上,log4j生成的日志文件在每台机器上都叫xxx_info.log,在开发维护的过程中很难区分那个文件是哪台服务上的,尤其在日志查询比较频繁的情况下做区分有一定的工作量。

为解决这一问题,可以在生成日志文件时增加机器标识。如100_xxx_info.log,标识ip为172.20.80.100这台机器上的。

实现这一功能需要对log4j的Appender做些改动。

通过查看log4j源码可以看出来所有的文件输出都会继承FileAppender ,修改setFile(String file)方法即可实现。

重写DailyRollingFileAppender,改继承重写后的fileappender。

/** 从配置文件读取日志文件名 */
public void setFile(String file) {
String val = file.trim();
int index = val.lastIndexOf('/') + 1;
String path = val.substring(0, index);
String name = val.substring(index);
fileName = path + getIpSuffix() + "_" + name;
}

// 获取本机ip最后一位(双网卡内网ip)
private String getIpSuffix() {
String ip = null;
String suffix = "";
NetworkInterface ni;
try {
ni = NetworkInterface.getByName("eth1");
if (ni == null)
ni = NetworkInterface.getByName("eth0");
Enumeration<InetAddress> ias = ni.getInetAddresses();
for (; ias.hasMoreElements();) {
InetAddress ia = ias.nextElement();
if (ia instanceof InetAddress) {
ip = ia.getHostAddress();
}
}
if (ip == null) {
InetAddress addr = InetAddress.getLocalHost();
ip = addr.getHostAddress();
}
} catch (SocketException e1) {
e1.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
}
if (ip != null) {
int index = ip.lastIndexOf('.') + 1;
suffix = ip.substring(index);
}
return suffix;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐