log4j2特点
- API 分离
- 性能提升尤其在多线性的时候
log4j logback性能比较参考
http://logging.apache.org/log4j/2.x/manual/async.html#Performance
- 支持多种API 如Log4j 1.2、SLF4J、java.util.logging (JUL) API等
- 避免封闭
- 自动重新加载配置
- 更高级的过滤
- 插件架构
- 支持属性
- 支持java8 Lambda表达式
- 自定义日志等级
- 不会产生垃圾,减轻垃圾收集器的压力从而提升性能
- 与应用服务器集成
版本需求
log4j2 | java |
---|---|
>2.4 | >7 |
2.0 - 2.3 | 6 |
log4j2 不兼容 log4j1 但是你可以通过adapter来使用log4j1的api
Log4j2 API
- hello world
获取loger实例 打印log
@RestController
public class MainPracticeController {
private static final Logger logger = LogManager.getLogger(MainPracticeController.class);
@RequestMapping("/hello")
String home(){
logger.info("hello world");
return "hello word";
}
}
2.Logger的名称可以是
LogManager.getLogger(MainPracticeController.class)
LogManager.getLogger(MainPracticeController.class.getName());
LogManager.getLogger();
格式化输出结果
3.参数替换
logger.info("Logging in user {} with birthday {}", "yao.cui", "1990-09-09");
内容输出如下
- 格式化参数
你需要调用getFormatterLogger来获取Logger,格式化用法同java 的string Formatter.
@RestController
public class MainPracticeController {
private static final Logger logger = LogManager.getFormatterLogger(MainPracticeController.class);
@RequestMapping("/hello")
String home(){
logger.info("hello world");
logger.info("Logging in user {} with birthday {}", "yao.cui", "1990-09-09");
logger.info("Logging in user %s with birthday %s", "yao.cui", "1990-09-06");
logger.info("Logging in user %1$s with birthday %2$tm %2$te,%2$tY", "yao.cui", new Date());
logger.info("Integer.MAX_VALUE = %,d", Integer.MAX_VALUE);
logger.info("Long.MAX_VALUE = %,d", Long.MAX_VALUE);
return "hello word";
}
}
格式化结果如下
- Loggers 和 Formatter Loggers混合
Formatter Loggers 有一个缺点就是必须正确的匹配类型,比如你在格式化 %d 时给入的参数不是数值类型 那就会抛异常,如果你大部分情况下都是想使用{}类型的参数,只是某个地方想要格式化,那么就可以使用这种方式,同formater一样 数据类型不正确也会抛出异常。
private static final Logger logger = LogManager.getLogger(MainPracticeController.class);
logger.debug("Opening connection to {}...", someDataSource);
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", "yao.cui", new Date());
配置
<?xml version="1.0" encoding="UTF-8"?>
<!--
status: log4j 内部事件日志等级 trace, debug, info, warn, error 和 fatal
monitorInterval:自动加载配置间隔时间 最小5s
-->
<Configuration status="warn" monitorInterval="30">
<Properties>
<Property name="PID">????</Property>
<!--
日志格式 字符说明:https://logging.apache.org/log4j/2.x/manual/layouts.html
%d:日期 %m:输出代码中指定的消息 %n:换行符 %p:优先级 即DEBUG,INFO,WARN,ERROR,FATAL
%t:输出产生该日志事件的线程名 %c:输出所属的类目通常就是所在类的全名
-->
<Property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
<!--日志文件地址,目录文件不存在会则自动创建-->
<Property name="FILE_PATH">logs</Property>
<Property name="FILE_NAME">pratice</Property>
</Properties>
<!--日志输出目的地-->
<Appenders>
<!--写到控制台 同 system.out/system.err-->
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出info级别以上的日志 否则不记录-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<!--写入到文件 通过 FileManager, RandomAccessFile强制使用缓冲性能高于File-->
<File name="FileAppender" fileName="${FILE_PATH}/${FILE_NAME}.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!--异步写入文件日志-->
<Async name="AsyncAppender">
<AppenderRef ref="FileAppender"/>
</Async>
<!--所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileAppender" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</Appenders>
<Loggers>
<!--单独指定日志解绑-->
<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
<!--通用日志级别-->
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="AsyncAppender"/>
<AppenderRef ref="RollingFileAppender"/>
</Root>
</Loggers>
</Configuration>
说明
日志级别:All < Trace < Debug < Info < Warn < Error < Fatal < OFF,如果一条日志信息的级别大于等于配置文件中声明的级别,则记录该日志信息。