关闭

Log4j2入门学习

标签: log4jlog4j2pattern日志输出格式
1747人阅读 评论(2) 收藏 举报
分类:



1.准备Log4j2开发环境

下载地址:http://logging.apache.org/log4j/2.x/download.html

下载apache-log4j-××-bin.zip文件,解压后可以看到有*.jar*source.jar以及*doc.jar我们用只取*.jar,因为另外两种是压缩的源代码文件和api文档文件。

2.创建基本测试项目

2.1  创建java web项目

导入我们需要的jar包,这里初步我们只需要log4j-api-2.3.jarlog4j-core-2.3.jar两个jar包,目录结构如下图:

2.2  编写测试类

TestLog4j2.java

package com.mlq.love;

 

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

import com.mlq.love.entity.Log4j2Entity;

 

public class TestLog4j2 {

  private static final Loggerlogger = LogManager.getLogger(TestLog4j2.class);

  

  public static void main(String[] args){

     logger.trace("Appliaction is entering the Log4j2Entity...");

     if(!Log4j2Entity.printTestString()){

        logger.error("Didn`t do it");

     }

     logger.trace("Appliaction is exiting the Log4j2Entity...");

  }

}



 

Log4j2Entity

package com.mlq.love.entity;

 

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

 

public class Log4j2Entity {

  private static final Loggerlogger = LogManager.getLogger(Log4j2Entity.class);

  

  public static boolean printTestString(){

     logger.entry();

     System.out.println("我正在测试使用Log4j2");

     logger.error("Did it again");

     returnlogger.exit(false);

  }

}

 

2.3  执行测试程序

Run as->javaapplication结果如下:

这是因为我们没有指定log4j2的配置文件,系统会用Log4j2自己自带的默认配置,这里就引入了我们学习的新问题,如何配置Log4j2让其按照我们的意愿输出log信息到控制台、文件等

 

3.Log4j2配置

详细的官方文档可以参见http://logging.apache.org/log4j/2.x/manual/configuration.html但是鉴于某些一看英文就头大的同学,这里作下简单介绍。

        概述:Log4j2的配置包含四种方式,其中三种是在程序中直接调用Log4j2的方法进行配置的,还有一种是我们最常用的用文件进行配置,可以是XMLJSONYAML,这里我们用XML为例来详细介绍。

3.1基本配置

        Log4j2会首先根据既定的规则去项目中寻找配置信息,XML文件命名为Log4j2.xml放在classpath中就可以被找到,通常Java web项目放在src根目录就可以被找到。默认的配置如下例所示:

Log4j2.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<Configurationstatus="WARN">

  <Appenders>

     <Consolename="Console"target="SYSTEM_OUT">

        <PatternLayoutpattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -%msg%n"/>

     </Console>

  </Appenders>

  <Loggers>

     <Rootlevel="error">

        <AppenderRefref="Console"/>

     </Root>

  </Loggers>

</Configuration>

 

  当我们把这个文件放到src下,把<Rootlevel="error">改为<Rootlevel="trace">再执行,得如下结果

 

3.2日志级别

【简介】

上面最后看到所有的日志都打印了出来,这里面就涉及到了日志级别(level)的问题,Log4j2把日志打印分为6个级别,级别由低到高分别为trace < debug <info < warn < error < fatal,简单介绍下:

  • trace是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。

  • debug调试么,我一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者ideadebug功能就好了么。

  • info输出一下你感兴趣的或者重要的信息,这个用的最多了。

  • warn有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有errorwarn(不算错误但是也请注意,比如以下depressed的方法)。

  • error错误信息。用的也比较多。

  • fatal级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。

【规则】

<Rootlevel="X">设定级别X,那么大于等于该级别的日志都会输出,例如X=”info”那么infowarnerrorfatal日志会输出,tracedebug则不会输出

 

3.3隔离输出

        当我们想让某个包中的文件使用一个级别,其他的包使用另一个级别时就可以修改配置文件在<Loggers></Loggers>节点中添加<Logger>节点,例如我想让com.mlq.love.entity包中的日志级别为trace,而com.mlq.love包为error,那么就可以如下这样写:

<Loggers>

  <Logger name="com.mlq.love.entity"level="TRACE">

     <AppenderRefref="Console"/>

  </Logger>

  <Rootlevel="error">

     <AppenderRefref="Console"/>

  </Root>

</Loggers>

再执行,得到如下结果:

        我们发现com.mlq.love.entity中的日志都会输出两次,从代码结构角度来讲是,com.mlq.love.entityLoggerAppender是关联关系,项目代码包结构统一由LoggerConfig来维护的,子包的<Logger>配置会被装饰到父包。但是大多数情况我们不想要这样,就需要在<Logger>设置属性additivity="false"如下:

<Logger name="com.mlq.love.entity"level="TRACE"additivity="false">

  <AppenderRefref="Console"/>

</Logger>

再执行,得到如下结果:

 

3.4自动重新加载配置

        通常情况系统上线后重启系统代价是很大的,所以Log4j2支持动态调整配置,自动识别加载,我们只需要作如下设置(30秒检查一次更新):

<Configurationstatus="off"monitorInterval="30">

 

3.5输出日志到文件中

  • <Appenders></Appenders>定义了日志的输出方式

  • <Loggers></Loggers>定义了对应范围的日志输出级别,并且通过引用<Appenders></Appenders>中的定义来确认输出方式

    下面通过一个例子来学习下输出日志到文件的方式

Log4j2.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<Configurationstatus="WARN">

  <Appenders>

     <Consolename="Console"target="SYSTEM_OUT">

        <PatternLayoutpattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -%msg%n"/>

     </Console>

     <Filename="Trace"fileName="WebRoot/WEB-INF/logs/debug.log"append="true">

        <PatternLayout>

           <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>

        </PatternLayout>

     </File>

     <Filename="error"fileName="WebRoot/WEB-INF/logs/erorr.log"append="true">

        <PatternLayout>

           <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>

        </PatternLayout>

     </File>

     

  </Appenders>

  <Loggers>

     <Logger name="com.mlq.love.entity"level="TRACE"additivity="false">

        <AppenderRefref="Trace"/>

     </Logger>

     <Rootlevel="error">

        <AppenderRefref="error"/>

     </Root>

  </Loggers>

</Configuration>

  其中第一个Logger是将com.mlq.love.entity包中的内容级别设置为TRACE,并按照Appenders中定义的<Filename="Trace"/>方式来输出,这里面的name可以随便定义,上下对应就可以,路径也可以根据需求来更改。在配置文件中可以使用${web:rootDir}来获取项目根目录

 

3.6配置日志输出格式<Pattern>

    详细的官方文档可以参见

http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout但是鉴于某些一看英文就头大的同学,这里作下简单介绍。

  • %d 输出日志时间点的日期或时间默认格式为ISO8601也可以在其后指定格式比如%d{yyyy-MM-ddHH:mm:ss}输出类似2006-01-1817:50:22'刚好适合插入SQLServer

  • %t产生该日志事件的线程名

  • %p日志的log_level,如DEBUGWARN或者INFO

  • %c输出所属的类目,通常就是所在类的全名,如“com.mlq.love”

  • %m日志的内容

  • %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。如Wite2Database.main(Wite2Database.java:18)

  • %n 输出一个回车换行符

 

Log4j2甚至可以通过Socket远程记录日志以及直接将日志记录入数据库,这些官网都有介绍,有兴趣可以去挖一下哦~

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:80054次
    • 积分:1223
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:4篇
    • 译文:0篇
    • 评论:116条
    文章分类
    最新评论