log4j2的配置以及代码实现
1.log4j2需要的jar包
地址1:http://logging.apache.org/
地址2:http://people.apache.org/~rgoers/log4j2/download.html
1.1 Apache Log4j的Project site
1.2 点击Download
1.3 点击che-log4j-2.13.3-bin.zip,解压即可
2.log4j2的依赖
<properties>
<log4j.version>2.5</log4j.version>
</properties>
<dependencies>
<!--引入log4j2必要的依赖(log4j-api、log4j-core)-->
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
3.log4j2的前奏须知
log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件
后缀名只能为".xml",".json"或者".jsn"。
配置文件的格式:log4j配置文件可以是xml格式的,也可以是json格式的。
配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件。
系统选择配置文件的优先级(从先到后)如下:
1 classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
2 classpath下的名为log4j2-test.xml的文件.`
3 classpath下名为log4j2.json 或者log4j2.jsn的文件.
4 classpath下名为log4j2.xml的文件.
注: 我们一般默认使用log4j2.xml进行命名。
如果本地要测试,可以把log4j2-test.xml放到classpath,
正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。
4.log4j2配置文件节点解析
根节点Configuration
1.有两个属性:status和monitorinterval,
1. status用来指定log4j本身的打印日志的级别.
2. monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
2.有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
1. **Appenders**节点,常见的有三种子节点:Console、RollingFile、File.
1. **Console**节点用来定义输出到控制台的Appender.
name:指定Appender的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
PatternLayout:输出格式,不设置默认为:%m%n.
2. **File**节点用来定义输出到指定位置的文件的Appender.
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
PatternLayout:输出格式,不设置默认为:%m%n.
append:当为true时,会在之前的日志里面续加内容,而不清空
3. **RollingFile**节点用来定义超过指定大小自动删除旧的创建新的的Appender.
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
filePattern:指定新建日志文件的名称格式.
PatternLayout:输出格式,不设置默认为:%m%n.
Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。
modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
2. **Loggers**节点,常见的有两种:Root和Logger.
1. **Root**节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
level:日志输出级别,共有8个级别,见下面注
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
2. **Logger**节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
level:日志输出级别,共有8个级别,见下面注
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,
那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"
只在自定义的Appender中进行输出。
注:关于日志level.共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
1.All:最低等级的,用于打开所有日志记录.
2.Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
3.Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
4.Info:消息在粗粒度级别上突出强调应用程序的运行过程.
5.Warn:输出警告及warn以下级别的日志.
6.Error:输出错误信息日志.
7.Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
8.OFF:最高等级的,用于关闭所有日志记录.
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
5.log4j2.xml的代码
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置, 当设置成trace时,log4j2内部详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,不需要重启服务, 设置间隔秒数,单位是s, 最小是5s-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL-->
<configuration status="info" monitorInterval="10">
<appenders>
<!--这个输出控制台的配置-->
<console name="CONSOLE" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%c{1}-%p %l] %m%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,当设为true时,不会清空-->
<File name="log" fileName="applog/log/raiLway_den.log"
filePattern="applog/log/raiLway_den_%d{yyyy-MM-dd}_%i.log" append="true">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%c{1}-%p %l] %m%n"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<!-- 每次大小超过size,则这size大小的日志会自动存入按yyyy-MM-dd建立.log,作为存档-->
<!-- filePattern 指定新建日志文件的名称格式; -->
<!-- createOnDemand 解决重启tomcat或者java -jar 重新运行应用程序时数据丢失的问题 -->
<RollingFile name="LOGFILE" fileName="applog/logs/raiLway_den.log"
filePattern="applog/logs/raiLway_den_%d{yyyy-MM-dd}_%i.log" createOnDemand="true">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%c{1}-%p %l] %m%n"/>
<!-- Policies指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
<Policies>
<!-- 基于时间的滚动策略,设置每天打包一次 -->
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<!-- 自定义的策略,会不停的往一个里面加,直到满足其余的策略,才更换 -->
<!-- <CronTriggeringPolicy schedule="0 0 * * * ?"/> -->
<!-- 基于指定文件大小的滚动策略,设置日志文件满100MB后打包,,size属性用来定义每个日志文件的大小 -->
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,默认最多7个文件,这里设置10000, 这样才可以达到日志不被删除 -->
<!-- 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的 -->
<!-- 从2.8版本开始,如果fileIndex属性设置为nomax,那么最大和最小值,都将会被忽略掉,文件编号将从1开发增加-->
<!-- 并且每次rollover时递增都从编码最大开始(项目于max效果),而且没有文件数的限制。 -->
<DefaultRolloverStrategy max="10000"/>
</RollingFile>
</appenders>
<!--只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--记录执行的HQL语句 -->
<!-- additivity="false"是为了避免日志在root里再次输出 -->
<Logger name="org.hibernate.hql" level="error" additivity="false">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="LOGFILE" />
</Logger>
<!-- 当解析查询语句时记录HQL和SQL -->
<Logger name="org.hibernate.hql.ast.AST" level="error" additivity="false">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="LOGFILE" />
</Logger>
<!-- 记录与事务有关的活动 -->
<Logger name="org.hibernate.transaction" level="error" additivity="false">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="LOGFILE" />
</Logger>
<!-- 与数据库连接的 -->
<Logger name="org.hibernate.ps.PreparedStatementCache" level="error" additivity="false">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="LOGFILE" />
</Logger>
<!--level是日志记录的优先级 -->
<root level="info">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="LOGFILE"/>
<AppenderRef ref="log"/>
</root>
</loggers>
</configuration>
6.参数解释
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
7.测试代码
package coms;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j2Test {
public static void main(String[] args) {
Logger log = LogManager.getLogger(log4j2Test.class);
for(int i = 1;i < 10000; i++) {
log.trace("这是测试trace" + i);
log.debug("这是测试debug" + i);
log.info("这是测试info" + i);
log.warn("这是测试warn" + i);
log.error("这是测试error" + i);
log.fatal("这是测试fatal" + i);
log.error("这是测试error====" + i);
log.error("这是测试error====" + i);
}
}
}
8.测试结果
备注:开始遇到的问题是让日志不被删除,如果不设置DefaultRolloverStrategy的话,是默认为7,即每天只会保留最新的7份日志,
即使不写DefaultRolloverStrategy也会默认,所以想到的方法是,把max值设置得大点,就变相的做到了不删除日志的要求。
查阅的网址:
log4j2邮箱配置进去:https://blog.csdn.net/shiyong1949/article/details/54666992
log4j2日志删除规则:https://www.cnblogs.com/yeyang/p/7944899.html
多个日志版本对比:https://blog.csdn.net/weixin_44761910/article/details/104112489
如果学武不是为了当武林盟主,那将毫无意义