前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Log4j 2配置指南

Log4j 2配置指南

作者头像
Java识堂
发布2019-08-13 10:41:31
1.5K0
发布2019-08-13 10:41:31
举报
文章被收录于专栏:Java识堂Java识堂

前言

以前都是直接在项目中使用网上的log4j2.xml,大概能用就行,结果用Storm的时候,项目中的log4j2.xml文件失效,必须在Storm目录的配置文件中配置,就学习了一波,分享一下

log4j2有8个级别,从低到高为

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少

先看一个最简单的,log4j2.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

这个配置文件主要是把程序运行过程中error级别的日志打印到控制台

根标签Configuration常用的子标签为Properties,Appenders,Loggers

Console代表向控制台打印日志 RollingFile会根据具体的生成策略重新生成日志文件,如日志大小到了指定大小,或者到了指定时间

翻转策略常用的一些标签

Loggers标签常用的子标签为Root,Logger,Root标签用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root进行日志输出

Logger常用属性

如果Logger没有指定level属性,就会默认继承自Root

Root标签和Logger标签常用的子标签为AppenderRef

如果Logger没有指定AppenderRef ,就会默认继承自Root。如果指定了,就会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity=false只在自定义的Appender中进行输出

再介绍一个常用的过滤器标签ThresholdFilter

这里说一下可选值ACCEPT, DENY, NEUTRAL,ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。所以,在组合过滤器中,使用NEUTRAL(中立的),被第一个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件

常用模板

我们在项目中一般不直接使用Log4j2而是SLF4J。SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类,SLF4J类似JDBC,这样我们可以轻松更改日志的实现,一般在pom文件中加入如下即可

代码语言:javascript
复制
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.6.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.6.2</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.13</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.5</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
</dependency>

lombok是一个神奇插件,在类上加上@Slf4j 注解,就相当于在类中加入如下代码,特别方便,还有其他特别方便的注解,可以参考其他文章安装和学习一下

代码语言:javascript
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private Logger log = LoggerFactory.getLogger(类名.class);

将指定包或者指定类的日志打印到不同文件

设置Logger标签的name属性为包名或者全类名,即可把日志打到相应的文件中

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

    <Properties>
    <!-- 定义日志输出的格式,具体含义可参考官网 -->
        <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
        <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
        <property name="logDir">./logs</property>
        <property name="logLevel">debug</property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>${consolePattern}</pattern>
            </PatternLayout>
        </Console>
        <File name="logFile" fileName="${logDir}/server.log" append="false">
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="classFile" fileName="${logDir}/classFile.log" append="false">
            <PatternLayout pattern="${filePattern}"/>
        </File>
    </Appenders>

    <Loggers>
        <Logger name="com.test1.TestLog">
            <AppenderRef ref="classFile" />
        </Logger>
        <Root level="${logLevel}">
            <AppenderRef ref="console" />
            <AppenderRef ref="logFile" />
        </Root>
    </Loggers>

</Configuration>

将不同级别的日志打印到不同文件

主要思路是,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能颠倒

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

    <Properties>
        <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
        <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
        <property name="logDir">./logs</property>
        <property name="logLevel">debug</property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>${consolePattern}</pattern>
            </PatternLayout>
        </Console>
        <File name="logFile" fileName="${logDir}/server.log" append="false">
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="debugFile" fileName="${logDir}/debug.log" append="false">
            <Filters>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="infoFile" fileName="${logDir}/info.log" append="false">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${filePattern}"/>
        </File>
        <File name="errorFile" fileName="${logDir}/error.log" append="false">
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${filePattern}"/>
        </File>
    </Appenders>

    <Loggers>
        <Root level="${logLevel}">
            <AppenderRef ref="console" />
            <AppenderRef ref="logFile" />
            <AppenderRef ref="debugFile" />
            <AppenderRef ref="infoFile" />
            <AppenderRef ref="errorFile" />
        </Root>
    </Loggers>

</Configuration>

按时间或者大小归档

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">

    <Properties>
        <property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
        <property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
        <property name="logDir">./logs</property>
        <property name="logLevel">debug</property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>${consolePattern}</pattern>
            </PatternLayout>
        </Console>
        <RollingFile name="logFile" fileName="${logDir}/server.log" filePattern="${logDir}/server-%d{yyyyMMddHH}.log.gz">
            <PatternLayout>
                <pattern>${filePattern}</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="24" modulate="true" />
                <!--<SizeBasedTriggeringPolicy size="10MB" />-->
            </Policies>
            <DefaultRolloverStrategy max="30" />
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="${logLevel}">
            <AppenderRef ref="console" />
            <AppenderRef ref="logFile" />
        </Root>
    </Loggers>

</Configuration>

每天零点归档日志,文件名类似如下server-2018041123.log.gz,当日志达到30个以后,删除以前的日志

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java识堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 将指定包或者指定类的日志打印到不同文件
  • 将不同级别的日志打印到不同文件
  • 按时间或者大小归档
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档