集群环境下log4j日志文件命名方式
在项目中,通过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;
????}