log4j 2 使用以及配置

一、添加maven依赖

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>

如果现有组件使用Log4j 1.x并且您希望将此日志记录路由到Log4j 2,则删除所有log4j 1.x依赖项并添加以下内容

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.11.1</version>
</dependency>     

如果现有组件使用Apache Commons Logging 1.x并且您希望将此日志记录路由到Log4j 2,则添加以下内容但不删除任何Commons Logging 1.x依赖项。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
    <version>2.11.1</version>
</dependency>

如果现有组件使用SLF4J并且您希望将此日志记录路由到Log4j 2,则添加以下内容但不删除任何SLF4J依赖项

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.11.1</version>
</dependency>

如果现有组件使用Java Util Logging并且您希望将此日志记录路由到Log4j 2,则添加以下内容

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jul</artifactId>
    <version>2.11.1</version>
</dependency>

二、使用

public class Demo {

    private static Logger logger = LogManager.getLogger(Demo.class);
    public static void main(String[] args){
        logger.trace("------trace---追踪级别,就是程序推进以下,一般不使用");
        logger.debug("------debug---调试级别");
        logger.info("-------info----普通级别");
        logger.warn("-------warn----警告级别");
        logger.error("------error---错误级别");
        logger.fatal("------fatal---严重级别,程序已经无法运行或应该停止的情况下");
    }
}

三、配置

log4j2默认会在classpath目录下寻找log4j.json、log4j.jsn、log4j2.xml等名称的文件,如果都没有找到,则会按默认配置输出,也就是输出到控制台。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
</Configuration>

Configuration 节点

  • status 打印log4j自身的日志级别配置

       OFF 关闭
       输出日志级别 All < Trace < Debug < Info < Warn < Error < Fatal < OFF
    

如:

#关闭
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
</Configuration>   

#输出日志
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
</Configuration>     
  • monitorInterval 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" monitorInterval="20">
...
</Configuration>   

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属性),默认7个。
    

Loggers节点

常见的有两种:Root和Logger.

  • Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

      level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
      AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.   
    
  • Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

      level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
      name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
      AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。         
    

四、配置示例

以下示例输出INFO级别日志且到达指定大小后删除旧的的日志,ERROR级别日志按月归档分类

<?xml version="1.0" encoding="UTF-8"?>
<!--配置根节点Configuration信息
status :打印log4j自身的日志级别;
         OFF 关闭
         输出日志级别 All < Trace < Debug < Info < Warn < Error < Fatal < OFF
monitorInterval :用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s
-->
<Configuration status="ERROR" monitorInterval="86400">
    <!-- 变量配置 -->
    <Properties>
        <!--输入路径-->
        <Property name="ROOT_PATH" value="./home/logs"/>
        <Property name="INFO_LOG_PATH" value="${ROOT_PATH}/info"/>
        <Property name="ERROR_LOG_PATH" value="${ROOT_PATH}/error"/>

        <!--输出日志的格式-->
        <Property name="Console_OUT_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 类名:%logger{80} 方法名:%M:%L %msg%n"/>
        <Property name="File_OUT_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{80}.%M:%L %msg%n"/>
    </Properties>

    <Appenders>
        <!--输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--日志过滤:控制台只输出level(info)及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式-->
            <PatternLayout pattern="${File_OUT_PATTERN}"/>
        </Console>

        <!--普通日志:每个日志1GB, 总共15个,大概保留15天的日志-->
        <RollingFile name="INFO_LOG" fileName="${INFO_LOG_PATH}/info.log" filePattern="${INFO_LOG_PATH}/oldInfoLogs/info-%i.log">
            <!--日志过滤:ERROR-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式-->
            <PatternLayout pattern="${File_OUT_PATTERN}"/>
            <Policies>
                <!--每个日志大小:1GB-->
                <SizeBasedTriggeringPolicy size="10KB"/>
            </Policies>
            <!--限制日志个数:15-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

        <!--错误日志:按月归档-->
        <RollingFile name="ERROR_LOG" fileName="${ERROR_LOG_PATH}/error.log" filePattern="${ERROR_LOG_PATH}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <!--日志过滤:ERROR-->
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式-->
            <PatternLayout pattern="${File_OUT_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <!--每个日志大小:500MB-->
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <!--限制日志个数:80,基本保证每天的错误日志能够存下来-->
            <DefaultRolloverStrategy max="80"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!--指定某个包下的日志级别,同时受全局日志级别影响-->
        <Logger name="top.vchar.demo.log4j2.test" level="ERROR"/>
        <!--全局日志级别-->
        <Root level="INFO">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="INFO_LOG"/>
            <AppenderRef ref="ERROR_LOG"/>
        </Root>
    </Loggers>
</Configuration>

测试示例

package top.vchar.demo.log4j2;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * <p> 使用样例 </p>
 *
 * @author vchar fred
 * @version 1.0
 * @create_date 2019/1/21 14:11
 */
public class Demo {

    private static Logger logger = LogManager.getLogger(Demo.class);

    public static void main(String[] args) throws InterruptedException {
        int i=0;
        long s = System.currentTimeMillis();
        while (i++<100000){
            print();
        }
        System.out.println((System.currentTimeMillis()-s));

    }

    private static void print(){
        logger.trace("------trace---追踪级别,就是程序推进以下,一般不使用");
        logger.debug("------debug---调试级别");
        logger.info("-------info----普通级别");
        logger.warn("-------warn----警告级别");
        logger.error("------error---错误级别");
        logger.fatal("------fatal---严重级别,程序已经无法运行或应该停止的情况下");
        System.out.println("-------------------end--------------------------");
    }

}               

五、其他

在web项目中,需要在web.xml文件中配置log4j2的配置文件路径;如下:

<!--log4j2配置-->
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j2.xml</param-value>
  </context-param>      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容

  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 4,982评论 0 6
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,023评论 1 13
  • 一、Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layo...
    默默守护阅读 1,907评论 2 8
  • from:https://www.cnblogs.com/ITtangtang/p/3926665.html一、L...
    enshunyan阅读 3,289评论 0 0
  • 淡定自若的过好余生~ (12月4日 张璐) “春有鲜花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是人间好时节。”这...
    明天过后便是晴天阅读 1,091评论 4 20