log4j2 使用

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 日志是一个系统经常用到的功能,我们可以在调试的时候依靠日志查看输出,在程序运行的时候通过查看日志判断程序运行状态。...
    年少懵懂丶流年梦阅读 5,741评论 0 4
  • 项目背景 1 因为项目需要,需要对客户端的一个控件做访问日志记录。用以统计页面过去七天的平均数量。项目中一直使用L...
    野兽工程师阅读 37,242评论 1 2
  • 使用属性 在复杂的项目中,可能有一些约定的属性比如项目名称、配置文件路径等等。这些属性可能会在多个日志的配置中用到...
    年少懵懂丶流年梦阅读 742评论 1 3
  • 001 快乐有三个层级:最低级-竞争式快乐:我比你好,所以我快乐;第二级-条件式快乐-只要满足了条件,就快乐;第三...
    筱筱宇下阅读 166评论 0 0
  • 姓名:颜萍 公司:上海晋名实业有限公司 六项精进361期学员【日精进打卡第90天】 六项精进375期志工【日精进打...
    颜儿有幸阅读 147评论 0 0