四个关键:
#以文件形式输出
log4j.appender.wangteng.File=org.apache.log4j.DailyRollingFileAppender
log4j.appender.wangteng.File.file=E:\\my.log
log4j.appender.wangteng.File.DatePattern=.yyyy-MM-dd
#以控制台形式输出
log4j.appender.wangteng.Console=org.apache.log4j.ConsoleAppender
# 输出样式 为 用户自定义
log4j.appender.wangteng.File.layout=org.apache.log4j.PatternLayout
#(%C:%M) 包名+类名:方法
#%m 日志信息 %n 回车
# %5p 日志级别,不够5位的补空格,-5p左对齐,5p右对齐
log4j.appender.wangteng.File.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS %5p (%C:%M) - %m%n}
log4j.appender.wangteng.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.wangteng.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS %5p (%C:%M) - %m%n}
#默认 debug级别,输出到文件,输出到控制台
log4j.rootLogger=debug,wangteng.File,wangteng.Console
总结:以什么样的格式,按照日志的优先级,将日志输出到哪
Appender、Layout、Logger的关系:
每个Appender后面必然需要跟随Layout,指定自己的风格样式
每个Logger都可以指定一个级别和引用多个Appender
每个Appender可以被多个Logger引
常见Appender,前3个常用:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFIleAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志以流格式发送到任意指定的地方)
org.apache.log4j.ConsoleAppender(把日志用JDBC记录到数据库中)
常见Layout:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活的指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
常用PatternLayout:
%m 输出代码中指定的信息
%p 输出优先级,即DEBUG、INFO、WARN、ERROR
%r 输出自应用启动到输出该log耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车符,windows为"\r\n",linux为"\n"
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy-MM-dd HH-mm-ss,SSS}
多个输出源:
# log4j.logger.com.wangteng=error,wangteng.File,wangteng.Console log4j.logger.com.wangteng.dao=info,wangteng.File,wangteng.Console log4j.rootLogger=debug,wangteng.File,wangteng.Console #级别取包名类名指定最精确的,输出各自都输出
log4j.xml
<log4j:configuration>
<appender>...<appender>
<appender>...<appender>
<logger>...logger>
<logger>...logger>
<root>...root>
log4j:configuration>
<log4j:configuration>
<appender name="wangteng.console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value=“%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p (%C:%M) - %m%n” />
layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="debug" />
<param name="levelMax" value="debug" />
<param name="AcceptOnMatch" value="true" />
filter>
<appender>
<appender name="wangteng.file" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E:\\my.log" />
<param name="Append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS %-5p (%C:%M) - %m%n}" />
layout>
<appender>
<logger name="com.wangteng.dao" additivity="false">
<level value="info" />
<appender-ref ref="wangteng.console" />
<appender-ref ref="wangteng.file" />
logger>
<logger name="com.wangteng" additivity="false">
<level value="error" />
<appender-ref ref="wangteng.console" />
<appender-ref ref="wangteng.file" />
logger>
<root>
<level value="debug" />
<appender-ref ref="wangteng.console" />
<appender-ref ref="wangteng.file" />
root>
log4j:configuration>
xml和properties都存在,听xml的
如果appender内设置了filter,那么当日志匹配到的logger使用这个appender时,打印级别会是两者的交集,例如:logger内是ERROR,而appender内是DEBUG,那么这个appender就不会有日志输出
logger.error(e.getMessage(), e.getCause())