log4j学习
目录:
1、log4j核心组件:
2、log4j.properties文件:
3、conversionPattern中模式转换字符及含义:
4、格式修饰符及含义:
5、FileAppender的配置:
6、日志记录到多个文件:
7、配置文件示例:
8、JAVA代码示例:
1、log4j核心组件:
图1.1 log4j核心组件
(1)Support Objects:支持对象
框架和支持体系的核心对象,其中可选的对象执行不同的重要任务。
A)Level Object:级别对象。
定义记录信息的粒度和优先级。包括八个级别:
l TRACE:指定细粒度比DEBUG更低的信息记录;
l DEBUG:指定细粒度信息事件是应用程序调试信息记录记录;
l INFO:指定能够突出在粗粒度级别的应用程序运行情况信息记录;
l ERROR:错误事件可能仍然允许应用程序继续运行;
l WARN:指定具有潜在危害的情况;
l FATAL:指定非常严重的错误事件,这可能导致应用程序中止;
l ALL:各级包括自定义级别;
l OFF:关闭日志记录。
规则:级别p使用级别q,在记录日志的请求时,如果p >= q 启用。
对于标准级别的关系:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
例如存在如下语句:
①logger.debug("This is the debug message");
②logger.info ("This is the info message");
③logger.trace("This is the trace message");
④logger.error("This is the error message");
⑤logger.fatal("This is the fatal message");
⑥logger.warn("This is the warn message");
若设置了logger.setLevel(Level.DEBUG),则This is the trace message则不输出;
若设置了logger.setLevel(Level.ERROR),则This is the debug message、This is the info message、This is the trace message、This is the warn message都不输出;
若在程序代码中设置了logger.setLevel(Level.INFO),而在log4j.properties配置文件中设置了log4j.rootLogger=ERROR, file,则以程序代码中设置的INFO级别为基准。
B)LogManager:日志管理器。
负责从一个系统级的配置文件或配置类读取初始配置参数。
C)Filter Object:过滤对象
分析日志信息及是否应该记录信息做出进一步决定。一个Appender Object可以有好几个与之关联的Filter Object。如果日志记录信息传递到特定Appender Object,都和特定的Appender相关的Filter Object批准的日志信息,然后才能发布到所连接的目的地。
D)Object Renderer:对象渲染器
一个指定提供传递到日志框架的不同对象的字符串表示。这个对象所使用的Layout Object来准备最后的日志信息。
(2)Core Objects:核心对象
框架的强制对象,决定框架的使用。
A)Appender Object:附加器对象
负责输出日志信息到不同的地方,如数据库,文件,控制台,Unix系统日志等。
常用的类如下:
l org.apache.log4j.ConsoleAppender:控制台
l org.apache.log4j.FileAppender:文件
l org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件
l org.apache.log4j.RollingFileAppender:文件大小到达指定尺寸的时候产生一个新的文件
l org.apache.log4j.WriterAppender:将日志信息以流格式发送到任意指定的地方
配置模式:
l log4j.appender.appenderName = className
l log4j.appender.appenderName.Option1 = value1
l log4j.appender.appenderName.Option2 = value2
l log4j.appender.appenderName.OptionN = valueN
每个Appender对象有与之相关联的不同的属性,这些属性表明对象的行为:
l layout:Appender使用Layout Object和与之相关的格式化的日志记录信息转换模式来记录日志;
l target:目标可以是一个控制台,一个文件,或根据附加器的另一个项目
l level :级别是必需的,以控制日志消息的过滤
l threshold:Appender可以有与之独立的记录器级别相关联的级别阈值水平。Appender忽略具有级别低于阈级别的任何日志消息
l filter :Filter对象可以分析超出级别的匹配记录信息,并决定是否记录的请求应该由一个特定 Appender 或忽略处理
B)Layout Object:布局对象
格式化不同风格的日志信息的对象。布局层提供支持Appender Object到发布日志的信息之前。
Apache log4j提供了各种布局对象,每一个对象都可以根据各种布局格式记录数据。布局对象检索来自Logging Event的消息参数,并使用适当的Object Renderer获得消息的字符串表示。
顶级抽象类Layout的子类包括:
l DateLayout
l HTMLLayout
l PatternLayout
l SimpleLayout
l XMLLayout
配置模式:
l log4j.appender.appenderName.layout =className
l log4j.appender.appenderName.layout.Option1 = value1
l log4j.appender.appenderName.layout.Option1 = value2
l log4j.appender.appenderName.layout.OptionN = valueN
C)Logger Object:记录器对象
顶级层的Logger,它提供Logger对象。Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。
例如:private static Logger logger = Logger.getLogger(Test1.class.getName());
2、log4j.properties文件:
(1)介绍:log4j.properties文件是一个键-值对保存log4j配置的属性文件。默认情况下,日志管理器在classpath查找一个名为log4j.properties的文件。
(2)语法:
①根日志记录器的级别定义为OFF,DEBUG,INFO,ERROR,WARN,FATAL和ALL之中的一个或多个,并连接附加器命名为X到它;
②设置名为X的附加目的地是一个有效的appender;
③设置布局的附加器X。
# Define the root logger with appender X
log4j.rootLogger = level, appenderX
# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender
# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%-5p] --> %F(%L): %m %x %n
3、conversionPattern中模式转换字符及含义:
l c:category,用于输出的记录事件的类别。如,对于类别名称"com.remoa.Test1" ,%c{2} 会输出 "remoa.Test1"
l C:用于输出完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass".
l d:输出日期时间。。例如, %d{HH:mm:ss,SSS} 或 %d{yyyy-MM-dd HH:mm:ss,SSS}
l F:用于输出被发出日志记录请求的文件名,带.java后缀及包名称
l l:记录发生位置的详细描述,包括方法名、文件名及行号
l L:用于输出从被发出日志记录请求的行号
l m:输出记录事件的消息内容
l M:用于输出发出日志请求所在的方法名称
l n:输出平台相关的行分隔符或文字
l p:输出记录事件的级别,比如输出INFO,WARN
l r:用于输出毫秒从布局的结构经过直到创建日志记录事件的数目
l t:用于输出生成的日志记录事件的线程的名称,比如在main方法中,将输出main
l x:用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文)
l X:在X转换字符后面是键为的MDC。例如 X{clientIP} 将打印存储在MDC对键clientIP的信息
l %:文字百分号,%%将打印%标志
4、格式修饰符及含义:
%-5p:用空格右垫,如果事件级别的名称少于5个字符
%20c:用空格左垫,如果类别名称少于20个字符
%.30c:指定输出类别的名称,最大的长度是30,如果类别的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
%20.30c:指定输出类别的名称,最大的长度是30,如果类别的名称长度大于30的话,就会将左边多出的字符截掉,但大于20小于30的话也不会补空格。小于20的话,用空格左垫。
5、FileAppender的配置:
l immediateFlush:标志的默认设置为true,这意味着输出流的文件被刷新,在每个追加操作
l encoding:它可以使用任何字符编码。默认情况下是特定于平台的编码方案
l threshold:这个 appender 阈值级别
l Filename :日志文件的名称
l fileAppend:默认设置为true,这意味着记录的信息被附加到同一文件的末尾
l bufferedIO:此标志表示是否需要写入缓存启用。默认设置为false
l bufferSize:如果 bufferedI/O 启用,这表示缓冲区的大小,默认设置为8KB
6、日志记录到多个文件:
(1)RollingFileAppender:按大小备份
l maxFileSize:上述的文件的回滚临界尺寸。默认值是10MB
l maxBackupIndex:此属性表示要创建的备份文件的数量。默认值是1
(2)DailyRollingFileAppender:按日备份
l DatePattern:表示在滚动的文件,并按命名惯例来执行。默认情况下,在每天午夜滚动。其描述如下:
l '.' yyyy-MM:滚动在每个月的结束和下一个月初
l '.' yyyy-MM-dd:这是默认值,每天午夜滚动
l '.' yyyy-MM-dd-a:滚动每一天的午夜和中午
l '.' yyyy-MM-dd-HH:滚动在每一个小时
l '.' yyyy-MM-dd-HH-mm :滚动在每一个分钟
l '.' yyyy-ww:滚动每个星期取决于区域设置时的第一天
示例:
log4j.rootLogger = DEBUG, FILE
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=${log}/log.out
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=true
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-a
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
7、配置文件示例:
logpath=D:/logs
log4j.rootLogger=ERROR, console, file
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.ImmediateFlush = true
log4j.appender.console.Target = System.err
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss} [%-5p] --> %F(%L): %m %x %n
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=${logpath}/log.out
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.Encoding=UTF-8
log4j.appender.file.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%C{2}] [%p %L] [%t] %m [ %x] %n
8、JAVA代码示例:
导入依赖包:
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
图8.1 代码示例