目前市面上最主流的日志门面就是SLF4J,虽然Log4j2也是日志门面,因为它的日志实现功能非常强 大,性能优越。所以大家一般还是将Log4j2看作是日志的实现,Slf4j + Log4j2应该是未来的大势所趋。
添加pom.xml
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-apiartifactId>
<version>2.11.1version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>2.11.1version>
dependency>
添加测试类
public class Log4j2Service {
// 定义日志记录器对象
public static final Logger LOGGER = LogManager.getLogger(Log4j2Service.class);
@Test
public void testQuick() throws Exception {
LOGGER.fatal("fatal");
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
}
添加pom.xml
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.25version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-slf4j-implartifactId>
<version>2.10.0version>
dependency>
添加测试类
public class Slf4jToLog4j2Service {
// 定义日志记录器对象
public final static Logger LOGGER = LoggerFactory.getLogger(Slf4jToLog4j2Service.class);
@Test
public void testQuick() throws Exception {
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
}
<Configuration status="debug" monitorInterval="5">
<properties>
<property name="LOG_HOME">/Users/machoul/IdeaProjects/machoul-log-test/machoul-log4j2-test/logproperty>
properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/>
Console>
<File name=" file" fileName="${LOG_HOME}/myfile.log">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %m%n"/>
File>
<RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %m%n"/>
RandomAccessFile>
<RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %msg%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy/>
Policies>
<DefaultRolloverStrategy max="30"/>
RollingFile>
Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
<AppenderRef ref="file"/>
<AppenderRef ref="accessFile"/>
<AppenderRef ref="rollingFile"/>
Root>
Loggers>
Configuration>
patternLayout的具体用法和参数可以参考官网地址:https://logging.apache.org/log4j/2.x/manual/layouts.html
log4j2最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益。
Log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应Appender组件和Logger组件。
异步日志需要添加依赖
<dependency>
<groupId>com.lmaxgroupId>
<artifactId>disruptorartifactId>
<version>3.3.4version>
dependency>
<Configuration status="debug">
<properties>
<property name="LOG_HOME">/Users/machoul/IdeaProjects/machoul-log-test/machoul-log4j2-test/logproperty>
properties>
<Appenders>
<File name="file" fileName="${LOG_HOME}/myfile.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%nPattern>
PatternLayout>
File>
<Async name="Async">
<AppenderRef ref="file"/>
Async>
Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Async"/>
Root>
Loggers>
Configuration>
所有的日志都异步的记录,在配置文件上不用做任何改动,只需要添加一个log4j2.component.properties
配置
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加 灵活。
<Configuration status="debug">
<properties>
<property name="LOG_HOME">/Users/machoul/IdeaProjects/machoul-log-test/machoul-log4j2-test/logproperty>
properties>
<Appenders>
<File name="file" fileName="${LOG_HOME}/myfile.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%nPattern>
PatternLayout>
File>
<Async name="Async">
<AppenderRef ref="file"/>
Async>
Appenders>
<Loggers>
<AsyncLogger name="com.machoul" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="file"/>
AsyncLogger>
<Root level="info" includeLocation="true">
<AppenderRef ref="file"/>
Root>
Loggers>
Configuration>
如上配置,com.machoul
是异步的,root
日志是同步的
使用异步日志需要注意的问题:
如果使用异步日志,AsyncAppender、AsyncLogger和全局日志,不要同时出现。性能会和 AsyncAppender一致,降至最低。
设置includeLocation=false ,打印位置信息会急剧降低异步日志的性能,比同步日志还要 慢。
可以使用系统,环境,或者其他的参数来配置log4j2
详情可以参考官网https://logging.apache.org/log4j/2.x/manual/lookups.html
如果要实现自定义的lookup
,那么需要继承AbstractLookup
接口来自定义内容。