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

在项目中,通过log4j可以实现对不同模块不同级别日志输出到不同的日志文件中。
以xml格式为例:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> < 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。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> /** */ /** 从配置文件读取日志文件名 */
    
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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值