log4j2是log4j的最新版,现在已经有很多公司在使用了。log4j2和log4j的优缺点对比,请自行百度。
上一篇笔记讲了关于log4j的使用。这篇笔记主要讲解log4j2的使用。

一、maven依赖的配置

        log4j-core这个依赖加进来就有log4j-core和log4j-api这两个jar包了,一般开发情况下有这两个jar就可以。
但是,笔者发现spring和struts2的日志不输出。网上找了下,发现还需要log4j-web和log4j-jcl这两个jar包,因此一共需要导4个jar包。


下面为maven依赖xml代码

	<!-- 如果采用log4j2的话,需要下面3个依赖 -->
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jcl -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.8.2</version>
</dependency>
19
 
1
    <!-- 如果采用log4j2的话,需要下面3个依赖 -->  
2
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
3
    <dependency>
4
        <groupId>org.apache.logging.log4j</groupId>
5
        <artifactId>log4j-core</artifactId>
6
        <version>2.8.2</version>
7
    </dependency>
8
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->
9
    <dependency>
10
        <groupId>org.apache.logging.log4j</groupId>
11
        <artifactId>log4j-web</artifactId>
12
        <version>2.8.2</version>
13
    </dependency>
14
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jcl -->
15
    <dependency>
16
        <groupId>org.apache.logging.log4j</groupId>
17
        <artifactId>log4j-jcl</artifactId>
18
        <version>2.8.2</version>
19
    </dependency>

二、配置log4j2.xml

        log4j2的配置方式有多种,比如xml、json等。这里用的xml配置,我们需要把log4j2.xml这个文件放到src下。注意这个文件名必须为log4j2.xml。xml配置的方式其实不难,只要会用老版log4j的人都能看懂一点。
        配置的话可以分为2步:
              (1)配置Appenders,就是配置输出端
              (2)配置Loggers,这个就是配置比如指定包的日志级别以及Root的配置。
               注意点:定义好的输出端一定要引用才能生效
      (1)直接贴代码

<?xml version="1.0" encoding="UTF-8"?> 

<!--
status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出。
因此我们直接设置成OFF
-->
<Configuration status="OFF"> <!-- 配置输出端 -->
<Appenders>
<!-- 输出到控制台 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-level]%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" />
</Console> <!-- 输出到文件 -->
<!--
name: 输出端的名字
fileName: 指定当前日志文件的位置和文件名称
filePattern: 指定当发生自动封存日志时,文件的转移和重命名规则
这个filePatten结合下面的TimeBasedTriggeringPolicy一起使用,可以实现控制日志按天生成文件.
自动封存日志的策略可以设置时间策略和文件大小策略(见下面的Policies配置)
时间策略:
文件名_%d{yyyy-MM-dd}_%i.log 这里%d表示自动封存日志的单位是天
如果下面的TimeBasedTriggeringPolicy的interval设为1,
表示每天自动封存日志一次;那么就是一天生成一个文件。
文件大小策略:
如果你设置了SizeBasedTriggeringPolicy的size的话,
超过了这个size就会再生成一个文件,这里的%i用来区分的
%d{yyyy-MM-dd}会自动替代为日期,如2017-06-30
-->
<RollingFile name="RollingFileInfo" fileName="D:/log/tax_info.log"
filePattern="D:/log/%d{yyyy-MM-dd}/tax_info_%d{yyyy-MM-dd}_%i.log">
<!-- 只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<!-- 输出的格式 -->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<!--
Policies:自动封存日志策略,表示日志什么时候应该产生新日志,
可以有时间策略和大小策略等,并且:只有满足一个策略,就好生成一个新的文件。
这里使用的是时间和大小都使用了,每隔1天产生新的日志文件
如果果今天的文件大小到了设定的size,则会新生成一个文件,上面的%i就表示今天的第几个文件
-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="20MB" />
</Policies>
<!--
DefaultRolloverStrategy属性如不设置,
则默认为最多同一文件夹下7个文件,这里设置了20
-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders> <!-- 配置Loggers -->
<Loggers>
<!--
Logger: 用于指定部分包的日志级别
日志级别局部的会覆盖全局的
比如这里hibernate的级别设为debug,而控制台没有设级别,那么控制台会打印debug级别的日志
而输出到文件这个输出端设置了info级别,那么hibernate的debug级别的日志还是看不了。
所以最终输出的级别和输出端设置的级别是有关系的。
name: 包名
level:日志级别
additivity:是否冒泡,既在当前logger的输出端输出日志后
是否需要在父输出端上输出该日志,默认为 true。
如果设为false,则必须配置AppendRef。
-->
<Logger name="org.hibernate" level="debug" additivity="true" /> <!-- 这个root是配置全局日志级别和输出端功能和老版的log4j中根的配置是一样的 -->
<Root level="info">
<!-- 这里引用上面定义的输出端,千万不要漏了。 -->
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFileInfo" />
</Root>
</Loggers> </Configuration>
x
 
1
<?xml version="1.0" encoding="UTF-8"?> 
2
 
3
<!-- 
4
    status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出。
5
    因此我们直接设置成OFF
6
 -->
7
<Configuration status="OFF">
8

9
    <!-- 配置输出端  -->
10
    <Appenders>
11
        <!-- 输出到控制台  -->
12
        <Console name="Console" target="SYSTEM_OUT">
13
            <PatternLayout pattern="[%-level]%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" />
14
        </Console>
15
        
16
        <!-- 输出到文件 -->
17
        <!-- 
18
            name:           输出端的名字
19
            fileName:       指定当前日志文件的位置和文件名称
20
            filePattern:    指定当发生自动封存日志时,文件的转移和重命名规则
21
            这个filePatten结合下面的TimeBasedTriggeringPolicy一起使用,可以实现控制日志按天生成文件.
22
            自动封存日志的策略可以设置时间策略和文件大小策略(见下面的Policies配置)
23
            时间策略:
24
                文件名_%d{yyyy-MM-dd}_%i.log  这里%d表示自动封存日志的单位是天
25
                如果下面的TimeBasedTriggeringPolicy的interval设为1,
26
                表示每天自动封存日志一次;那么就是一天生成一个文件。
27
            文件大小策略:
28
                如果你设置了SizeBasedTriggeringPolicy的size的话,
29
                超过了这个size就会再生成一个文件,这里的%i用来区分的
30
            %d{yyyy-MM-dd}会自动替代为日期,如2017-06-30
31
        -->
32
        <RollingFile name="RollingFileInfo" fileName="D:/log/tax_info.log"
33
            filePattern="D:/log/%d{yyyy-MM-dd}/tax_info_%d{yyyy-MM-dd}_%i.log">
34
            <!-- 只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
35
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
36
            <!-- 输出的格式  -->
37
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
38
            <!-- 
39
                Policies:自动封存日志策略,表示日志什么时候应该产生新日志,
40
                可以有时间策略和大小策略等,并且:只有满足一个策略,就好生成一个新的文件。
41
                这里使用的是时间和大小都使用了,每隔1天产生新的日志文件
42
                如果果今天的文件大小到了设定的size,则会新生成一个文件,上面的%i就表示今天的第几个文件
43
             -->
44
            <Policies>
45
                <TimeBasedTriggeringPolicy  interval="1" />
46
                <SizeBasedTriggeringPolicy  size="20MB" />
47
            </Policies>
48
            <!-- 
49
                DefaultRolloverStrategy属性如不设置,
50
                则默认为最多同一文件夹下7个文件,这里设置了20
51
             -->
52
            <DefaultRolloverStrategy max="20"/>
53
        </RollingFile>
54
    </Appenders>
55

56
    <!-- 配置Loggers  -->
57
    <Loggers>
58
        <!-- 
59
            Logger: 用于指定部分包的日志级别
60
                日志级别局部的会覆盖全局的
61
                比如这里hibernate的级别设为debug,而控制台没有设级别,那么控制台会打印debug级别的日志
62
                而输出到文件这个输出端设置了info级别,那么hibernate的debug级别的日志还是看不了。
63
                所以最终输出的级别和输出端设置的级别是有关系的。
64
            name: 包名
65
            level:日志级别
66
            additivity:是否冒泡,既在当前logger的输出端输出日志后
67
                             是否需要在父输出端上输出该日志,默认为 true。
68
                             如果设为false,则必须配置AppendRef。
69
         -->
70
        <Logger name="org.hibernate" level="debug" additivity="true" />
71
        
72
        <!-- 这个root是配置全局日志级别和输出端功能和老版的log4j中根的配置是一样的 -->
73
        <Root level="info">
74
            <!-- 这里引用上面定义的输出端,千万不要漏了。 -->
75
            <AppenderRef ref="Console" />
76
            <AppenderRef ref="RollingFileInfo" />
77
        </Root>
78
    </Loggers>
79

80
</Configuration>  
   
  (2)这里重点解释下 Logger中的additivity属性
       这个属性在我看了网上好多人的博客上的解释的情况下,最后确定了他的具体作用。
   additivity表示是否需要将当前Logger的日志打印在父级的输出端上,默认是true,即默认在父级输出端上打印。
   这个Logger的父级就是root了。下面进行各种情况的分析。

       <1>. 上文中的Logger没有配置输出端,additivity为true;那么这个Logger的日志是在他父级(root)的输出端输出。
   所以在控制台可以看到debug级别的日志。
       <2>. 如果Logger没有配置输出端,additivity为false;那么他不会在他的父级的输出端输出,所以这个日志就不会输出。
   这会造成配置的这个Logger的包及子包下的所有的日志都不会输出,这个是个很危险的配置。
       <3>. 如果Logger配置在控制台输出,additivity为true;而root的输出端也有控制台,那么这个日志会打印2遍。
       <4>. 如果Logger配置在控制台输出,additivity为false;那么不会在root的输出端输出,这个日志只会打印1遍。

    通过这4种情况的分析:个人认为最佳配置为,Logger不配置输出端,additivity设为true。
        让Logger使用root的输出端输出。这样配置简单,也不会出现不打印或者多打印日志的问题。
         <Logger name="com.test" level="debug" additivity="true" />

    参考链接:http://blog.csdn.net/junshao90/article/details/8364812
        

 (3)生成的日志文件的效果图:
                

三、java代码中使用log4j2打印日志

    public static void main(String[] args) {
Logger logger = LogManager.getLogger(TestSpring.class);
logger.debug("这是debug");
logger.info("这是Info");
logger.error("这是error");
}
 
1
    public static void main(String[] args) {
2
        Logger logger = LogManager.getLogger(TestSpring.class);  
3
        logger.debug("这是debug");
4
        logger.info("这是Info");
5
        logger.error("这是error");
6
    }


 


 

 

 

Log4j2使用笔记的更多相关文章

  1. Log4j2 配置笔记(Eclipse+maven+SpringMVC)

    Log4j2相关介绍可以百度看下,这里只注重配置Log4j2 能够马上跑起来: 1.pom.xml文件中添加Log4j2的相关Maven配置信息 <!-- log4j2 --> <d ...

  2. log4j2的配置文件log4j2.xml笔记

    一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之而来的slf4j整合log4j的配置(使用Slf4j集成Log4j2构建项目日志系统的完美解决方 ...

  3. 笔记:MyBatis 日志显示-log4j2

    在ClassPath路径创建log4j2.xml配置文件,增加如下日志配置: <?xml version="1.0" encoding="UTF-8"?& ...

  4. 学习笔记—log4j2

    概念 什么是日志 日志是系统运行过程中的后台输出信息,方便程序员进行系统运行的管控以及Bug的查找. log4j2的概念 log4j2是一个日志输出的插件,专门用来进行日志的管理. Log4j是Apa ...

  5. log4j2笔记 #04# Appender的三个基本款以及RollingFile的各种示例配置

    粗糙笔记,留着备用. 三个基本款分别是ConsoleAppender.FileAppender(以及他的堂哥RandomAccessFileAppender).RollingFileAppender( ...

  6. log4j2笔记 #02# 启用异步日志

    索引 参考 Making All Loggers Asynchronous 第一步,添加相应的disruptor库 第二步,设置系统属性log4j2.contextSelector 第三步,检验! 参 ...

  7. Spring Boot 笔记 (2) - 使用 log4j2 记日志

    日志框架的选用 Spring 使用的默认日志框架是 logback, 默认情况下会采取默认的 autoconfiguration; 即便想对日志的一些配置进行修改也比较方便, 详细可以参考: Spri ...

  8. log4j2笔记 #03# PatternLayout

    该类的目标是格式化LogEvent并返回(字符串)结果.结果的格式取决于具体的模式字符串(pattern string).这里的模式字符串与c语言中printf函数的转换模式非常相似.模式字符串由“转 ...

  9. log4j2笔记 #01# Architecture

    索引 Architecture Main Components Logger Hierarchy LoggerContext Configuration Logger LoggerConfig Fil ...

随机推荐

  1. loadrunner 11 安装与使用

    注:以下链接均为转载,详细内容请查看原文. 安装教程: https://blog.csdn.net/u010731693/article/details/78986840 使用教程: https:// ...

  2. android 事件反拦截

    有一种方法可以阻止父层的View截获touch事件,就是调用 getParent().requestDisallowInterceptTouchEvent(true);方法.一旦底层View收到tou ...

  3. python:异常处理、自定义异常、断言

    什么是异常: 当程序遭遇某些非正常问题的时候就会抛出异常:比如int()只能处理能转化成int的对象,如果传入一个不能转化的对象就会报错并抛出异常 常用的异常有: ValueError :传入无效的错 ...

  4. 【PAT】B1082 射击比赛(20 分)

    水提水题,直接贴代码啦 #include<cstdio> #include<algorithm> using namespace std; struct ppp{ int id ...

  5. 推荐5款简洁美观的Hexo主题

    2018-11-17 17:15:46 原文地址:http://www.izhongxia.com 以下是 <hexo 主题列表> 中挑选出来一些比较简洁美观的主题(存在个人主观意识,请勿 ...

  6. <项目需求规格说明书> - 福大易宝

    福大易宝-<项目需求规格说明书> 流程 在开会时统一了项目的开发背景,具体功能,然后在同一个工作环境下进行该说明书的编写. 分工 1.李佳铭.杜宏庆共同负责引言和项目描述的内容. 2.刘双 ...

  7. 浅析JAVA中堆内存与栈内存的区别

    Java把内存划分成两种:一种是栈内存,一种是堆内存. 一.栈内存 存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则.     栈内存在函数中定义的“一些基本类型的变量和对象的引用变量”都 ...

  8. ajaxForm和ajaxSubmit 粘贴就可用

    <!--To change this template, choose Tools | Templatesand open the template in the editor.-->&l ...

  9. Linux基础第六课——grep|awk|sort|uniq

    管道符 | 前面的输出作为后面的输入 grep 可以理解为正则表达式 grep [参数] 文件名 -c 打印符合要求的行数 -v 打印不符合要求的行 -n 在输出符合要求的行的同时连同行号一起输出 - ...

  10. java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer

    启动eclipse报错:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer 解决办法: 删除以下文件.metad ...