Log4j教程
一、快速上手
log4j把日志分为:all,trace,debug,info,warnig,error,fital,off等几个级别。级别高的会屏蔽级别的的信息。
1)maven导入jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.tang.logtest</groupId>
<artifactId>logtest</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.13</version>
<scope>runtime</scope>
</dependency> <!--核心log4j2jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.4.1</version>
</dependency> <!--用于与slf4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.4.1</version>
</dependency> <!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.4.1</version>
<scope>runtime</scope>
</dependency> <!--需要使用log4j2的AsyncLogger需要包含disruptor-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies> <build>
<finalName>log4j-test</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2)classpath下的配置文件log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</appenders>
<loggers>
<logger name="com.tang.test.Log4jTest" level="trace" additivity="false">
<appender-ref ref="Console"/>
</logger>
<root level="error">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
3)java文件
package com.tang.test; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.LoggerFactory; /**
* @author Tang Jiujia
* @since 2017-09-14
*/
public class Log4jTest { public static Logger logger= LogManager.getLogger(Log4jTest.class); public static void main(String[] args){
// 使用slf4j的代码 Logger logger = LoggerFactory.getLogger(Log4jTest.class);
// slf4j只是一个门面(facet),它不包含具体的实现,而是将一些log4j,java.logging等实现包装成统一的接口。
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息"); try{
String str=null;
str.length();
}catch (Exception e){
logger.debug("debug 一个异常!",e);
logger.fatal("一个致命的错误",e);
}
}
}
16:03:59.825 [main] TRACE com.tang.test.Log4jTest - trace 信息
16:03:59.825 [main] DEBUG com.tang.test.Log4jTest - debug 信息
16:03:59.825 [main] INFO com.tang.test.Log4jTest - info 信息
16:03:59.825 [main] WARN com.tang.test.Log4jTest - warn 信息
16:03:59.825 [main] ERROR com.tang.test.Log4jTest - error 信息
16:03:59.826 [main] FATAL com.tang.test.Log4jTest - fatal 信息
16:03:59.826 [main] DEBUG com.tang.test.Log4jTest - debug 一个异常!
java.lang.NullPointerException
at com.tang.test.Log4jTest.main(Log4jTest.java:27) [classes/:?]
16:03:59.829 [main] FATAL com.tang.test.Log4jTest - 一个致命的错误
java.lang.NullPointerException
at com.tang.test.Log4jTest.main(Log4jTest.java:27) [classes/:?]
Process finished with exit code 0
二、日志记录器(Logger)
Logger负责记录日志。
public static Logger logger= LogManager.getLogger(Log4jTest.class);
Logger是有名字的,它的名字便是getlogger方法的参数(实际上为具体的类名)。
Logger为单态模式:相同名字的Logger只有一个实例。
Log4j中有一个跟记录器rootLogger,它是所有Logger的父亲。
如果对某个Logger进行特殊的输出,覆盖父配置即可。
三、配置详解
(1).根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(可以定义多个Appender和Logger).
status用来指定log4j本身的打印日志的级别.
monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
(2).Appenders节点,常见的有三种子节点: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).Loggers节点,常见的有两种:Root和Logger.
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
level:日志输出级别
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。