引入依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
<scope>test</scope>
</dependency>
使用
-
定义日志记录器对象
public static final Logger LOGGER = LogMannager.getLogger(类名.class)
-
操作
LOGGER.fatal("fatal"); LOGGER.error("error"); LOGGER.warn("warn"); LOGGER.info("info"); LOGGER.debug("debug");
配置文件
log4j2默认加载classpath下的log4j2.xml
文件中的配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- status 日志框架本身的输出级别 monitorInterval 自动加载配置文件的间隔时间-->
<Configuration status="warn" monitorInterval="5">
<!-- 集中配置属性进行管理 使用时通过:${name} -->
<properties>
<!-- 日历 -->
<property name="LOG_HOME">E:/logs</property>
</properties>
<!-- 日志处理 -->
<Appenders>
<!-- 默认打印到控制台 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 默认打印格式 -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/>
</Console>
<!-- 打印到 -->
<File name="file" fileName="${LOG_HOME}/myfile.log">
<!-- 默认打印格式 -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/>
</File>
<!-- 使用随机读写流的日志文件输出 -->
<RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myfile.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/>
</RandomAccessFile>xingn
<!-- 按照一定的规则拆分日志文件的appender,性能提高 -->
<RollingFile name = "rollingFile" fileName="${LOG_HOME}/myfile.log" filePattern="/log/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<!-- 按照一定的规则拆分日志文件的appender,性能提高 -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENT" />
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/>
<Policies>
<!-- 在系统起点时,触发拆分规则 -->
<OnStartupTriggeringPolicy />
<!-- 安装文件大小进行拆分 -->
<SizeBasedTriggeringPolicy size="10 MB" />
<!-- 按照时间节点进行拆分 -->
<TimeBasedTiggeringPolicy />
</Policies>
<!-- 同一目录下限定文件数目 -->
<DefauktRolloverStrategy max="30" />
</RollingFile>
</Appenders>
<Loggers>
<!-- 默认打印日志级别为 error -->
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
异步日志处理
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
- AsyncAppender方式 不推荐与logger性能差不多
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<properties>
<property name="LOG_HOME">D:/logs</property>
</properties>
<Appenders>
<File name="file" fileName="${LOG_HOME}/myfile.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
<Async name="Async">
<AppenderRef ref="file"/>
</Async>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Async"/>
</Root>
</Loggers>
</Configuration
-
AsyncLogger方式
AsyncLogger才是log4j2 的重头戏,也是官方推荐的异步方式。它可以使得调用Logger.log返回的
更快。你可以有两种选择:全局异步和混合异步。-
全局异步就是,所有的日志都异步的记录,在配置文件上不用做任何改动,只需要添加一个
log4j2.component.properties 配置;Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerCon textSelector
-
混合异步就是,你可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加
灵活。<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <properties> <property name="LOG_HOME">D:/logs</property> </properties> <Appenders> <File name="file" fileName="${LOG_HOME}/myfile.log"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> </File> <Async name="Async"> <AppenderRef ref="file"/> </Async> </Appenders> <Loggers> <AsyncLogger name="com.itheima" level="trace" includeLocation="false" additivity="false"> <AppenderRef ref="file"/> </AsyncLogger> <Root level="info" includeLocation="true"> <AppenderRef ref="file"/> </Root> </Loggers> </Configuration>
使用异步日志需要注意的问题:
- 如果使用异步日志,AsyncAppender、AsyncLogger和全局日志,不要同时出现。性能会和AsyncAppender一致,降至最低。
- 设置includeLocation=false ,打印位置信息会急剧降低异步日志的性能,比同步日志还要慢。
-