log4j2 使用

作者: 崔小妖 | 来源:发表于2019-04-11 17:42 被阅读0次

log4j2特点

  1. API 分离
  2. 性能提升尤其在多线性的时候

log4j logback性能比较参考
http://logging.apache.org/log4j/2.x/manual/async.html#Performance

  1. 支持多种API 如Log4j 1.2、SLF4J、java.util.logging (JUL) API等
  2. 避免封闭
  3. 自动重新加载配置
  4. 更高级的过滤
  5. 插件架构
  6. 支持属性
  7. 支持java8 Lambda表达式
  8. 自定义日志等级
  9. 不会产生垃圾,减轻垃圾收集器的压力从而提升性能
  10. 与应用服务器集成

版本需求

log4j2 java
>2.4 >7
2.0 - 2.3 6

log4j2 不兼容 log4j1 但是你可以通过adapter来使用log4j1的api

Log4j2 API

  1. 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();

格式化输出结果


helloworld.png

3.参数替换

logger.info("Logging in user {} with birthday {}", "yao.cui", "1990-09-09");

内容输出如下


params.png
  1. 格式化参数
    你需要调用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";
    }
}

格式化结果如下


image.png
  1. 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());
image.png
配置
<?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,如果一条日志信息的级别大于等于配置文件中声明的级别,则记录该日志信息。

相关文章

网友评论

    本文标题:log4j2 使用

    本文链接:https://www.haomeiwen.com/subject/ygvniqtx.html