log4j: log for java
一个开源的,轻量级的,用于日志管理的框架
① 日志监控打印,在项目试运行期需要记录用户所有的操作
②添加新的内容,比如时间和线程
③程序调试期间,记录运行的步骤和运行行
④成功上线稳定运行后,不再需要打印了,或需要时打开日志,或只打开info error日志 关闭debug日志等
⑤多个日志的输出源,比如到数据库、eclipse控制台,或者日志文件到linux服务器下,或输入到指定的文件
log4j的两种配置方式
一、los4j.properties
①目的地【appender】:是将日志打印到控制台、输入到文件里、还是保存到数据库里......
myName是自定义的目的地的名字
log4j.appender.myName=org.apache.log4j.ConsoleAppender (控制台)
log4j.appender.myName=org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
log4j.appender.myName=org.apache.log4j.FileAppender (文件)
log4j.appender.myName =org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
log4j.appender.myName=org.apache.log4j.WriteAppender(将日志以流的格式发送到任意指定的地方)
log4j.appender.myName=org.apache.log4j.JDBCAppender(把日志用JDBC记录到数据库中)
②布局【layout】:指输出信息的格式
log4j.appender.myName.layout=org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
log4j.appender.myName.layout=org.apache.log4j.HTMLLayout (以html表格形式布局)
log4j.appender.myName.layout=org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
log4j.appender.myName.layout=org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等信息)
③控制单元【logger】:(rootLogger为老根单元)
假设name1为 atguigu.File 输出到文件 name2为 atguigu.Console 输出到控制台
log4j.rootLogger=info,name1,name2 #(rootLogger 输出日志的根)
log4j.logger.com.atguigu.p2p =error,name1,name2
有多个控制单元 :日志级别取精确,输出为各自:
级别取其精:com.atguigu.p2p.dao下的类,log4j.logger.com.atguigu.p2p路径较精确 所以取他的日志级别error,
输出为各自:log4j.rootLogger的name2为输出到控制台 log4j.logger.com.atguigu.p2的name2也输出到控制台 所以输出两次
④级别【level】:debug info warn error
debug < info < warn < error
打印自身往后靠:log4j.rootLogger=info,name1,name2 若是info 则打印 info warn error的日志
例1:
log4j.appender.logConsole=org.apache.log4j.ConsoleAppender #将日志打印在控制台上
log4j.appender.logConsole.layout=org.apache.log4j.PatternLayout #以自定义的方式打印在控制台上
log4j.appender.logConsole.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p (%C:%M) %m%n #自定义日志输出格式
log4j.appender.logFile=org.apache.log4j.DailyRollingFileAppender #每天产生一个日志文件
log4j.appender.logFile.File=${catalina.home}/logs/newNetLottery_ldc/all.log #产生的日志文件的位置,名字为all.log
log4j.appender.logFile.DatePattern=.yyyy-MM-dd #每天生成日志文件名的后缀,如all.log.2016.10.10
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout #以自定义的方式输入到日志文件里
log4j.appender.logFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p (%C:%M) -%m%n #自定义日志输出格式
log4j.rootLogger=error,logFile,logConsole #(rootLogger 输出日志的根)
log4j.logger.com.atguigu.p2p=debug,logFile,logConsole #com.atguigu.p2p下的包日志级别为debug
log4j.logger.com.atguigu.p2p.dao=info,logFile,logConsole # com.atguigu.p2p.dao 包下的类日志的级别取此处的日志级别
两个目的地:logFile和logConsole都制定自己的布局和日志的输出格式
从控制单元logger可以看出老根(所有的类下)除非com.atguigu.p2p包下的类只打印error的日志
com.atguigu.p2p下除了com.atguigu.p2p.dao包下的类里打印的日志为debug即以上级别的日志
com.atguigu.p2p.dao包下的类里打印的日志为info即以上级别的日志
但是三个logger都有目的 logFile和logConsole,com.atguigu.p2p.dao下的类,也属于com.atguigu.p2p包下,也属于老根的包下,所以logFile会打印三回,logConsole也会打印三回,若只想输入一回则只在老根包下加入目的地即可,老根代表所有的包下的类都会打印到其配置的目的地,如果com.atguigu.p2p.dao是我自己开发的包,我同时想把日志打印到我自己的目的地,我可以单独添加一个目的地即可
例2:
log4j.appender.all=org.apache.log4j.DailyRollingFileAppender #一天生成一个日志文件
log4j.appender.DRF.Append=true #日志内容是追加到文件的 默认就是true不用设置 若为false每次打印日志将覆盖
log4j.appender.Threshold=warn #全局过滤,虽然老根指定了打印info级别的,或者更精确的控制器指定了更小级别的,但是此输出目的,全局过滤warn级别以下的日志,只打印warn以及以上级别的日志
log4j.appender.all.layout=org.apache.log4j.PatternLayout
log4j.appender.all.File=${catalina.home}/logs/newNetLottery_plant/all.log
log4j.appender.all.DatePattern='.'yyyy-MM-dd
log4j.appender.all.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-[%X{IP}#%X{USER}]-%5p %23c{1}:%5L - %m%n
log4j.appender.stdout=org.apache.log4j.ConsoleAppender #打印到控制台
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-[%X{IP}#%X{USER}]-%5p %23c{1}:%5L - %m%n
log4j.appender.summary=org.apache.log4j.DailyRollingFileAppender #自定义我开发的包下的输出目的地
log4j.appender.summary.layout=org.apache.log4j.PatternLayout
log4j.appender.summary.File=${catalina.home}/logs/newNetLottery_plant/summary.log
log4j.appender.summary.DatePattern='.'yyyy-MM-dd
log4j.appender.summary.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-[%X{IP}#%X{USER}]-%5p %23c{1}:%5L - %m%n
log4j.rootLogger=INFO, all, stdout #所有包下的类 若不指定精确的日志级别就打印info以及以上的日志到all文件和控制台上
log4j.logger.com.newNet.lottery=debug, summary
#com.newNet.lottery包下的类是我开发的,将我开发的类打印的日志不仅在all和stdout两个目的地打印日志也要在summary打印日志
#并且打印日志的级别为debug,打印debug以及以上的日志
#以下都是打印到老根指定的目的地,打印的级别根据下面指定的打印
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.org.springframework.web=debug
log4j.logger.org.sitemesh=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
二、los4j.xml (可以做到只打印debug而不打印级别高于debug的,并且输出为各自也可以控制,关掉传播机制即可,然而log4j.properties不可以 只能打印自身往后靠,输出为各自)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- xml比properties日志文件的优势:① 能够更细粒度打印级别(只打印debug) ② 停止控制单元的传播机制避免多个输出源的同时打印 -->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="logConsole" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %5p (%C:%M) - %m%n" />
</layout>
<!-- ① 级别范围过滤器 properties文件不具备的功能 可以控制到只打印debug levelMin和levelMax都配置成debug即可-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="debug" /> >=debug
<param name="levelMax" value="debug" /> <=debug
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="logFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:\\atguigu4XML.log" />
<param name="Append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %5p (%C{1}:%M) - %m%n" />
</layout>
</appender>
<!-- ② 控制单元 additivity=false 传播机制关闭 com.atguigu.dao下的类打印日志的时候就只有此控制器生效 避免多个输出源多次打印-->
<logger name="com.atguigu.dao" additivity="false">
<level value="info" />
<appender-ref ref="log.console" />
<appender-ref ref="log.file" />
</logger>
<logger name="com.atguigu" additivity="false">
<level value="debug" />
<appender-ref ref="log.console" />
<appender-ref ref="log.file" />
</logger>
<root>
<level value="error" />
<appender-ref ref="logConsole" />
<appender-ref ref="logFile" />
</root>
</log4j:configuration>
当log4j.properties和log4j.xml两个文件共存的时候 log4j.properties将不起作用