beauty_beast

上善若水 厚德载物

基于log4j实现统一日志管理

Posted on 2006-03-16 16:49 柳随风 阅读(4977) 评论(1)  编辑  收藏 所属分类: 开源框架

背景:
       一般操作系统级的告警有相关的软件,但我们应用级日志往往无法统一监控、分析。因为最近的项目是比较大的一个平台,有七、八个子系统,weblogic域也有三、四个。如果用户自身能够实时监控到应用级致命异常日志 如OutOfMemory,线程挂死、应用接口无法链接等等。那么我们监控维护人员工作就大大简化,不然要查看所有域的日志信息,只需集中看一处,系统故障也能够更快的解决,恢复正常。
       用户的需求是要求我们将日志输出到一个第三方厂家的日志Server。

设想:
        weblogic platform域的日志输出是可配置的,在$bea/weblogic/common/lib/workshopLogCfg.xml, 原先的一个项目所有的日志输出均在此文件中配置。其他中间件本人很少使用,相信也有类似的功能,log4j日志框架支持统一日志管理功能,简单实现原理(启动一个SocketServer,处理各个客户端机器连接的Socket输入,
而每个应用打印日志使用Socket方式将日志内容输出到SocketServer端)。如果能将重要的的中间件异常日志以及应用异常日志到统一日志服务器,实时分析,这样就方便日常监控,有点类似于设备告警的功能,如果再开发出相关日志分析软件,个人觉得会是平台级产品的一个亮点,正如《少林足球》说的有点搞头。

实践:
    实践证明现实和理想总归有一定的差距,呵呵。下面描述验证、学习心得:
    首先描述log4j是如何实现统一日志管理该功能的。
    核心类:
    一、org.apache.log4j.net.SocketServer 
    主要功能:
                      1、启动SocketServer
                      2、接受Socket请求
                      3、初始化对应Socket的日志输出配置,如没有,就采用通用配置
                      4、另启线程处理客户端Socket和服务端交互
    一个比较标准的多线程处理实现。
     启动Server需要有三个运行参数:端口号、log4j配置文件、客户端日志在Server端输出配置文件目录
     运行命令如下:
                     java -classpath ../lib/log4j-1.2.8.jar;.; test.logserver.FixSocketServer   8088   server.properties  d:/temp
     说明:
              a、客户端日志在Server端输出配置文件命名规则 $ip.lcf ,    如 10.21.11.10.lcf  
                        该类在解析该配置文件的代码中 应该存在个bug(版本1.2.9)
                                           代码176 行   String key = s.substring(0,i);改为:   String key = s.substring(i+1);
              b、配置文件内容和一般log4j配置内容雷同,categories、appenders、layouts 
     二、org.apache.log4j.net.SocketAppender
             该类继承于AppenderSkeleton,如果我们需要自定义Appender,可以继承AppenderSkeleton类,实现方法:

protected  void append(LoggingEvent event);

    主要功能: 
                     1、连接到SocketServer,并创建一个到SocketServer的对象输出实例
                     2、如果连接失败,会启动一个守护线程,每隔三十秒钟重新连接
                     3、日志输出时,将日志事件对象输出到SocketServer
     相对应的日志配置:
        

log4j.appender.mysocket=test.logserver.SocketAppender 
log4j.appender.mysocket.RemoteHost
=10.243.17.85 
log4j.appender.mysocket.Port
=8088 
log4j.appender.mysocket.LocationInfo
=true 
log4j.appender.mysocket.layout
=org.apache.log4j.PatternLayout 
log4j.appender.myConsole.layout.ConversionPattern
=%5p [%t] (%F:%L) - %m%n


      三、org.apache.log4j.net.SocketNode
              该类相对简单,一个线程类
     主要功能:
                     负责接收客户端对应输出对象,根据对应的配置,输出相关日志。

      可以看出是通过对象进行传输的,如果第三方不是采用java语言的,实际解决时只需改写SocketAppender的append方法,输出日志内容就可。对方实现SocketServer功能就可(编程语言基本都支持该功能)。

       遗憾的是在weblogic 一般server域中我没有找到可以改变日志输出的地方(上次看到weblogic9.0中有日志服务,不知道能不能改变),所以实际差距还是比较大的,关于性能问题,因为是重要的日志(warning、error、fetal)才输出,采用socket方式问题应该不大。

篇外话:               
           查看代码中无意中发现log4j框架一部分源码都是一些人捐献的。虽然代码不复杂,但感觉为自己喜欢的框架很热心,希望它变的越来越好,真的希望我们国内也能有一些优秀的开源项目,并且大家都去支持它,发展它。
           实际我在项目中使用log4j使用的都是一些基本功能,对它的设计、结构不是很清楚,谁有相关学习文档,请给我一份,不甚感激(使用手册已有)。



   
                                           

Feedback

# re: 基于log4j实现统一日志管理  回复  更多评论   

2013-01-20 20:31 by BadMan03
请问 log4j SocketAppender 连服务端是短连接还是长连接?如果是长连接,谁在维护这个连接呢?

比如多线程业务处理时,业务线程里用log4j打日志,打完就释放了,那log4j SocketAppender 的连接还在?如果不在的话,岂不是每笔业务调用都要连一下服务端,会导致两个问题:
1)频繁的连接导致业务性能下降,尤其是并发量大的系统,不可接受
2)会导致socket耗尽

大虾给详细说明一下呢

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


网站导航: