log4j2.xml基础学习

简介

本文主要讲解log4j2的基本使用配置。讲解内容如下

  • 无配置文件
  • 有配置文件但无配置
  • 只配置Appender和Logger
  • Layout指定
  • 子Logger
  • Filter使用
  • Property定义与使用
  • 环境变量, 系统属性等引用
  • Script运用
  • 配置分割成多个文件

环境

  • java 1.8
  • log4j2.9.1

用于输出的java代码

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

public class Main {
    private static Logger logger = LogManager.getLogger(Main.class);

    public static void main(String[] args) {
        logger.fatal("fatal!");
        logger.error("error!");
        logger.warn("warn!");
        logger.info("info!");
        logger.debug("debug!");
        logger.trace("trace!");
    }
}

log4j2.xml配置

无配置文件
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging.
22:17:59.839 [main] FATAL Main - fatal!
22:17:59.844 [main] ERROR Main - error!
  • 即使没有配置文件也会输出日志,但第一行会追加输出ERROR信息
  • 没有配置文件时,默认日志输出设置
    • RootLogger使用ConsoleAppender
    • ConsoleAppender使用PatternLayout
    • pattern为 "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
    • 日志输出级别为ERROR
有配置文件但无配置

log4j2.xml

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

日志输出

22:25:30.374 [main] FATAL Main - fatal!
22:25:30.379 [main] ERROR Main - error!
  • Configuration标签中可以使用status属性来指定日志的输出级别
  • 当有log4j2-test.xml文件时,log4j2.xml会优先载入,当想临时覆盖现有配置时,可以考虑使用。
  • 除xml文件形式配置以外,也支持jaon, yaml等文件形式配置。还有老的properties形式
  • 优先顺序为properties > yaml > json > xml

参考:
http://logging.apache.org/log4j/2.x/manual/configuration.html#ConfigurationSyntax
http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

只配置Appender和Logger

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="STDOUT">
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>

日志输出

fatal!
error!
warn!
info!
  • Appenders定义输出目标,输出Layout
  • Logger定义日志输出对象,级别,Appender指定。当不指定Appender时,不会报错但也没有任何输出。Appender可以指定多个。
  • 通过指定Logger的level属性来控制日志输出级别
  • ConsoleAppender默认为打印标准输出,如果想打印标准错误输出,可以使用target="SYSTEM_ERR" ps.通过输出颜色区分日志分类

参考:
http://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers
http://logging.apache.org/log4j/2.x/manual/configuration.html#Appenders

Layout指定

log4j2.xml

        <Console name="STDOUT">
            <PatternLayout pattern="%d %p %m%n"/>
        </Console>

日志输出

2017-11-11 22:46:35,244 FATAL fatal!
2017-11-11 22:46:35,249 ERROR error!
2017-11-11 22:46:35,249 WARN warn!
2017-11-11 22:46:35,249 INFO info!

参考:
http://logging.apache.org/log4j/2.x/manual/layouts.html

子Logger

log4j2.xml

    <Loggers>
        <Logger name="Main" additivity="false">
            <AppenderRef ref="STDOUT"/>
        </Logger>
        <Root>
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>

日志输出

2017-11-11 22:48:13,192 FATAL fatal!
2017-11-11 22:48:13,198 ERROR error!
  • 子Logger中name属性必须配置,值为对应的包名和类名
  • 如果指定了不存在的包名,类名时,不会输出错误信息
  • RootLogger里不能指定name属性值
  • 如果子Logger不配置additivity="false"时,会导致子Logger输出一遍,RootLogger也输出一遍,导致2重输出。

参考:
http://logging.apache.org/log4j/2.x/manual/configuration.html#Additivity

Filter使用

log4j2.xml

    <Filters>
        <RegexFilter regex=".*err.*"/>
        <TimeFilter start="9:00:00" end="23:00:00"/>
    </Filters>

日志输出

2017-11-11 22:52:59,583 ERROR error!
  • 过滤器可以使用在如下节点:
    • Configuration
    • Logger
    • Appender
    • AppenderRef
  • 过滤器判断时会返回以下3种状态
    • ACCEPT 标记为日志输出
    • DENY 标记为日志不输出
    • NEUTRAL 标记为下一个过滤器判断
  • Filters实现多个过滤器,并按顺序执行检查
  • 当某过滤器判断结果为NEUTRAL时,而下一个过滤器不存在时,标记为ACCEPT

参考:
http://logging.apache.org/log4j/2.x/manual/filters.html

Property定义与使用

log4j2.xml

    <Properties>
        <Property name="myPattern">%d %p %m%n</Property>
    </Properties>
    <Appenders>
        <Console name="STDOUT">
            <PatternLayout pattern="${myPattern}"/>
        </Console>
    </Appenders>

日志输出

2017-11-11 22:52:59,583 ERROR error!
  • 实现常用数值定义为变量,供调用

参考:
http://logging.apache.org/log4j/2.x/manual/configuration.html#Properties

环境变量, 系统属性等引用

log4j2.xml

    <Properties>
        <Property name="myPattern">${java:os} %d %p %m%n</Property>
    </Properties>

日志输出

Linux 4.10.0-38-generic unknown, architecture: amd64-64 2017-11-11 23:06:06,412 ERROR error!
  • log4g2配置可调用环境变量, 系统属性。如${java:os}

参考:
http://logging.apache.org/log4j/2.x/manual/lookups.html

Script运用

log4j2.xml

    <Scripts>
        <Script name="checkSunday" language="javascript"><![CDATA[
            var result;
            var sunday = 0;
            var today = new Date();
            var dayOfWeek = today.getDay();
            if (dayOfWeek == sunday) {
                result = true;
            } else {
                result = false;
            }
            result;
        ]]></Script>
    </Scripts>
    <ScriptFilter>
        <ScriptRef ref="checkSunday"/>
    </ScriptFilter>

日志输出

2017-11-11 23:08:20,000 FATAL fatal!
2017-11-11 23:08:20,040 ERROR error!
  • ScriptFilterScriptPatternSelector指定要运行的Script
  • language属性支持如nashornNashornjsJSJavaScriptjavascript,ECMAScript,groovy`等

参考:
http://logging.apache.org/log4j/2.x/manual/configuration.html#Scripts
http://logging.apache.org/log4j/2.x/manual/filters.html#Script

配置分割成多个文件

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns:xi="http://www.w3.org/2001/XInclude">
    <Loggers>
        <Root>
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
    <xi:include href="log4j2-appender.xml"/>
</Configuration>

log4j2-appender.xml

<?xml version="1.0" encoding="UTF-8"?>
<Appenders>
    <Console name="STDOUT">
        <PatternLayout pattern="%d %p %m%n"/>
    </Console>
</Appenders>

日志输出

2017-11-11 23:14:24,896 FATAL fatal!
2017-11-11 23:14:24,901 ERROR error!

参考:
http://logging.apache.org/log4j/2.x/manual/configuration.html#XInclude

本文涉及源码

https://github.com/cangyan/sample-log4j

参考文章

qiita

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注