慢慢来比较快,虚心学技术
前言:Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
一、Log4j基本使用示例
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Log4JTest {
public static void main(String arg[]){
//获取根logger
Logger rootLogger = Logger.getRootLogger();
//获取当前对象为名的logger
Logger logger = Logger.getLogger(Log4JTest.class);
rootLogger.info("root-info");
logger.info("Log4j-INFO");
logger.error("Log4j-ERROR");
logger.debug("Log4j-DEBUG");
rootLogger.debug("root-debug");
logger.warn("Log4j-WARN");
}
}
log4j.properties(与Log4JTest.java同级目录)
#配置rootLogger
log4j.rootLogger=info,appender1,logFile,appender2
#配置第一个appender
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#指定该appender输出所有DEBUG以上的日志
log4j.appender.appender1.Threshold=DEBUG
#选择比较方便的的日志输出格式-包含日志产生的时间、线程、类别等等信息
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
#配置第二个appender
log4j.appender.appender2=org.apache.log4j.ConsoleAppender
#指定该appender输出所有WARN以上的日志
log4j.appender.appender2.Threshold=WARN
#指定该appender通过控制台的err输出日志
log4j.appender.appender2.Target=System.err
#配置该appender的输出格式
log4j.appender.appender2.layout = org.apache.log4j.PatternLayout
#其中 %d表示日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格,
# %l表示输出日志事件的发生位置,包括类目名、发生的线程,以及行数。
# %-5p 输出日志信息优先级,占5个字符
# %m 输出代码中指定的消息,产生的日志具体信息
# %n 输出一个回车换行符
log4j.appender.appender2.layout.ConversionPattern =%d %l %-5p %m %n
log4j.appender.appender2.ImmediateFlush = true
#配置文件输出appender,
log4j.appender.logFile = org.apache.log4j.FileAppender
#配置文件输出样式
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
#指定仅记录ERROR以上级别的日志
log4j.appender.logFile.Threshold = ERROR
log4j.appender.logFile.ImmediateFlush = TRUE
#指定将日志累加到日志文件末尾
log4j.appender.logFile.Append = TRUE
#指定日志文件
log4j.appender.logFile.File = ./Log4J/log/log4j.log
log4j.appender.logFile.Encoding = UTF-8
运行结果如下:
控制台输出:
[main] INFO root - root-info
[main] INFO Log4JTest - Log4j-INFO
[main] ERROR Log4JTest - Log4j-ERROR
2019-01-30 15:22:16,052 Log4JTest.main(Log4JTest.java:13) ERROR Log4j-ERROR
[main] WARN Log4JTest - Log4j-WARN
2019-01-30 15:22:16,054 Log4JTest.main(Log4JTest.java:16) WARN Log4j-WARN
Process finished with exit code 0
log4j.log内容:
[ERROR][2019/01/30 15:22:1652 ][Log4JTest.main(Log4JTest.java:13)]
Log4j-ERROR
二、Log4j使用浅析
log4j类图分析
1.Logger
日志写出器,供程序员输出日志信息 (可控制日志输出级别)
2.Appander
日志目的地,把格式化好的日志信息输出到指定的地方去(指定了日志将打印到控制台还是文件中)
- ConsoleAppender --------------目的地为控制台的 Appender
- FileAppender ---------------------目的地为文件的 Appender
- RollingFileAppender ------------目的地为大小受限的文件的 Appender
3.Layout
日志格式化器,用来把程序员的 logging request 格式化成字符串(控制日志信息的显示格式)
4.log4j.properties
log4j对于程序控制的配置文件,目前支持xml以及java的properties格式
5.log4j日志优先级
ALL < DEBUG < INFO <WARN < ERROR < FATAL < OFF
三、Log4j配置详解(使用properties方式)
虽然我们可以像上一篇文章java日志篇(2)-JUL(java.util.logging)一样在java程序代码中去控制log4j的日志级别和输出样式等参数,但是基于灵活性和可扩展性的需求,我们最好选择在配置文件中设置log4j的基本参数,下面我们了解一下log4j配置文件的基本内容
1.配置根Logger(上述实例中的rootLogger)
语法:log4j.rootLogger = level,appenderName1,appenderName2
其中: leve表示日志优先级别,appenderName1,appenderName2表示配置的一个个appender的名称
示例:log4j.rootLogger=info,appender1,appender2
注:rootLogger是所有logger的超类,在配置文件中对rootLogger的所有属性设置,都会被系统内所有logger所默认继承(包括级别,appender等)
2.配置日志信息输出目的地 Appender
语法:
log4j.appender.appender名 = Log4j 提供的 appender 类
log4j.appender.appender名.属性名 = 属性值
......
log4j.appender.appender名.属性名 = 属性值
其中,上一节中的log4j类图所示,log4j提供的appender类主要有以下用的比较多的几个:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
其中,对应主要几个appender的属性列表如下:
ConsoleAppender:
Threshold=level 指定日志消息的输出最低层次
ImmediateFlush=true/false 所有的消息是否立即输出,默认true
Target=System.err/System.out 指定输出到控制台的形式,默认System.out
FileAppender:
Threshold=同上
ImmediateFlush=同上
File=mylog.txt 指定消息输出到 mylog.txt 文件。
Append=true/false 是否将内容添加到日志文件的末尾,默认为true,false代表覆盖日志文件原有内容
RollingFileAppender:
Threshold=同上
ImmediateFlush=同上
File=同上
Append=同上
MaxFileSize=100KB: 在日志文件到达该大小时,将会自动滚动, 即将原来的内容移到 mylog.log.1 文件。后缀可以是 KB, MB 或者是 GB.
MaxBackupIndex=2 指定可以产生的滚动文件的最大数
DailyRollingFileAppender :
Threshold=同上
ImmediateFlush=同上
File=同上
Append=同上
DatePattern=''.''yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。
*当然也可以指定按月、周、天、时和分。即对应的格式如下: *
*1)''.''yyyy-MM: 每月 *
*2)''.''yyyy-ww: 每周 *
*3)''.''yyyy-MM-dd: 每天 *
*4)''.''yyyy-MM-dd-a: 每天两次 *
*5)''.''yyyy-MM-dd-HH: 每小时 *
*6)''.''yyyy-MM-dd-HH-mm: 每分钟 *
3.配置日志信息的格式(布局)
语法:
log4j.appender.appender名.layout = Log4j 提供的 layout类
log4j.appender.appender名.layout.属性 = 值
。。。。。。。。
log4j.appender.appender名.layout.属性 = 值
其中,log4j提供的layout类主要有以下几个:
org.apache.log4j.HTMLLayout(以 HTML 表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
通用属性
LocationInfo=true/false 是否输出 java 文件名称和行号,默认为false
PatternLayout:
ConversionPattern= %d %l %-5p %m %n 指定输出格式
-X 号: X 信息输出时左对齐;
%p: 输出日志信息优先级,即 DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式, 比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002 年 10 月 18 日 22:10:28,921
%r: 输出自应用启动到输出该 log 信息耗费的毫秒数
%c: 输出日志信息所属的类目,配置文件中的名字,通常就是所在类的全名(若使用 rootLogger)
%t: 输出产生该日志事件的线程名 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及行数。 举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的 NDC(嵌套诊断环境),尤其用到像 java servlets 这样的多客户多线程的应 用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows 平台为"\r\n",Unix 平台为"\n"输出日志信息换行
%M: 输出日志信息所属的方法
所遇问题:
如上述实例中配置,我们得到的输出里面都没有debug日志的内容
查看了日志文件,虽然我把某些appender级别设置为debug级别,依旧没有输出
后经查看原来是因为设置了rootLogger的最低级别为info,其下子logger无法越级输出
解决方案:
1.更改实时logger的级别:
logger.setLevel(Level.DEBUG);
2.更改rootLogger的最低级别
log4j.rootLogger=all,appender1,logFile,appender2
总结
1.通过配置文件log4j.properties或者log4j.xml对程序日志进行控制的方式比JUL更为方便灵活
2.可以通过设置不同的appender和级别控制哪个级别的日志输出到何处,大大增强了日志管理的针对性
注:本文参考文档:log4j 入门、详解 -雪飘零,纯属笔记,多多担待