Log4j使用总结

Log4j的类图

Log4j类图

日志记录器(Logger)只输出那些级别高于或等于它的级别的信息。如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。因此,如果在pack1.pack2包中创建一个日志记录器(Logger)并且没有设置级别,那它将会继承在包pack1中创建的日志记录器(Logger)的级别。如果在pack1中没有创建日志记录器(Logger)的话,那么在pack1中创建的日志记录器(Logger)将继承root 日志记录器(Logger)的级别,root日志记录器(Logger)经常被实例化而可用,它的默认级别为DEBUG

Logger的级别:

Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF
    
    

 

Appender(日志目的地)

每个Logger都可以拥有一个或者多个appender,每个appender表示一个日志的输出目的地,可以使用Logger.addAppender(Appender)Logger增加一个appender,可以使用Logger.removeAppender(Appender)来为Logger移除一个appender

默认情况下loggeradditivity值为true,表示子logger将继承父Logger的所有appender,该选项可以被重置为false,表示子logger将不再继承父Loggerappender,如果一个categoryadditivityfalse,同时没有appender-ref时将报错。

<category name="CORE" additivity="false">

        <priority value="info"/>

        <appender-ref ref="fileAppender"/>

     </category>

在程序中Logger logger = Logger.getLogger(CORE);记录日志时将记录info或者info级别以上的日志信息到fileAppender

Appender 控制日志怎样输出。下面列出一些可用的Appender(log4j API中所描述的 http://jakarta.apache.org/log4j/docs/api/index.html):

ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者 System.err。默认的目标是System.out ConsoleAppender appender = new ConsoleAppender(new PatternLayout());

可以使用ConsoleAppender对象把日志输出到控制台。每个ConsoleAppender都有一个target,表示它的输出目的地。它可以是System.out,标准输出设备(缓冲显示屏);或者是System.err,标准错误设备(不缓冲显示屏)。

<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">

         <layout class="org.apache.log4j.SimpleLayout"/>

     </appender>

FileAppender 把日志事件写入一个文件 appender = new FileAppender(new PatternLayout(),"filename");  FileAppender(Layout layout, String filename, boolean append)

<appender name="fileAppender" class="org.apache.log4j.FileAppender">

         <param name="File" value="cyaniteCHLog.txt" />

         <param name="Append" value="true" />

         <layout class="org.apache.log4j.PatternLayout">

              <param name="ConversionPattern" value="%d [%t] %p - %m%n" />

         </layout>

     </appender>

RollingFileAppender 扩展FileAppender备份容量达到一定大小的日志文件。不同的是该日志文件的大小受到限制,当日志内容超出最大的尺寸时,该文件将向上滚动(最老的日志被擦除)。还可以在该类对象中指定为日志文件做多少个备份

<appender name="rollingFileAppend"

         class="org.apache.log4j.RollingFileAppender">

         <param name="File" value="cyaniteCH.log" />

         <param name="Append" value="true" />

         <param name="MaxBackupIndex" value="2" />

         <param name="MaxFileSize" value="1024" />

         <layout class="org.apache.log4j.PatternLayout">

              <param name="ConversionPattern" value="%d [%t] %p - %m%n" />

         </layout>

     </appender>

 

DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录。

WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream appender = new WriterAppender(new PatternLayout(),new FileOutputStream("filename"));

SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。

SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。

TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender

还可以实现 Appender 接口,创建以自己的方式进行日志输出的Appender

 

Layout

Appender必须使用一个与之相关联的 Layout,这样它才能知道怎样格式化它的输出。当前,log4j具有三种类型的Layout:

HTMLLayout 格式化日志输出为HTML表格。 HTMLLayout layout = new HTMLLayout();

PatternLayout 根据指定的 转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式。 %n is newline

String pattern = "Milliseconds since program start: %r %n";

pattern += "Classname of caller: %C %n";

pattern += "Date in ISO8601 format: %d{ISO8601} %n";

pattern += "Location of log event: %l %n";

pattern += "Message: %m %n %n";

PatternLayout layout = new PatternLayout(pattern);

SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息。SimpleLayout layout = new SimpleLayout();

 

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

  %p 输出优先级,即DEBUGINFOWARNERRORFATAL
  %r 输出自应用启动到输出该log信息耗费的毫秒数
  %c 输出所属的类目,通常就是所在类的全名
  %t 输出产生该日志事件的线程名
  %n 输出一个回车换行符,Windows平台为“/r/n”Unix平台为“/n”
  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似: 2002 10 18 221028921
  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

 

Logger的初始化

BasicConfigurator.configure();

BasicConfigurator.configure()方法使用最简的方法配置log4j环境。注:所谓配置log4j环境,就是指配置root logger,因为所有其它的logger都是root logger的后代,所以它们(默认情况下)都将继承root logger的性质。

BasicConfigurator.configure()完成的任务是:

  • 用默认pattern创建PatternLayout对象p
    PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n");
  • p创建ConsoleAppender对象a,目标是system.out,标准输出设备:
    ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
  • root logger增加一个ConsoleAppender p
    rootLogger.addAppender(p);
  • root loggerlog level设置为DEBUG级别:
    rootLogger.setLevel(Level.DEBUG);

DOMConfigurator.configure()

xml格式的log4j配置文件需要使用org.apache.log4j.xml.DOMConfigurator.configure()方法来读入。对xml文件的语法定义可以在log4j的发布包中找到:org/apache/log4j/xml/log4j.dtd

PropertyConfigurator.configure()

读取使用Java的特性文件编写的配置文件。

 

Log4jxml配置文件的树状结构

log4jxml配置文件的树状结构如下所示,下图只显示了常用的部分。

xml declaration and DTD
    
    
 |
    
    
log4j:configuration
    
    
 |
    
    
 +-- appender (name, class)
    
    
 |     |
    
    
 |     +-- param (name, value)
    
    
 |     +-- layout (class)
    
    
 |           |
    
    
 |           +-- param (name, value)
    
    
 +-- logger (name, additivity)  | category
    
    
 |     |
    
    
 |     +-- level (class, value)
    
    
 |     |     |
    
    
 |     |     +-- param (name, value)
    
    
 |     +-- appender-ref (ref)
    
    
 +-- root
    
    
 |
    
    
 +-- param (name, class)
    
    
 +-- level
    
    
 |     |
    
    
 |     +-- param (name, value)
    
    
 +-- appender-ref (ref)  
    
    
          
    
    

xml declaration and DTD

xml配置文件的头部包括两个部分:xml声明和DTD声明。头部的格式如下:

<?xml version="1.0" encoding="UTF-8" ?>
  
  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  
  
          
    
    

Log4jconfigurationroot element

  • xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间,取定值"http://jakarta.apache.org/log4j/"
  • appender [* child] : 一个appender子元素定义一个日志输出目的地
  • logger [* child] : 一个logger子元素定义一个日志写出器
  • root [? child] : root子元素定义了root logger

appender

appender元素定义一个日志输出目的地。
   
   
  • name [#REQUIRED attribute] : 定义appender的名字,以便被后文引用
  • class [#REQUIRED attribute] : 定义appender对象所属的类的全名
  • param [* child] : 创建appender对象时传递给类构造方法的参数
  • layout [? child] : appender使用的layout对象

layout

layout元素定义与某一个appender相联系的日志格式化器。

  • class [#REQUIRED attribute] : 定义layout对象所属的类的全名
  • param [* child] : 创建layout对象时传递给类构造方法的参数

logger

logger元素定义一个日志输出器。

  • name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
  • additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
  • level [? child] : 定义该logger的日志级别
  • appender-ref [* child] : 定义该logger的输出目的地

root

root元素定义根日志输出器root logger

  • param [* child] : 创建root logger对象时传递给类构造方法的参数
  • level [? child] : 定义root logger的日志级别
  • appender-ref [* child] : 定义root logger的输出目的地

level

level元素定义logger对象的日志级别。

  • class [#IMPLIED attribute] : 定义level对象所属的类,默认情况下是"org.apache.log4j.Level
  • value [#REQUIRED attribute] : level对象赋值。可能的取值从小到大依次为"all""debug""info""warn""error""fatal""off"。当值为"off"时表示没有任何日志信息被输出
  • param [* child] : 创建level对象时传递给类构造方法的参数

appender-ref

appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender

  • ref [#REQUIRED attribute] : 一个appender元素的名字的引用
  • appender-ref元素没有子元素

param

param元素在创建对象时为类的构造方法提供参数。它可以成为appenderlayoutfiltererrorHandlerlevelcategoryFactoryroot等元素的子元素。

  • name and value [#REQUIRED attributes] : 提供参数的一组名值对
  • param元素没有子元素

 

Log4j的编码习惯

  • 让每个类都拥有一个private staticLogger对象,用来输出该类中的全部日志信息
  • 使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意:在一个项目中,log4j环境只需要被配置一次,而不是在每个使用了logger的类里都需要调用一次
  • MyClass.class作为参数创建该类的静态Logger对象   ,这个继承RootLogger的配置

  

 

 

 

我的应用
在项目测试过程中,由于登录服务器查看日志比较麻烦,而测试过程中又需要经常查看日志,可通过 TelenetAppender Applet 结合动态展现日志内容。增加 TelnetAppender logging.xml 中,
<appender name="telnetAppender" class="org.apache.log4j.net.TelnetAppender" >
        <param name="port" value="9999"/>
       <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" value="%d{ISO8601} %-5p %10c - %m%n" />
       </layout>
    </appender>
 
<root>
       <priority value="debug" />
       <appender-ref ref="telnetAppender"/>
    </root>
下面是一张效果图。
系统日志远程查看Applet
 
Applet 中通过线程监听 TelnetAppender 设置的端口,页面模仿 Axis SOAPMonitor 设计。可通过 Start Stop 按钮开始和停止输出日志内容。点击状态栏在输出域输出 About 信息。程序可从资源中下载,两个 Java 文件,可直接编译后放在 WebContent 下,稍作改动可作为 Java 应用程序使用。
在实际部署中,内部服务器不会对外开放,也就是说你通过 Applet 访问服务器的 IP 和端口时,不能建立链接,变通的方法是采用 Ajax+Servlet 。在一个 Servlet 中实现类似 Applet 提供的功能,这样只会和 Log4J 建立一条 Socket 链接,考虑到页面反应时间的问题,在 Servlet 对日志的后 10000 条记录进行缓存,然后后面的覆盖前面的数据,根据建立的 Session 中保存的记录编号提取日志。在 JSP 页面中通过 Ajax 每隔 2 秒钟提取一次日志内容增加到 TextArea 。运行良好。页面效果:
页面动态查看日志内容
 
系统中增加了对日志的记录级别的动态调整和日志输出对象的调整,通过程序调整 RootLog Level Appender,removeAppender 或者 addAppender
不足的方面在于如果在同一个容器中的多个应用,那么每个应用不能共享同一个端口,每个应用TelnetAppender必须使用不同的端口,应可以改善,同时在有些容器中有时候会在关闭应用的时候,TelnetAppender不能关闭,导致启动的时候报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值