ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

log4j尝鲜

2021-11-25 07:31:24  阅读:194  来源: 互联网

标签:layout 尝鲜 appender apache org 日志 log4j


lo4j

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.<init>(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包下所有的类都打印到同一个日志文件,那么可以进行如下配置。

参考:简书:https://www.jianshu.com/p/ccafda45bcea
知乎:https://zhuanlan.zhihu.com/p/39869648
csdn:https://blog.csdn.net/aitangyong/article/details/50392227

标签:layout,尝鲜,appender,apache,org,日志,log4j
来源: https://www.cnblogs.com/kirin2003/p/15601132.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有