log4j2.xml基础学习

来源:互联网 发布:电脑屏幕校准软件 编辑:程序博客网 时间:2024/05/21 11:02

简介

本文主要讲解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#ConfigurationSyntaxhttp://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#Loggershttp://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#Scriptshttp://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

查看原文:https://www.huuinn.com/archives/436
更多技术干货:风匀坊
关注公众号:风匀坊