简介
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
此外,通过Log4j其他语言接口,您可以在C、C+ +、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通 过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
log4j的使用
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局);这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。
综合使用这三个组件可以轻松的记录信息的类型和 级别,并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明:
1、 Loggers
Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发 生了一个级别Q比P高,则可以启动,否则屏蔽掉。
假设你定义的级别是info,那么error和warn的日志可以显示而比他低的debug信息就不显示了。
2、Appenders
禁用与使用日志请求只是Log4j其中的一个小小的地方,Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
其语法表示为:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3、Layouts
有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四 种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。
其语法表示为:
- org.apache.log4j.HTMLLayout(以HTML表格形式布局),
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
程序举例
1、引入log4j
在pom.xml中加入依赖:
<dependency >
<groupId >log4j </groupId >
<artifactId >log4j </artifactId >
<version >1.2.14 </version >
</dependency >
<dependency >
<groupId >org.slf4j </groupId >
<artifactId >slf4j- api</ artifactId>
<version >1.6.1 </version >
</dependency >
<dependency >
<groupId >org.slf4j </groupId >
<artifactId >slf4j-log4j12 </artifactId >
<version >1.6.1 </version >
</dependency >
<dependency >
<groupId >org.slf4j </groupId >
<artifactId >slf4j- nop</ artifactId>
<version >1.6.1 </version >
</dependency >
2、配置web.xml和log4j.xml
1)配置web.xml,初始化日志系统
web.xml
<context-param >
<param-name >log4jConfigLocation </param-name >
<param-value >/WEB-INF/log4j.xml </param-value >
</context-param >
<listener >
<listener-class >org.springframework.web.util.Log4jConfigListener </listener-class >
</listener >
2)配置log4j.xml,配置输出的log格式和输出地等
log4j.xml
<?xml version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<!-- ========================== 自定义输出格式说明================================ -->
<!-- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL -->
<!-- %r 输出自应用启动到输出该log信息耗费的毫秒数 -->
<!-- %c 输出所属的类目,通常就是所在类的全名 -->
<!-- %t 输出产生该日志事件的线程名 -->
<!-- %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” -->
<!-- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{ yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 -->
<!-- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) -->
<!-- ========================================================================== -->
<!-- ========================== 输出方式说明================================ -->
<!-- Log4j提供的appender有以下几种: -->
<!-- org.apache.log4j.ConsoleAppender(控制台), -->
<!-- org.apache.log4j.FileAppender(文件), -->
<!-- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), -->
<!-- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), -->
<!-- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) -->
<!-- ========================================================================== -->
<!-- 输出到控制台 -->
<appender name ="myConsole" class="org.apache.log4j.ConsoleAppender">
<layout class ="org.apache.log4j.PatternLayout">
<param name ="ConversionPattern" value= "[%p] %d{yyyy-mm-dd HH:mm:ss} %c :: %m%n"/>
</layout >
<filter class ="org.apache.log4j.varia.LevelRangeFilter">
<param name ="LevelMin" value="DEBUG"/>
<param name ="LevelMax" value="ERROR"/>
</filter >
</appender >
<!-- 输出到日志文件 -->
<appender name ="myspring" class= "org.apache.log4j.RollingFileAppender" >
<param name ="File" value="F:/icod/myspring/output/mylog.log"/>
<param name ="Append" value="true"/>
<layout class ="org.apache.log4j.PatternLayout">
<param name ="ConversionPattern" value= "[%p] %d{yyyy-mm-dd HH:mm:ss} %c :: %m%n"/>
</layout >
</appender >
<!--通过<category></category>的定义可以将各个包中的类日志输出到不同的日志文件中-->
<category name ="com.myspring.app">
<level value ="debug" />
<appender-ref ref ="myspring" />
</category >
<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
<logger name ="myspringlogger" additivity="false">
<level value ="debug" />
<appender-ref ref ="myspring" />
</logger >
<!-- 根logger的设置-->
<root >
<level value ="debug" />
<appender-ref ref ="myConsole"/>
</root >
</log4j:configuration>
这里定义了控制台输出myConsole和文件输出mySpring
具体的使用这里就不多说了,直接引用log4j的类就可以了。