Log4j教程
一、快速上手
log4j把日志分为:all,trace,debug,info,warnig,error,fital,off等几个级别。级别高的会屏蔽级别的的信息。
1)maven导入jar包
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.tang.logtest</groupId> 8 <artifactId>logtest</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>org.slf4j</groupId> 14 <artifactId>slf4j-api</artifactId> 15 <version>1.7.13</version> 16 </dependency> 17 18 <dependency> 19 <groupId>org.slf4j</groupId> 20 <artifactId>jcl-over-slf4j</artifactId> 21 <version>1.7.13</version> 22 <scope>runtime</scope> 23 </dependency> 24 25 <!--核心log4j2jar包--> 26 <dependency> 27 <groupId>org.apache.logging.log4j</groupId> 28 <artifactId>log4j-api</artifactId> 29 <version>2.4.1</version> 30 </dependency> 31 <dependency> 32 <groupId>org.apache.logging.log4j</groupId> 33 <artifactId>log4j-core</artifactId> 34 <version>2.4.1</version> 35 </dependency> 36 37 <!--用于与slf4j保持桥接--> 38 <dependency> 39 <groupId>org.apache.logging.log4j</groupId> 40 <artifactId>log4j-slf4j-impl</artifactId> 41 <version>2.4.1</version> 42 </dependency> 43 44 <!--web工程需要包含log4j-web,非web工程不需要--> 45 <dependency> 46 <groupId>org.apache.logging.log4j</groupId> 47 <artifactId>log4j-web</artifactId> 48 <version>2.4.1</version> 49 <scope>runtime</scope> 50 </dependency> 51 52 <!--需要使用log4j2的AsyncLogger需要包含disruptor--> 53 <dependency> 54 <groupId>com.lmax</groupId> 55 <artifactId>disruptor</artifactId> 56 <version>3.2.0</version> 57 </dependency> 58 </dependencies> 59 60 <build> 61 <finalName>log4j-test</finalName> 62 <plugins> 63 <plugin> 64 <artifactId>maven-compiler-plugin</artifactId> 65 <version>3.1</version> 66 <configuration> 67 <source>1.8</source> 68 <target>1.8</target> 69 </configuration> 70 </plugin> 71 </plugins> 72 </build> 73 </project>
2)classpath下的配置文件log4j2.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration status="OFF"> 3 <appenders> 4 <Console name="Console" target="SYSTEM_OUT"> 5 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 6 </Console> 7 </appenders> 8 <loggers> 9 <logger name="com.tang.test.Log4jTest" level="trace" additivity="false"> 10 <appender-ref ref="Console"/> 11 </logger> 12 <root level="error"> 13 <appender-ref ref="Console"/> 14 </root> 15 </loggers> 16 </configuration>
3)java文件
1 package com.tang.test; 2 3 import org.apache.logging.log4j.LogManager; 4 import org.apache.logging.log4j.Logger; 5 import org.slf4j.LoggerFactory; 6 7 /** 8 * @author Tang Jiujia 9 * @since 2017-09-14 10 */ 11 public class Log4jTest { 12 13 public static Logger logger= LogManager.getLogger(Log4jTest.class); 14 15 public static void main(String[] args){ 16 // 使用slf4j的代码 Logger logger = LoggerFactory.getLogger(Log4jTest.class); 17 // slf4j只是一个门面(facet),它不包含具体的实现,而是将一些log4j,java.logging等实现包装成统一的接口。 18 logger.trace("trace 信息"); 19 logger.debug("debug 信息"); 20 logger.info("info 信息"); 21 logger.warn("warn 信息"); 22 logger.error("error 信息"); 23 logger.fatal("fatal 信息"); 24 25 try{ 26 String str=null; 27 str.length(); 28 }catch (Exception e){ 29 logger.debug("debug 一个异常!",e); 30 logger.fatal("一个致命的错误",e); 31 } 32 } 33 }
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中进行输出。