标签:
一、概述
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送到目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
此外,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且通过使用各种第三方扩展,可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
二、构成
Log4j由三个重要的组件构成:日志信息的优先级 priority,日志信息的输出目的地Appender,日志信息的输出格式(布局)layout。
1、日志信息的优先级priority
从低到高,依次有:DEBUG,INFO,WARN,ERROR,分别用来指定这条日志信息的重要程度;如果定义了输出的级别为INFO,则只有等于及高于这个级别的才进行处理,此时将输出INFO,WARN,ERROR。值得注意的是,级别中还有三个关键字:
FATAL:能导致程序挂起的错误日志;
ALL:打印所有的日志;
OFF:关闭所有的日志输出。
2、日志信息的输出目的地Appender
org.apache.log4j.ConsoleAppender,将日志信息输出到控制台;属性有:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Target=System.err:默认值是System.out。
org.apache.log4j.FileAppender,将日志信息输出到一个文件;属性有:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示服务重启后消息是否增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
org.apache.log4j.DailyRollingFileAppender,将日志信息输出到一个,并且每天输出到一个新的日志文件,按照不同的配置可以定义每月一个日志文件,或者每周,每天,每小时,每分钟等输出一个新的日志文件;属性有:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示服务重启后消息是否增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/logs/logging.log4j:指定当前消息输出到logging.log4j文件中。
DatePattern=‘.‘yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy-MM。也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
1>‘.‘yyyy-MM:每月
2>‘.‘yyyy-ww:每周
3>‘.‘yyyy-MM-dd:每天
4>‘.‘yyyy-MM-dd-a:每天两次
5>‘.‘yyyy-MM-dd-HH:每小时
6>‘.‘yyyy-MM-dd-HH-mm:每分钟
org.apache.log4j.RollingFileAppender,将日志信息输出到一个文件,通过指定文件的的尺寸,当文件大小到达指定尺寸的时候会自动把文件改名,如名为example.log的文件会改名为example.log.1,同时产生一个新的example.log文件。如果新的文件再次达到指定尺寸,又会自动把文件改名为example.log.2,同时产生一个example.log文件。依此类推,直到example.log. MaxBackupIndex,MaxBackupIndex的值可在配置文件中定义。属性有:
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示服务重启后消息是否增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数,例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。
org.apache.log4j.WriterAppender,将日志信息以流格式发送到任意指定的地方。
org.apache.log4j.jdbc.JDBCAppender,通过JDBC把日志信息输出到数据库中。
org.apache.log4j.net.SMTPAppender,将日志信息以邮件的方式发送到指定的邮箱。
3、日志信息的输出格式布局Layout
Log4j提供的布局模式有以下几种:
org.apache.log4j.HTMLLayout:以HTML表格形式布局,属性有:
LocationInfo=true:输出java文件名称和行号,默认值是false。
Title=My Logging: 默认值是Log4J Log Messages。
org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串
org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等等信息
org.apache.log4j.PatternLayout:可以灵活地指定布局模式;
ConversionPattern=%m%n:自定义日志信息输出格式。
格式字符 |
含义 |
c |
输出logger name |
C |
输出日志信息所属的类的全名 |
d |
输出日期时间信息,默认格式为ISO8601,也可以在其后指定格式,比如: %d{yyyy-MM-dd HH:mm:ss },输出类似:2002-10-18 22:10:28; 格式可以参考 java类 SimpleDateFormat,不过按照此类的设置会影响速度。 可以选择Log4j内置格式: %d{ISO8601},%d{ABSOLUTE}, %d{RELATIVE}或者log4j的ISO8601DateFormat, AbsoluteTimeDateFormat,RelativeTimeDateFormat 和 DateTimeDateFormat 方式 |
f |
输出日志信息所属类所在的文件名 |
l |
输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 |
L |
输出日志语句所在源文件的行号 |
m |
输出代码中指定的信息,如log(message)中的message |
M |
输出日志信息中所发生的方法名 |
n |
输出平台相关的换行符, |
p |
输出优先级,即DEBUG,INFO,WARN,ERROR。如果是调用debug()输出的,则为DEBUG,依此类推 |
r |
输出自应用启动到输出该日志信息所耗费的毫秒数 |
t |
输出产生该日志事件的线程名 |
x |
输出与当前线程相关联的NDC(Nested Diagnostic Context)信息 |
X |
输出与当前想成相关联的MDC(Mapped Diagnostic Context)信息 |
% |
输出% |
可以在%与格式字符之间加上修饰符来控制其最小宽度、最大宽度和文本的对齐方式。如:
1)%20c:指定输出logger的名称,最小的宽度是20,如果logger的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出logger的名称,最小的宽度是20,如果logger的名称小于20的话左对齐,"-"号指定左对齐。
3)%.30c:指定输出logger的名称,最大的宽度是30,如果logger的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果logger的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
三、配置
Log4j支持两种配置方式,分别是.properties 二进制文件和.xml文件的方式。需要log4j-1.2.15.jar
1、.properties方式
.proterties文件:
log4j.rootLogger=DEBUG,CONSOLE,FILE,ROLLING_FILE,SOCKET,LF5_APPENDER,MAIL,DATABASE,A1,A8,im log4j.addivity.org.apache=true ################### # Console Appender ################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n ##################### # File Appender ##################### log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis ######################## # Rolling File ######################## log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #################### # Socket Appender #################### log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCKET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n ######################## # Log Factor 5 Appender ######################## log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 ######################## # SMTP Appender ####################### log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 og4j.appender.MAIL.From=chenyl@yeqiangwei.com log4j.appender.MAIL.SMTPHost=mail.hollycrm.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=chenyl@yeqiangwei.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ######################## # JDBC Appender ####################### log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:MySQL://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password= log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ######################## # DailyRollingFile Appender ####################### log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=SampleMessages.log4j log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout ################### #NT2000日志 Appender 需把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录下 ################### log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender log4j.appender.A8.Source=JavaTest log4j.appender.A8.layout=org.apache.log4j.PatternLayout log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n ################### #自定义Appender ################### log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender log4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = corlin@yeqiangwei.com log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
java文件:
import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; public class Test { static Logger logger = Logger.getLogger(Test.class); public static void main(String args[]) { //以property方式读到配置文件。 PropertyConfigurator.configure("log4j.properties"); logger.debug("Here is some DEBUG"); logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); } }
2、.xml方式
.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-4r [%t] %-5p %c %x - %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="E:/log.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="500KB" /> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /> </layout> </appender> <root> <priority value="debug"/> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> </root> </log4j:configuration>
java文件:
import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; public class Test{ static Logger logger = Logger.getLogger(Test.class); public static void main(String args[]) { //以XML方式读到配置文件。 DOMConfigurator.configure("log4j.xml"); logger.debug("Here is some DEBUG"); logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); } }
不管是.properties方式还是.xml方式都需要在web.xml中配置
<servlet> <servlet-name>InitLog4j</servlet-name> <servlet-class>com.yourcompany.log4j.InitLog4j</servlet-class> <init-param> <param-name>log4j</param-name> <param-value>/WEB-INF/log4j.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
参考:http://www.cnblogs.com/ITtangtang/p/3926665.html
http://www.blogjava.net/DLevin/archive/2012/07/04/382131.html
标签:
原文地址:http://blog.csdn.net/lzghxjt/article/details/51439773