zyskm用梦想丈量人生,用奔跑丈量激情

集群环境下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;
    }


posted on 2011-10-24 15:33 zyskm 阅读(3419) 评论(6)  编辑  收藏

评论

# re: 集群环境下log4j日志文件命名方式 2011-10-25 08:23 tbw淘宝

很不错啊   回复  更多评论   

# re: 集群环境下log4j日志文件命名方式 2011-12-09 00:37 萍水相逢

方法不错,不过我觉得不是必要要这样子做。  回复  更多评论   

# re: 集群环境下log4j日志文件命名方式 2011-12-09 09:47 zyskm

哦,这是我们运营提出来的,认为不做区分的话不便于日志查询,不知道你怎么做的?@萍水相逢
  回复  更多评论   

# re: 集群环境下log4j日志文件命名方式 2011-12-17 13:50 萍水相逢

日志这个东西,一是写一些有用的东西。二是每天一个(bakcup/housekeeping),每台server一个,要查的话还要每台server去看。所以我认为日志最多有个日期就得了。rename的工作在backup, 和当你要下载的时候做。这样会方便很多。  回复  更多评论   

# re: 集群环境下log4j日志文件命名方式 2011-12-19 13:21 zyskm

运营环境的服务器一般开发人员是没有访问权限的,需要运营下载转发,没有专用下载工具的话,只是用ftp下载,命名工作还是在一开始做好。@萍水相逢
  回复  更多评论   

# re: 集群环境下log4j日志文件命名方式 2012-02-03 09:49 yan_dk

好,思路不错,学习了。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: