log4j2

1 日志级别

    日志记录器(Logger)的行为是分等级的。如下表所示

分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是 ERROR>WARN>INFO>DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来,也是说大于等于的级别的日志才输出。

2 log4j2文件的配置大致结构

    log4j2.xml文件的配置大致如下:

Configuration

    properties

    Appenders

        Console

            PatternLayout

        File

        RollingRandomAccessFile   

            Filters(过滤机制)

            PatternLayout(控制日志信息输出格式)

            Polices(控制日志何时when滚动)

            Strategy(控制日志如何how滚动)

    Loggers

        AsyncLogger(异步日志器)

            AppenderRef

        Logger(同步日志器)

            AppenderRef

        RootLogger

            AppenderRef

    2.1 Configuration

Configuration:为根节点,有status和monitorInterval等多个属性

* status的值有 “trace”, “debug”, “info”, “warn”, “error” and “fatal”,用于控制log4j2日志框架本身的日志级别,如果将stratus设置为较低的级别就会看到很多关于log4j2本身的日志,如加载log4j2配置文件的路径等信息

* monitorInterval,含义是每隔多少秒重新读取配置文件,可以不重启应用的情况下修改配置

    2.2 Appenders: 输出源,用于定义日志输出的地方,log4j2支持的输出源有很多,有控制台Console、文件File、MongoDB、Flume、RollingRandomAccessFile等。

1. Console: 控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,用于调试;

2. File:文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(如/data/applogs);

3. RollingRandomAccessFile: 该输出源也是写入到文件,不同的是不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则。这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。

* name: 日志器名

* fileName: 指定当前日志文件的位置和名称;

* filePattern: 指定当发生Rolling时,文件的转移和重命名规则

* SizeBasedTriggeringPolicy: 指定当文件体积大于size指定的值时,触发Rolling,生成一个新的日志文件;

* DefaultRolloverStrategy: 指定最多保存的文件个数,默认是9;

* TimeBasedTriggeringPolicy: 与filePattern结合使用,比如filePattern="${LOG_HOME}/apibiz_%d{yyyyMMdd}.log”、TimeBasedTriggeringPolicy的interval=1,则表示每天生成一个文件,若filePattern改成{yyyyMMddHHmm},则每分钟生成一个文件;

   

  2.4 Filters:可以配置一系列的过滤器

    Log4j2的onMatch和onMismatch属性值详解如下:                                     

    onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL;                                       

    分别介绍这两个配置项的三个属性值:                      -               

    --------------------                           

    onMatch="ACCEPT" 表示匹配该级别及以上     

    onMatch="DENY" 表示不匹配该级别及以上         

    onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上

    onMismatch="ACCEPT" 表示匹配该级别以下   

    onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的

    onMismatch="DENY" 表示不匹配该级别以下的              -           

    --------------------

  2.5 PatternLayout

* charset ##指定字符集 

* pattern ##指定格式

* alwaysWriteExceptions ##默认为true,输出异常

* header ##可选项。包含在每个日志文件的顶部

* footer ##可选项。包含在每个日志文件的尾部。

       

  2.5.1 pattern属性参数格式描述

######### 常见参数 #########

%c{参数} 或 %logger{参数}  ##输出日志名称

%C{参数} 或 %class{参数    ##输出类型

%d{参数}{时区te{参数}{时区} ##输出时间

%F|%file                  ##输出文件名

highlight{pattern}{style} ##高亮显示

%l  ##输出错误的完整位置

%L  ##输出错误行号

%m 或 %msg 或 %message ##输出错误信息

%M 或 %method ##输出方法名

%n            ##输出换行符

%level{参数1}{参数2}{参数3} ##输出日志的级别

%t 或 %thread              ##创建logging事件的线程名

*/

######### 特殊符号 ############

#有些特殊符号不能直接打印,需要使用实体名称或者编号

//

& —— & 或者 &

< —— <  或者 <

> —— >  或者 >

“ —— " 或者 "

‘ —— ' 或者 '

*/

######## pattern对齐修饰 ##########

// 对齐修饰,可以指定信息的输出格式,如是否左对齐,是否留空格等。

## 编写格式为在任何pattern和%之间加入一个小数,可以是正数,也可以是负数。

## 整数表示右对齐,负数表示左对齐;

## 整数位表示输出信息的最小n个字符,如果输出信息不够n个字符,将用空格补齐;

## 小数位表示输出信息的最大字符数,如果超过n个字符,则只保留最后n个字符的信息

## (注意:保留的是后20个字符,而不是前20个字符)

*/

#示例如下

%20 —— 右对齐,不足20个字符则在信息前面用空格补足,超过20个字符则保留原信息

%-20 —— 左对齐,不足20个字符则在信息后面用空格补足,超过20个字符则保留原信息

%.30 —— 如果信息超过30个字符,则只保留最后30个字符

%20.30 —— 右对齐,不足20个字符则在信息前面用空格补足,超过30个字符则只保留最后30个字符

%-20.30 —— 左对齐,不足20个字符则在信息后面用空格补足,超过30个字符则只保留最后30个字符

   

    2.6 Loggers:日志器,分为跟日志器Root和自定义日志器自定义时需要指定每个Logger的名称name(对于命名可以以包名作为日志的名字,不同的包配置不同的级别等),日志级别level,相加性additivity(是否继承下面配置的日志器), 对于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一个或多个输出源AppenderRef; 每个logger可以指定一个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR

additivity指定是否同时输出log到父类的appender,缺省为true。

log4j.xml配置样例

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

<!—日志框架本身的日志级别为warn,也就是说不会看到日志框架本身warn以下级别的日志信息-->

<configuration status="WARN">

  <Properties>

      <!—日志输出格式,不足5个字符时左对齐,比对2.5中对pattern参数的解释来看-->

      <Property name="PATTERN_LAYOUT">[search-mobile-web]%d %-5p [%c] %m%n</Property>

      <!—日志路径-->

      <Property name="LOG_HOME">/data/applogs/search-mobile-web/</Property>

  </Properties>

  <appenders>

      <!—没有filter,表示不过滤,任何级别的日志都匹配-->

      <RollingRandomAccessFile

            name="rootAppender"

            fileName="${LOG_HOME}/root.log"

            filePattern="${LOG_HOME}/root_%d{yyyyMMdd}.log">

        <PatternLayout pattern="${PATTERN_LAYOUT}"/>

        <Policies>

            <TimeBasedTriggeringPolicy interval="1"/>

        </Policies>

      </RollingRandomAccessFile>

      <!—filePattern与TimeBasedTriggerPolicy共同决定了日志的滚动级别,filePattern格式决定滚动的时间、TimeBasedTriggerPolicy决定滚动间隔,比如当前这个配置表示滚动时间为天级别、间隔为1天-->

      <RollingRandomAccessFile

            name="apiBizAppender"

            fileName="${LOG_HOME}/apibiz.log"

          filePattern="${LOG_HOME}/apibiz_%d{yyyyMMdd}.log”>

        <Filters>

            <!—表示不匹配warn级别及以上的,warn级别以下由下一个                  filter处理-->

            <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL”/>

            <!—表示匹配info级别及以上的,info级别以下不匹配-->

            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

        </Filters>

        <PatternLayout pattern="${PATTERN_LAYOUT}"/>

        <Policies>

            <TimeBasedTriggeringPolicy interval="1"/>

        </Policies>

      </RollingRandomAccessFile>

      <RollingRandomAccessFile

            name="apiSysAppender"

            fileName="${LOG_HOME}/apisys.log"

            filePattern="${LOG_HOME}/apisys_%d{yyyyMMdd}.log">

        <Filters>

            <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>

            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>

        </Filters>

        <PatternLayout pattern="${PATTERN_LAYOUT}"/>

        <Policies>

            <TimeBasedTriggeringPolicy interval="1"/>

        </Policies>

      </RollingRandomAccessFile>

      <RollingRandomAccessFile

            name="apiErrAppender"

            fileName="${LOG_HOME}/syserror.log"

            filePattern="${LOG_HOME}/syserror_%d{yyyyMMdd}.log">

        <Filters>

            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

        </Filters>

        <PatternLayout pattern="${PATTERN_LAYOUT}"/>

        <Policies>

            <TimeBasedTriggeringPolicy interval="1"/>

        </Policies>

      </RollingRandomAccessFile>

      <RollingRandomAccessFile

            name="apiQueryAppender"

            fileName="${LOG_HOME}/query.log"

            filePattern="${LOG_HOME}/query_%d{yyyyMMdd}.log">

        <Filters>

            <ThresholdFilter level="warn" onMatch=“DENY" onMismatch="NEUTRAL"/>

            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

        </Filters>

        <PatternLayout pattern="${PATTERN_LAYOUT}"/>

        <Policies>

            <TimeBasedTriggeringPolicy interval="1"/>

        </Policies>

      </RollingRandomAccessFile>

      <RollingRandomAccessFile

            name="serviceQueryAppender"

            fileName="${LOG_HOME}/servicelogs/query.log"

            filePattern="${LOG_HOME}/servicelogs/query.log_%d{yyyyMMdd}.log”>

        <!—表示仅匹配info级别-->

        <Filters>

            <ThresholdFilter level="warn" onMatch=“DENY" onMismatch="NEUTRAL"/>

            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

        </Filters>

        <PatternLayout pattern="${PATTERN_LAYOUT}"/>

        <Policies>

            <TimeBasedTriggeringPolicy interval="1"/>

        </Policies>

      </RollingRandomAccessFile>

      <RollingRandomAccessFile

            name="serviceErrorAppender"

            fileName="${LOG_HOME}/servicelogs/error.log"

            filePattern="${LOG_HOME}/servicelogs/error.log_%d{yyyyMMdd}.log">

        <Filters>

            <ThresholdFilter level=“warn" onMatch="ACCEPT" onMismatch="DENY"/>

        </Filters>

        <PatternLayout pattern="${PATTERN_LAYOUT}"/>

        <Policies>

            <TimeBasedTriggeringPolicy interval="1"/>

        </Policies>

      </RollingRandomAccessFile>

  </appenders>

  <loggers>

      <AsyncLogger name="query-monitor" additivity="false" level="info">

        <appender-ref ref="serviceQueryAppender"/>

      </AsyncLogger>

      <AsyncLogger name="service-error-monitor" additivity="false" level="error">

        <appender-ref ref="serviceErrorAppender"/>

      </AsyncLogger>

      <AsyncLogger name="api-biz-monitor" additivity="false" level="warn">

        <appender-ref ref="apiBizAppender"/>

      </AsyncLogger>

      <AsyncLogger name="api-sys-monitor" additivity="false" level="warn">

        <appender-ref ref="apiSysAppender"/>

      </AsyncLogger>

      <AsyncLogger name="sys-error-monitor" additivity="false" level="error">

        <appender-ref ref="apiErrAppender"/>

      </AsyncLogger>

      <AsyncLogger name="query-monitor" additivity="false" level="info">

        <appender-ref ref="apiQueryAppender"/>

      </AsyncLogger>

      <asyncRoot level="info">

        <appender-ref ref="rootAppender"/>

      </asyncRoot>

  </loggers>

</configuration>

//按如上配置生产的日志格式样例

相关jar包配置样例

<!--log4j2依赖-start-->

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-api</artifactId>

    <version>${log4j2.version}</version>

</dependency>

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-core</artifactId>

    <version>${log4j2.version}</version>

</dependency>

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-slf4j-impl</artifactId>

    <version>${log4j2.version}</version>

</dependency>

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-web</artifactId>

    <version>${log4j2.version}</version>

</dependency>

<dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-api</artifactId>

    <version>${slf4j-api.version}</version>

</dependency>

<dependency>

    <groupId>com.lmax</groupId>

    <artifactId>disruptor</artifactId>

    <version>3.4.1</version>

</dependency>

<!--log4j2依赖-end-->

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

推荐阅读更多精彩内容