Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接 口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。
(1)日志信息的优先级从高到低有ERROR、 WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;
(2)日志信息的输出目的地(appender)指定了日志将打印到控制台还是文件中;
语法:
log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1
… log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(3)日志的输出格式/布局(layout)则控制了日志信息如何显示。
语法:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1
… log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
下载和导入下载zip包(不是bin.tar.gz包),将log4j-1.2.17.jar包导入文件
配置配置麻烦,但配置好后使用简单
# 配置根logger 语法:log4j.rootLogger = [ level ] , appenderName, appenderName, … log4j.rootLogger = Debug,console,dailyFile,im # 它是 子Logger 是否继承 父Logger 的 输出源(appender)的标志位;若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。 log4j.additivity.org.apache=true # 控制台(console) log4j.appender.console=org.apache.log4j.ConsoleAppender # rolling file appender选项 #指定日志信息的最低输出级别,默认为DEBUG log4j.appender.console.Threshold=DEBUG # 表示所有消息都会被立即输出,默认为true lof4j.appender.console.ImmediateFlush=true # consoleAppender选项,默认为System.out log4j.appender.console.Target=System.out # layouts, 可以灵活的指定布局模式 log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 日志文件(logfile) log4j.appender.logFile=org.apache.log4j.FileAppender log4j.appender.logFile.Threshold=Debug log4j.appender.logFile.ImmediateFlush=true #日志追加到前面的日志下面,不回覆盖先前的日志文件,而为false时,会覆盖先前的日志文件 log4j.appender.logFile.Append=true #怎么调用系统变量用相对路径?? log4j.appender.logFile.File=~/Desktop/2021autumn_semester/RFID/CIP/src/logs.txt log4j.appender.logFile.layout=org.apache.log4j.PatternLayout log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 回滚文件(rollingFile) log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender log4j.appender.rollingFile.Threshold=DEBUG log4j.appender.rollingFile.ImmediateFlush=true log4j.appender.rollingFile.Append=true log4j.appender.rollingFile.File=logs.txt log4j.appender.rollingFile.MaxFileSize=200KB log4j.appender.rollingFile.MaxBackupIndex=50 log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 定期回滚日志文件(dailyFile) log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.dailyFile.Threshold=DEBUG log4j.appender.dailyFile.ImmediateFlush=true log4j.appender.dailyFile.Append=true log4j.appender.dailyFile.File=logs.txt log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 应用于socket log4j.appender.socket=org.apache.log4j.RollingFileAppender log4j.appender.socket.RemoteHost=localhost log4j.appender.socket.Port=5001 # HTMLLayout选项,输出java文件名称和行号,默认为false log4j.appender.socket.LocationInfo=true使用
// 1.得到记录器 import org.apache.log4j.Logger; public static Logger logger = Logger.getLogger("ecip"); //2.使用 // 记录debug级别的信息 logger.debug(" This is a debug message"); // 记录info级别的信息 logger.info(" This is a info message"); // 记录debug级别的信息 logger.error(" This is a error message");结果示例
[DEBUG] 2021-11-24 23:35:51,756(6) --> [main] ECIP.ECIPwithCLS.由"log4j.additivity.org.apache=true"到log4j的继承结构(ECIPwithCLS.java:47): unreadTagNum = 12
# 它是 子Logger 是否继承 父Logger 的 输出源(appender)的标志位;若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。 log4j.additivity.org.apache=true
log4j的继承结构是怎样的呢?
所有logger都继承自这个rootLooger,通过调节log4j.additivity.org.apache=false可以使不同类的日志输出到不同输出目的地
例子:
# rootLogger can print DEBUG to console log4j.rootLogger = debug,console ... # A.java is special, we use a individual appender for it # use full qualified name log4j.logger.package_name.class_name=debug,testA log4j.appender.testA = org.apache.log4j.FileAppender ...
现在我们可以介绍下logger的继承关系了,比如我们上面的类aty.log.service.A中使用了logger来写日志。那么log4j会先查找名称是"aty.log.service.A"的logger,如果没有找到,向上查找名称是"aty.log.service"的logger,如果还没有找到那么继续向上查找,查找的最顶层就是rootLogger。这就是log4j中logger的继承关系。rootLogger一定要在配置,其他特定类或者特定包的logger可以不用配置。知道了这个继承特性之后,如果我们要aty.log.dao包下所有的类都打印到同一个日志文件,那么可以进行如下配置。
进一步解释log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n类比c语言的格式化
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名(%m: method)、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
由此可见log4j强大的自定义能力
参考:简书:https://www.jianshu.com/p/ccafda45bcea
知乎:https://zhuanlan.zhihu.com/p/39869648
csdn:https://blog.csdn.net/aitangyong/article/details/50392227
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)