log4j尝鲜

log4j尝鲜,第1张

log4j尝鲜 log4j介绍

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.(ECIPwithCLS.java:47): unreadTagNum = 12
由"log4j.additivity.org.apache=true"到log4j的继承结构
# 它是 子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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存