官网:https://logging.apache.org/log4j/2.x/
1. 主要组件:
从图中可以看出,log4j2中的主要组件为:Filter,Appender,Logger,他们的层次关系为:
Configuration
-- Filter
-- Appender - Layout
-- Filter
-- Logger
-- Filter
2. log4j 2.x配置
log4j 2.x的配置文件格式和1.x的配置文件格式完全不同,需要特别注意。
log4j 2.x从2.4版本开始支持properties配置文件,名称必须为:log4j2.properties。但是,对于log4j 2.x的配置,建议使用xml格式:log4j2.xml,各个组件配置非常灵活。
log4j 2.x 配置框架:
简洁模式:
<?xml version="1.0" encoding="UTF-8"?>; <Configuration> <!-- 定义属性 --> <Properties> <Property name="name1">value</property> <Property name="name2" value="value2"/> </Properties> <!-- 定义全局过滤器 --> <filter ... /> <!-- 定义日志输出源 --> <Appenders> <appender ... > <filter ... /> </appender> ... </Appenders> <!-- 定义日志 --> <Loggers> <Logger name="name1"> <filter ... /> </Logger> ... <Root level="level"> <AppenderRef ref="name"/> </Root> </Loggers> </Configuration>
严格模式:
<?xml version="1.0" encoding="UTF-8"?>; <Configuration> <Properties> <Property name="name1">value</property> <Property name="name2" value="value2"/> </Properties> <Filter type="type" ... /> <Appenders> <Appender type="type" name="name"> <Filter type="type" ... /> </Appender> ... </Appenders> <Loggers> <Logger name="name1"> <Filter type="type" ... /> </Logger> ... <Root level="level"> <AppenderRef ref="name"/> </Root> </Loggers> </Configuration>
3. 详细配置示例
分别以2种配置模式进行配置,如下:
简洁模式:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN" monitorInterval="30"> <!-- 简单模式配置log4j --> <!-- 输出源定义 --> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> </Appenders> <!-- 日志 --> <Loggers> <!-- 特别指定包下的日志级别 --> <Logger name="org.chench.ttt" level="trace" additivity="false"> <AppenderRef ref="Console" /> </Logger> <Root level="info"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
严格模式:
<?xml version="1.0" encoding="UTF-8"?> <!-- 使用严格模式配置log4j2 --> <Configuration status="warn" strict="true" name="XMLConfigTest" packages="org.chench.test"> <!-- 定义属性 --> <Properties> <Property name="fileName">target/test.log</Property> </Properties> <!-- 定义过滤器 --> <Filter type="ThresholdFilter" level="trace"/> <!-- 定义日志输出地 --> <Appenders> <!-- 输出到控制台 --> <Appender type="Console" name="STDOUT"> <!-- <Layout type="PatternLayout" pattern="%m MDC%X%n"/> --> <Layout type="PatternLayout" pattern="%d [%t] %-5level %logger{36} - %msg%n"/> <!-- <Filters> <Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL" /> <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/> </Filters> --> </Appender> <!-- 输出到控制台 --> <Appender type="Console" name="Flow"> <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n"/> <!-- <Filters> <Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/> <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> --> </Appender> <!-- 输出到文件 --> <Appender type="File" name="File" fileName="${fileName}"> <Layout type="PatternLayout"> <!-- <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> --> <!-- <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> --> <Pattern>%d [%t] %-5level %logger{36} - %msg%n</Pattern> </Layout> </Appender> <!-- 输出到List --> <!-- <Appender type="List" name="List"> </Appender> --> </Appenders> <!-- 具体日志组件 --> <Loggers> <!-- 定义org.chench.test.log4j包下的日志组件 --> <!-- <Logger name="org.chench.test.log4j" level="debug" additivity="false"> <Filter type="ThreadContextMapFilter"> <KeyValuePair key="test" value="123"/> </Filter> <AppenderRef ref="STDOUT" /> </Logger> --> <!-- 定义包org.chench.ttt下的日志组件 --> <!-- <Logger name="org.chench.ttt" level="debug" additivity="false"> <AppenderRef ref="File"/> </Logger> --> <Root level="trace"> <AppenderRef ref="STDOUT" /> <AppenderRef ref="File" /> </Root> </Loggers> </Configuration>
4. 在Java中使用log4j2
log4j2中获取日志组件的方式与log4j1不同,以传递class对象为例说明:
log4j1: org.apache.log4j.Logger.getLogger(clazz)
log4j2: org.apache.logging.log4j.LogManager.getLogger(clazz)
代码片段:
public class LoggerTest { private static final Logger logger = LogManager.getLogger(LoggerTest.class); public static void main(String[] args) { logger.info(String.format("log4j2 logger test")); } }
log4j2日志输出格式详见:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout