简单介绍lo4j2
Lo4j2可以在项目中代替System.out,输出信息,更为强大,可以定义不同的信息级别。
gradle项目中增加如下类库:
compile group: 'org.apache.logging.log4j', name: 'log4j-web', version: '2.11.1'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-log4j2', version: '2.2.4.RELEASE'
日志级别
trace<debug<info<warn<error<off。
说明:
级别之间是包含的关系,意思是如果你设置日志级别是trace,则大于等于这个级别的日志都会输出。
- trace: 是追踪,就是程序推进一点,你就可以写个trace输出,所以trace应该会特别多
- debug: 调试,一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就好了么。
- info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。
- warn: 不算错误但是也请注意
- error: 错误信息。用的也比较多。
- off:都不输出,关闭日志。
配置文件,log4j2.xml
log4j2.xml中分为三个部分。
Properties定义变量,Appenders定义输出位置。Loggers定义输出哪个类什么级别的信息到哪个位置。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<!-- 变量 -->
<Properties>
</Properties>
<!-- 日志输出位置 -->
<Appenders>
</Appenders>
<!-- 记录器,哪个包的什么信息级别输出到哪个位置 -->
<Loggers>
</Loggers>
</Configuration>
configuration 有一个** status 属性,这个属性表示 log4j2 本身的日志信息打印级别**。如果把status改为TRACE再执行测试代码,可以看到控制台中打印了一些log4j加载插件、组装logger等调试信息。
先在Properties中定义变量。先举例子。
<property name="log.home" value="${sys:catalina.home}/logs/" />
<property name="prj.name" value="koma_zhe" />
然后在Appenders复制一下网上找到的输出到控制台这个,到这里就可以
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
</Console>
解释:
其中 PatternLayout %d{HH:mm:ss.SSS} 表示输出到毫秒的时间,%t 输出当前线程名称。
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0。
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出。
%msg 日志文本,%n 换行。
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
默认的记录器
需要定义一个默认的记录器,没有定义自己的时候使用默认的。 所有包的debug信息输出到控制台:
<Root level="debug">
<AppenderRef ref="Console" />
</Root>
使用lo4j2 :
//部分代码
import org.slf4j.*;
private final static Logger logger=LoggerFactory.getLogger(HelloWorld.class);
logger.debug("loc is {}",loc.getDisplayName(loc));
注意其中logger中的{}是占位符。同时注意loger 可以输出,更改为info,不再显示。可以自定义一个记录器 <logger name="demo" level="debug"/>
这时候可以输出。
更多设置
增加File输出位置:例如
<File name="File" fileName="${prj.name}.log">
<PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
</File>
发现pattern用多次,这里用的同一个,可以声明为变量
<property name="pattern">
%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n
</property>
使用定义的变量:
<File name="File" fileName="${prj.name}.log">
<PatternLayout pattern="${pattern}" />
</File>
<logger name="demo" level="debug">
<AppenderRef ref="log" />
</logger>
root中也可以输出到这个位置:
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="log"/>
</Root>
一个示例log4j2.xml文件
resources目录下
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn">
<properties>
<!-- ${web:rootDir} ${sys:catalina.home}-->
<property name="log.home" value="${sys:catalina.home}" />
<property name="prj.name">koma_zhe</property>
<property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level-%l{36}-%msg%n</property>
</properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}" />
</Console>
<File name="file" fileName="${log.home}/${prj.name}.log" append="true">
<PatternLayout pattern="${pattern}" />
</File>
<File name="error" fileName="${log.home}/${prj.name}-error.log">
<ThresholdFilter level="error" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="${pattern}" />
</File>
<RollingFile name="rollingFile" fileName="${log.home}/${prj.name}.txt"
filePattern="${log.home}/${prj.name}-%d{yyyyMMdd}-%i.txt">
<PatternLayout pattern="${pattern}" />
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20KB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
</Appenders>
<Loggers>
<logger name="controller" level="debug" additivity="true">
<appender-ref ref="console" />
<appenderRef ref="file" />
<appenderRef ref="error" />
</logger>
<logger name="demo" level="trace" />
<logger name="com.opensymphony.xwork2" level="debug" />
<Root level="info">
<appenderRef ref="rollingFile" />
<appenderRef ref="console" />
<appenderRef ref="file" />
<appenderRef ref="error" />
</Root>
</Loggers>
</configuration>
以下filePattern中.gz,不要也可以,指定创建目录。然后在目录下生成日志文件,不用.gz结尾也可以。其中fileName不能相同,都必须是唯一的。
<RollingFile name="RollingFileError" fileName="${log.home}/${app.name}.txt"
filePattern="${log.home}/$${date:yyyy-MM}/app-%d{yyyyMMdd}-%i.txt.gz">
<PatternLayout pattern="%d - %c [%t] %-5p %c %x %l - %m%n" />
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="200KB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
日志文件的位置
可以给出一个绝对位置,比如'd:\logs'
。或相对路径,比如当前路径的'.'
,tomcat路径的'${sys:catalina.home}'
<File name="file" fileName="${web:rootDir}/jee2017.log" append="true">
${sys:catalina.home}/logs/jee2017.log
使用lombok中的@Slf4j注释
在类前边使用@Slf4j
注释,会自动增加一个Logger log
的静态变量,使用方法同以上。变量名可以自己配置,在java目录下增加lombok.config
文件,内容如下:lombok.log.fieldname=logger