概念
什么是日志
日志是系统运行过程中的后台输出信息,方便程序员进行系统运行的管控以及Bug的查找。
log4j2的概念
log4j2是一个日志输出的插件,专门用来进行日志的管理。
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Log4j2是Log4j的升级版。
log4j2的优势
- 日志可以单独保存在文件中
- 可以获取完整的日志信息
- 可以进行日志显示的筛选
- 格式友好
log4j2的使用流程
导入log4j2的jar包
1、下载压缩包(下载地址:https://logging.apache.org/log4j/2.x/download.html)
2、解压压缩包,并向项目导入两个jar包
3、将jar包添加到配置环境中
配置log4j2的配置文件
1.配置文件名称及存放路径。
log4j 2.x版本不再支持.properties后缀的文件配置方式。2.x版本的配置文件后缀只能是“.xml”,".json"或者“.jsn”。
log4j2的配置文件必须放置在classpath(src文件夹)下。
系统选择配置文件的优先级(从前到后):
- log4j2-test.json 或者log4j2-test.jsn文件
- log4j2-test.xml 文件
- log4j2.json 或者 log4j2.jsn 文件
- log4j2.xml 文件
2.配置文件内容
(1)根节点 Configuration 有两个属性:status、monitorinterval,有两个子节点:Appenders(输出端)、Loggers(日志记录器)。
status:用来指定log4j本身的级别。
monitorinterval:用来指定自动重新读取配置文件的间隔时间,单位是s。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Appenders> </Appenders>
<Loggers> </Loggers>
</Configuration>
(2) Appenders节点(输出端),用来指定日志输出到那个位置,常见的有三种子节点 Console、RollingFile、File
Console节点 将日志输出到控制台
属性:name:取名字。
target:SYSTEM_OUT 或 SYSTEM_ERR 表示输出到控制台
节点:PatternLayout:输出格式,不设置默认为:%m%n
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
File节点 将日志输出到文件
属性:name:取名字。
fileName:指定输出日志的接收文件。
append:false或true。表示是否追加
节点:PatternLayout:输出格式,不设置默认为:%m%n
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
RollingFile节点 将日志输出到文件,并指定文件大小,如果超过文件大小,则自动将文件改名,并产生新的日志文件
属性:name:取名字。
fileName:指定输出日志的接收文件
filePattern:当文件达到最大时,指定新建日志的名称格式
节点:ThresholdFilter:指定输出级别
PatternLayout:输出格式,不设置默认为:%m%n
Policies:
SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,interval属性用来指定多久滚动一次
DefaultRolloverStrategy 指定最多保存的文件个数
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
(3) Loggers节点(日志记录器)控制日志的输出级别与日志是否输出,只有定义了logger并引入的appender,appender才会生效。
logger节点 单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
属性:name:指定logger所适用的类
level:指定日志等级
节点:AppenderRef:用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
root节点:用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
<Loggers>
<Logger name="com.shangyang" level="DEBUG"/>
<Root level="ERROR">
<AppenderRef ref="STDOUT">
</Root>
</Loggers>
3.log4j2的日志级别(从低到高)
All:最低级别,打开所有日志记录
Trace:只要程序运行过程,即只要程序运行一条命令,即可输出一条日志
Debug:调试(代码级别)
Info:信息(方法级别)
Warn:警告
Error:异常错误,但不影响程序的继续运行
Fatal:致命的错误,将会导致程序退出
OFF:*别,关闭所有日志
注意:一般只使用5个级别,优先级从低到高为:Debug < Info < Warn < Error < Fatal
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
4.Layout(格式转换器)
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
在使用log4j2的类中声明全局的Logger对象
调用LogManager类的 getLogger() 方法
private static Logger logger = LogManager.getLogger(类名.class);
使用logger对象调用日志方法进行日志输出语句声明
logger.trace("我是trace信息");
logger.debug("我是debug信息");
logger.info("我是info信息");
logger.warn("我是warn信息");
logger.error("我是error信息");
logger.fatal("我是fatal信息");
实例
java代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; public class TestLog {
public static void main(String[] args) {
Hello hello = new Hello();
Hi hi = new Hi();
hello.getHello();
hi.getHi();
}
} class Hello {
private static Logger logger = LogManager.getLogger(Hello.class.getName());
public void getHello() {
logger.trace("我是trace信息");
logger.debug("我是debug信息");
logger.info("我是info信息");
logger.warn("我是warn信息");
logger.error("我是error信息");
logger.fatal("我是fatal信息");
}
} class Hi {
private static Logger logger = LogManager.getLogger(Hi.class);
public void getHi() {
logger.trace("我是trace信息");
logger.debug("我是debug信息");
logger.info("我是info信息");
logger.warn("我是warn信息");
logger.error("我是error信息");
logger.fatal("我是fatal信息");
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
</appenders>
<loggers>
<logger name="com.shangyang.test.Hello" level="info">
</logger>
<root level="error">
<appender-ref ref="Console"/>
<appender-ref ref="log"/>
</root>
</loggers>
</configuration>