Log4j教程

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中进行输出。

 

posted @ 2017-09-14 16:11  Shadowplay  阅读(390)  评论(0编辑  收藏  举报