1、log4j日志简介
Log4j由三个重要的组件构成:日志信息的优先级(Logger),日志信息的输出目的地(Appender),日志信息的输出格式(Layout)。
日志信息的级别分为四级,优先级从高到低有DEBUG、INFO、WARN、ERROR,用来指定这条日志信息的重要程度;
日志信息的输出目的地指定了日志将打印到控制台还是文件中;
日志信息的输出格式则控制了日志信息的显示内容
注意:Log4j日志级别是定义在org.apache.log4j.Level类中,可以看源码。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:TRACE 一般用于更细粒度级别上,比debug级别更低 H:all 最低等级,用于打开所有日志记录。
2、log4j配置文件
log4j的配置文件分为两种, log4j.xml 和 log4j.properties,推荐使用log4j.xml。
2.1、 log4j.xml 详解
注意:
<root>、<logger>和<category>的关系
logger是category的子类,category现在已经不提倡使用了。
logger和category中的additivity属性,additivity="false" 则表示在category中定义日志输在root中过滤掉
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "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="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<!--Threshold是个全局的过滤器,他将把低于所设置的level的信息过滤不显示出来-->
<param name="Threshold" value="DEBUG" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
</layout>
</appender>
<!-- 系统应用级别日志,日志达到一定大小后,产生新的问题 -->
<appender name="fileMaxAppenderAll" class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="error" />
<param name="file" value="E:/logs/all.sys.log" />
<param name="maxFileSize" value="10M" />
<param name="maxBackupIndex" value="5" />
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%c] :%m%n" />
</layout>
</appender>
<!--输出到文件 所有日志,根据name='DatePattern'设置每隔多久分割成一个新文件 -->
<appender name="fileAppenderAll" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E:/logs/all.log" />
<!-- value的格式,(天,小时,分钟), 控制每隔多久分割成一个新文件 -->
<param name="DatePattern" value=".yyyy-MM-dd-HH" />
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
</layout>
</appender>
<!--输出到错误日志文件,只要加上filter过滤标签即可输出指定级别的日志 -->
<appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E:/logs/error.log" />
<param name="DatePattern" value=".yyyy-MM-dd-HH" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
</layout>
<!-- 日志级别,必须LevelMin <= LevelMax ,否则不输出日志 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!-- HTML形式的错误日志,<layout>标签中使用org.apache.log4j.HTMLLayout -->
<appender name="fileHTMLAppender" class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="error" />
<param name="file" value="E:/logs/all.log.html" />
<param name="maxFileSize" value="10M" />
<param name="maxBackupIndex" value="5" />
<param name="append" value="true" />
<layout class="org.apache.log4j.HTMLLayout" />
</appender>
<!-- XML形式错误日志 <layout>标签中使用org.apache.log4j.xml.XMLLayout -->
<appender name="fileXMLAppender" class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="error" />
<param name="file" value="E:/logs/all.log.xml" />
<param name="maxFileSize" value="10M" />
<param name="maxBackupIndex" value="5" />
<param name="append" value="true" />
<layout class="org.apache.log4j.xml.XMLLayout" />
</appender>
<!-- 邮件日志,添加发送和接收日志的邮箱地址 -->
<appender name="mailMAILAppender" class="org.apache.log4j.net.SMTPAppender">
<param name="threshold" value="debug" />
<param name="BufferSize" value="10" />
<param name="From" value="1076242265@163.com" />
<param name="SMTPHost" value="www.baidu.com" />
<param name="Subject" value="1076242265-log4j-Message" />
<param name="To" value="1076242265@163.com" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%c] :%m%n" />
</layout>
</appender>
<!-- SOCKET日志 -->
<appender name="remoteSocketAppender" class="org.apache.log4j.net.SocketAppender">
<param name="threshold" value="fatal" />
<param name="remoteHost" value="localhost" />
<param name="port" value="18845" />
<param name="locationInfo" value="true" />
</appender>
<!-- 输出sql日志文件 -->
<appender name="fileSql" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E:/logs/sql.log" />
<param name="DatePattern" value=".yyyy-MM-dd-HH" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
</layout>
<!-- 日志级别,必须LevelMin <= LevelMax ,否则不输出日志 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!-- 指定接口日志,接口1,name可以按接口名进行自定义命名 -->
<appender name="INTERFACE-METHOD-ONE" class="org.apache.log4j.DailyRollingFileAppender" >
<param name="DatePattern" value=".yyyy-MM-dd-HH" />
<param name="Append" value="true"/>
<param name="file" value="E:/logs/interfaceMethodOne.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!-- 指定接口日志,接口2,name可以按接口名进行自定义命名 -->
<appender name="INTERFACE-METHOD-TWO" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value=".yyyy-MM-dd-HH" />
<param name="Append" value="true"/>
<param name="file" value="E:/logs/interfaceMethodTwo.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!-- 指定logger的设置,additivity指示是否叠加输出log,
如果是false,在INTERFACE-METHOD-ONE-PARTONE logger中日志不会被其它logger满足条件的logger(比如root)输出
将名称为INTERFACE-METHOD-ONE-PARTONE的logger,输出到“interfaceMethodOne”的appender
category的属性additivity="false"表示在category中定义日志输在root中过滤掉
如果不想过滤掉,就设置为true
所谓logger的名字也就是,在定义Logger时,构造函数的参数
Logger log = Logger.getLogger("INTERFACE-METHOD-ONE-PARTONE");
注意:<logger>和<category>的区别
logger是category的子类,category现在已经不提倡使用。
-->
<logger name="INTERFACE-METHOD-ONE-PARTONE" additivity="true">
<level class="org.apache.log4j.Level" value="DEBUG"/>
<!-- 指向上面定义的appender中的name,日志则会输出到指定文件中 -->
<appender-ref ref="INTERFACE-METHOD-ONE"/>
</logger>
<category name="INTERFACE-METHOD-TWO-PARTONE" additivity="true">
<appender-ref ref="INTERFACE-METHOD-TWO"/>
</category>
<!-- 打印sql文件 -->
<category name="com.yw.mapper" additivity="true">
<priority value="DEBUG" />
<appender-ref ref="fileSql" />
</category>
<!--
<category name="org.apache.mybatis">
<priority value="DEBUG" />
<appender-ref ref="fileSql" />
</category>
<category name="org.mybatis.spring">
<priority value="DEBUG" />
<appender-ref ref="fileSql" />
</category>
-->
<root>
<priority value="INFO" />
<appender-ref ref="consoleAppender" />
<appender-ref ref="fileAppenderAll" />
<appender-ref ref="fileAppenderError" />
</root>
</log4j:configuration>
2.2、 log4j.properties 详解
######################
## set log levels
######################
log4j.rootLogger=DEBUG,CONSOLE,FILEOUT
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
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=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c] \:%m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n\u00A0
#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
######################
## Rolling File Appender
######################
log4j.appender.FILEOUT=org.apache.log4j.RollingFileAppender
log4j.appender.FILEOUT.File=E:/logs/allError.log
#log4j.appender.FILEOUT.Threshold=ALL
log4j.appender.FILEOUT.Threshold=INFO
log4j.appender.FILEOUT.Append=true
log4j.appender.fileout.MaxFileSize=1000KB
#log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.FILEOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.FILEOUT.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c] \:%m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n\u00A0
#######################
### File Appender
#######################
#log4j.appender.FILE=org.apache.log4j.FileAppender
#log4j.appender.FILE.File=E:/logs/all.log
#log4j.appender.FILE.Append=true
#log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c] \:%m%n
##log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n\u00A0
#####################
## 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.SOCET.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
#log4j.appender.MAIL.From=openwolfl@163.com
#log4j.appender.MAIL.SMTPHost=mail.openwolf.com
#log4j.appender.MAIL.Subject=Log4J Message
#log4j.appender.MAIL.To=openwolfl@163.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=root
#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
#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
####################
### myself 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
3、log4j配置文件自动读取
项目中配置log4j.xml或者log4j.properties文件,不需要配置读取log4j配置文件,程序运行后log4j配置文件会自动起作用,主要因为apache.log4j.java的源码中已经读取了这个配置文件(log4j配置文件必须放在根目录下):
优先读取log4j.xml配置,不存在则会去读取log4j.properties
4、log4j日志使用
两种方式:
public class UserServiceImpl implements UserService {
//第一种方式,INTERFACE-METHOD-ONE 实在xml中配置的一个日志name
private static Logger logger1 = Logger.getLogger("INTERFACE-METHOD-ONE");
//第二种方式:UserServiceImpl.class 是该类的class
private static Logger logger2 = Logger.getLogger(UserServiceImpl.class);
}