Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 官网: https://logging./log4j/2.x/ <!--log4j2日志门面--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency> <!--log4j2 日志实现--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency> public class Log4j2Test { // 定义日志记录器对象 public static final Logger LOGGER = LogManager.getLogger(Log4j2Test.class); // 快速入门 @Test public void testQuick()throws Exception{ // 日志消息输出 LOGGER.fatal("fatal"); LOGGER.error("error"); LOGGER.warn("warn"); LOGGER.info("inf"); LOGGER.debug("debug"); LOGGER.trace("trace"); } } 2. 使用slf4j作为日志的门面,使用log4j2作为日志的实现 <!--使用slf4j 作为日志门面--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.26</version> </dependency> <!--使用 log4j2 的适配器进行绑定--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.9.1</version> </dependency> public class Slf4jTest { public static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class); // 快速入门 @Test public void test01()throws Exception{ // 日志输出 LOGGER.error("error"); LOGGER.warn("wring"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); } } Log4j2配置 <?xml version="1.0" encoding="UTF-8"?> <!-- status="warn" 日志框架本身的输出日志级别 monitorInterval="5" 自动加载配置文件的间隔时间,不低于 5 秒 --> <Configuration status="debug" monitorInterval="5"> <!-- 集中配置属性进行管理 使用时通过:${name} --> <properties> <property name="LOG_HOME">/logs</property> </properties> <!--日志处理--> <Appenders> <!--控制台输出 appender--> <Console name="Console" target="SYSTEM_ERR"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /> </Console> <!--日志文件输出 appender--> <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> <!--<Async name="Async">--> <!--<AppenderRef ref="file"/>--> <!--</Async>--> <!--使用随机读写刘的日志文件输出 appender,性能提高--> <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> <!--按照一定规则拆分的日志文件的 appender--> <RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log" filePattern="/logs/$${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 /> <!--按照文件大小拆分,10MB --> <SizeBasedTriggeringPolicy size="10 MB" /> <!--按照时间节点拆分,规则根据filePattern定义的--> <TimeBasedTriggeringPolicy /> </Policies> <!--在同一个目录下,文件的个数限定为 30 个,超过进行覆盖--> <DefaultRolloverStrategy max="30" /> </RollingFile> </Appenders> <!--logger 定义--> <Loggers> <!--自定义异步 logger 对象 includeLocation="false" 关闭日志记录的行号信息 additivity="false" 不在继承 rootlogger 对象 --> <AsyncLogger name="com.topcheer" level="trace" includeLocation="false" additivity="false"> <AppenderRef ref="Console"/> </AsyncLogger> <!--使用 rootLogger 配置 日志级别 level="trace"--> <Root level="trace"> <!--指定日志使用的处理器--> <AppenderRef ref="Console" /> <!--使用异步 appender--> <AppenderRef ref="Async" /> </Root> </Loggers> </Configuration> Log4j2异步日志
异步日志
Log4j2 提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应 <!--异步日志依赖--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.4</version> </dependency> 1. AsyncAppender方式 <!--日志文件输出 appender--> <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> <!--<Async name="Async">--> <!--<AppenderRef ref="file"/>--> <!--</Async>--> <!--使用 rootLogger 配置 日志级别 level="trace"--> <Root level="trace"> <!--指定日志使用的处理器--> <AppenderRef ref="Console" /> <!--使用异步 appender--> <AppenderRef ref="Async" /> </Root>
2 . AsyncLogger方式 Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 混合异步 就是,你可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加 <!--自定义异步 logger 对象 includeLocation="false" 关闭日志记录的行号信息 additivity="false" 不在继承 rootlogger 对象 --> <AsyncLogger name="com.topcheer" level="trace" includeLocation="false" additivity="false"> <AppenderRef ref="Console"/> </AsyncLogger>
如上配置: com.topcheer日志是异步的,root日志是同步的。 Log4j2 的性能
无垃圾记录
Log4j 2.6 没有分配临时对象:0(零)垃圾回收。
有两个单独的系统属性可用于手动控制 Log4j用于避免创建临时对象的机制: |
|