一、下载、导入、配置
log4j2是Apache公司开发的插件,用于控制、输出log信息等。log4j2是log4j 1.x 的升级版,2015年5月,Apache宣布log4j1.x 停止更新。
下载地址:http://logging.apache.org/log4j/2.x/download.html
下载下来的文件:apache-log4j-2.13.3-bin.zip
1、将解压出来的log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar引用到项目中。
2、在项目的src类目录下新建一个配置文件:右键src -> New -> Other -> General -> File,文件名一定要是:log4j2.xml 否则会找不到相关配置路径,到时候打印日志就只能使用内置的配置形式了。
3、配置好后,在函数中声明
Logger logger = LogManager.getLogger(LogManage.class.getName());
即可调用:
logger.debug(“输出的内容”);
二、配置文件详解
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 对配置状态进行关闭,不把打印的细节在控制台中输出 -->
<!-- 该配置状态分为8个级别:从高到低:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL -->
<Configuration status="OFF">
<Appenders>
<!-- 在控制台打印日志 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>
</Console>
<!-- 日志输出分为6个级别:从高到低:FATAL、ERROR、WARN、INFO、DEBUG、TRACE -->
<!-- Debug调试级别 -->
<!-- 这里根据你的个人习惯来写就好了,不细分的话写一个File就好了 -->
<!-- 输出日志文件,位置自动保存在项目根目录下的logs文件夹中 -->
<File name="MyDebugFile" fileName="logs/debug.log">
<!-- 我这么写是为了把不同级别的日志筛选开来,便于查看 -->
<!-- Filter过滤器,以此设置日志级别,进行不同程度的日志区分,如果不这样细分,可把Filter去掉 -->
<!-- 比如这样设置:<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> -->
<Filters>
<!-- 第一步 onMatch="DENY":匹配到info及更高级别就DENY过滤掉,其他的NEUTRAL保留 -->
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- 第二步 onMatch="ACCEPT":匹配到debug及更高级别就ACCEPT保留,其他的DENY过滤掉 -->
<!-- 经过两步过滤,把debug以上的和以下的级别全部过滤,最终剩下debug级别 -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!-- 对打印语句的格式进行设置。格式注释见下文 -->
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>
</File>
<!-- Info信息级别 -->
<File name="MyInfoFile" fileName="logs/info.log">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>
</File>
<!-- Warn警告级别 -->
<File name="MyWarnFile" fileName="logs/warn.log">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>
</File>
<!-- Error错误级别 -->
<File name="MyErrorFile" fileName="logs/error.log">
<Filters>
<ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>
</File>
<!-- Fatal严重错误级别 -->
<File name="MyFatalFile" fileName="logs/fatal.log">
<ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"/>
</File>
<!-- 这个文件会打印出所有信息。append属性为true表示消息追加到指定文件中,false表示消息覆盖文件内容,默认值是true -->
<File name="log" fileName="D:/logs/log4j2.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 此项可配置按日期或按日志大小进行滚动存档。 -->
<RollingFile name="taoge" fileName="logs/taoge.log" filePattern="logs/taoge.%d{yyyy-MM-dd}.log" append="true">
<!-- 输出格式 -->
<PatternLayout pattern="[%l] [%t] [%-4r] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p] \: %m%n"/>
<!-- 设置策略 -->
<Policies>
<!-- 基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:
interval:integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟
modulate:boolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。
比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00 -->
<!-- 每1天更新一次,此处查阅网上和官方示例中,都是以小时出现,我测试是以天为单位。(官方文档中说明按item类型是否是小时,但没找到在哪里设置item类型)另有其他各类型策略,请参阅官方文档 -->
<!-- TimeBasedTriggeringPolicy需要和filePattern配套使用,由于filePattern配置的时间最小粒度是dd天,所以表示每一天新建一个文件保存日志。SizeBasedTriggeringPolicy表示当文件大小大于指定size时,生成新的文件保存日志。 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!-- 此项可配置定期删除,最多备份30天以内的日志,此处为策略限制,Delete中可以按自己需要用正则表达式编写 -->
<!-- DefaultRolloverStrategy字段中加入max=“30”经测试是配合SizeBasedTriggeringPolicy限制%i的存在数量,并没有发现是网上流传的是最多保存多少个文件的限制,也或许是我写的有问题 -->
<DefaultRolloverStrategy>
<Delete basePath="x:/xxxx" maxDepth="1">
<IfFileName glob="logs_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!-- 定义Loggers,只有定义了Loggers并引入刚才的appender配置,配置才会生效 -->
<Loggers>
<Root level="trace">
<!-- Only events at DIAG level or more specific are sent to the console. -->
<AppenderRef ref="Console"/>
<AppenderRef ref="MyDebugFile"/>
<AppenderRef ref="MyInfoFile"/>
<AppenderRef ref="MyWarnFile"/>
<AppenderRef ref="MyErrorFile"/>
<AppenderRef ref="MyFatalFile"/>
</Root>
</Loggers>
</Configuration>
日志输出格式设置:%d{yyy-MM-dd HH:mm:ss.SSS} %-6level [%t] (%F:%L) - %msg%n"
格式一览表:
%d: 输出日志发生时间,可进行格式{yyy-MM-dd HH:mm:ss.SSS}设置,也可不用
%-6level: 输出的级别信息右对齐,总长度为6字符;正数为左对齐,看个人习惯
%t: 输出产生该日志事件的线程名
%F: 输出日志信息所属的类的类名
%l: 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%msg: 输出日志信息
%n: 换行
%c: 输出日志信息所属的类的全名
%c: 输出自应用启动到输出该日志信息所耗费的毫秒数
三、配置节点说明
1、 Configuration:每一个 LoggerContext 都有一个有效的 Configuration, Configuration 包含所有的Appender 、Filter、LoggerConfig ,StrSubstitutor引用和对Layout的格式设置。有两个属性:
status用来指定log4j本身的打印日志的级别.
monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
2、 子节点Appender:Log4j2 还允许将记录请求输出到多个目标中,而这种输出目标被称为Appender。目前Appender的类型有控制台、文件、socket、Apache Flume、JMS、远程UNIX 系统日志守护进程以及各种数据库API,用户可以根据需要选择将日志输出到不同的目标上,同时在一个Logger的配置中,允许开启多个Appender。
常见的有三种子节点:Console、RollingFile、File.
Console节点用来定义输出到控制台的Appender.
name:指定Appender的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
PatternLayout:输出格式,不设置默认为:%m%n.
File节点用来定义输出到指定位置的文件的Appender.
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
PatternLayout:输出格式,不设置默认为:%m%n.
RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
PatternLayout:输出格式,不设置默认为:%m%n.
filePattern:指定新建日志文件的名称格式.
Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
3、 子节点Logger : Logger继承自 AbstractLogger,当配置被修改后,它将与不同的 LoggerConfig 相关联,这导致其行为也被改变。
常见的有两种:Root和Logger.
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
level:日志输出级别.
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
level:日志输出级别
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
4、 LoggerConfig:LoggerConfig 对象在 Logger 被声明时创建,它包含了一组用于处理事件的Appender引用,以及一组用于过滤传递给Appender事件的Filter,相当于是Appender的集合。
5、 Filter :Log4j2 提供了Filter 来过滤消息事件,它可被应用于事件传递给LoggerConfig之前,及传递给LoggerConfig之后,即LoggerConfig的前后置拦截器。
Filter包含了三种行为:Accept,Deny或Neutral,其中Accept,Deny分别代表着接受和拒绝,即过滤器接受或拒绝某种日志过滤表达式等,经过这两种行为处理后将不再经过其他过滤器。
Neutral代表着中立,意味着事件应由其他Filter来处理。如果未配置任何Filter,那么事件将直接被处理。
6、 Layout:Log4j2除了可以输出到不同的目标Appender之外,还支持在目标中定义自定义的日志格式,Layout 负责对日志事件进行格式化,通过配置PatternLayout来实现。
7、 StrSubstitutor和StrLookup:这两个组件用来对Log4j2中的各项配置进行动态变量赋值。
8、 日志级别:LoggerConfig会被分配一个日志级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
All:最低等级的,用于打开所有日志记录.
Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
Info:消息在粗粒度级别上突出强调应用程序的运行过程.
Warn:输出警告及warn以下级别的日志.
Error:输出错误信息日志.
Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
OFF:最高等级的,用于关闭所有日志记录.
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
四、log4j2在Tomcat项目中的使用
log4j2的jar包:
log4j-core-2.3.jar
log4j-api-2.3.jar
log4j-1.2-api-2.3.jar
都放到 tomact 目录下的lib文件夹下,将log4j2.xml也放到tomcat目录下lib文件夹下,然后删除或重命名tomact目录下conf文件夹下的logging.properties文件。重新启动Tomcat,则可以正常输出log。
否则,如果只在Java项目中引用并import相应的jar包,在本地调试可以正常输出log,但部署到Tomcat服务器上去运行的时候就会没有log输出。
————————————————————————————
参考链接
https://blog.csdn.net/weixin_44174530/article/details/103889260
https://blog.csdn.net/z69183787/article/details/53584648
https://blog.csdn.net/liangyue1994/article/details/98853231
https://blog.csdn.net/tutian2000/article/details/81903924
谢谢!