简介
本文主要讲解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!
ScriptFilter
,ScriptPatternSelector
指定要运行的Scriptlanguage
属性支持如nashorn
,Nashorn
,js
,JS
,JavaScript
,javascript,
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