Spring Boot Log4j2 日志简单使用

源码:https://github.com/yulc-coding/java-note/tree/master/log4j2

相关文章: Spring Boot Logback 日志简单使用

功能点

  • 不同级别生成不同日志文件;
  • 设置单个日志文件的大小;
  • 按日期生成日志文件;
  • 生成自定义类别日志文件;
  • 设置指定包或者类的日志输出级别;
  • 异步记录日志(需要引入 LMAXDisruptor)

开始

  • Log4j2配置和Logback类似
  • Spring Boot 默认使用了Logback作为日志框架,所以要在pom中去除对Logback的引用
  • 如果需要实现异步日志功能,需要在pom中引入LMAXDisruptor
  • 在 src/main/resources 下新建XML文件 log4j2.xml

pmx文件

        <!--使用 log4j2 Spring-boot中去掉logback的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <!-- 使用log4j2进行日志输出-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        
        <!-- 异步日志支持 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.2</version>
        </dependency>

基本结构

<!--
    status 表示log4j2本身打印日志的级别
    monitorInterval:自动检测修改配置文件和重新配置本身的时间,单位秒
-->
<Configuration status="INFO" monitorInterval="60">
    <!--变量配置,通过${name} 来引用-->
    <Properties>
        <property name="" value="" />
    </Properties>

    <!-- 配置日志输出格式 -->
    <Appenders>
        <!-- 控制台打印 -->
        <Console name="" target="SYSTEM_OUT">
            <!-- 格式化输出 -->
            <PatternLayout pattern=""/>
        </Console>

        <!--将日志输出到文件,append为true,则在日志文件中追加日志,为false则每次项目启动清空文件重新生成,实际作用不大-->
        <File name="" fileName="" append="true">
            <!-- 日志级别过滤 -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="" />
        </File>

        <!--滚动的方式生成文件 fileName最新的文件名,filePattern 归档的文件名格式 -->
        <RollingFile name="" fileName="" filePattern="">
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <!--
                    interval属性用来指定多久滚动一次,默认是1,这里配合filePattern
                    如果 filePattern 为 yyyy-MM-dd,则按天生成归档日志
                    如果 filePattern 为 yyyy-MM-dd HH-mm,则按分钟生成归档日志
                -->
                <TimeBasedTriggeringPolicy interval="1"/>
                <!--单个文件的大小-->
                <SizeBasedTriggeringPolicy size="5M"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy fileIndex="max" max="15"/>
        </RollingFile>
    </Appenders>

    <!-- 配置要输出的日志 -->
    <Loggers>
        <!-- 自定义输出 -->
        <logger name="" level="" additivity="">
            <AppenderRef ref="" />
        </logger>

        <!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
        <AsyncLogger name="" level="" additivity="">
            <AppenderRef ref=""/>
        </AsyncLogger>

        <!-- 指定项目的根日志 -->
        <Root level="info">
            <AppenderRef ref=""/>
            <AppenderRef ref=""/>
        </Root>
    </Loggers>

</Configuration>
Properties 自定义变量
<Properties>
        <!--
            格式化输出:
            %d表示日期;
            %X打印自定义的数据,通过 org.sl4j.MDC 设置,ex: MDC.put("user", "aaa");
            %thread表示线程名;
            %-5level:级别从左显示5个字符宽度;
            %logger{50} 表示logger名字最长50个字符,否则按照句点分割
            %msg:日志消息;
            %n是换行符
        -->
        <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{user}]-[%X{args}] [%thread] %-5level %logger{50} - %msg%n" />
        <!-- 定义日志存储的路径-->
        <property name="LOG_HOME" value="./logs/" />
    </Properties>
Appenders 配置日志输出格式
  • Console:控制台打印
    <!-- 控制台打印 -->
    <Console name="STDOUT" target="SYSTEM_OUT">
        <PatternLayout pattern="${LOG_PATTERN}"/>
    </Console>
  • File:普通日志文件输出
   <!--文件会打印出所有信息,append为true,则在日志文件中追加日志,为false则每次项目启动清空文件重新生成,实际作用不大-->
    <File name="FileLog" fileName="${LOG_HOME}/file.log" append="true">
        <!-- 只输出info及以上级别的信息(info、warn、error)(onMatch),其他的直接拒绝(onMismatch) -->
        <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        <PatternLayout pattern="${LOG_PATTERN}" />
    </File>
  • RollingFile:按照配置的规则滚动式输出日志文件
    <!-- 常规info,
        fileName为最新的日志文件,
        每当大小超过size,则会以 filePattern 的格式重新生成一个归档文件 
        这里设置每天会生成一个归档文件
    -->
    <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/info-%d{yyyy-MM-dd}-%i.log">
        <!-- 只打印info级别日志 注意先后顺序,优先排除不需要的级别-->
            <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        <PatternLayout pattern="${LOG_PATTERN}" />
        <Policies>
            <!--
                interval属性用来指定多久滚动一次,默认是1,这里配合filePattern
                如果 filePattern 为 yyyy-MM-dd,则按天生成归档日志
                如果 filePattern 为 yyyy-MM-dd HH-mm,则按分钟生成归档日志
            -->
            <TimeBasedTriggeringPolicy interval="1"/>
            <!-- 指定单个日志文件的大小 -->
            <SizeBasedTriggeringPolicy size="5M"/>
        </Policies>
        <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
        <DefaultRolloverStrategy fileIndex="max" max="7"/>
    </RollingFile>
Loggers 设置要打印的日志

包含 Logger 和 Root
Logger自定义设置,可以设置指定包活着类的日志级别,方便与调试、可以设置指定包或者类或者指定logger输出到单独的文件、可以一步输出日志(需要LMAXDisruptor的支持)
Root 根日志设置,所有Logger

    <Loggers>
        <!--设置指定包或类的日志级别,ex: 过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>

        <!-- 指定具体的包或者类生成单独的文件 additivity 为false 日志不会向上传递,为true,在对应的root日志里面也会打印-->
        <Logger name="org.ylc.note.log4j2.service" level="info" additivity="false">
            <AppenderRef ref="RollingFileMyService" />
        </Logger>

        <!-- 指定logger为 schedule 的日志生成单独的文件 这里的name 和 LoggerFactory.getLogger("schedule") 中的属性一样-->
        <Logger name="schedule" level="info" additivity="false">
            <AppenderRef ref="RollingFileSchedule" />
        </Logger>

        <!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
        <AsyncLogger name="asyncLog" level="info" additivity="false">
            <AppenderRef ref="RollingFileAsync"/>
        </AsyncLogger>

        <!-- 指定项目的根日志 -->
        <Root level="info">
            <AppenderRef ref="STDOUT"/>
            <AppenderRef ref="FileLog"/>
            <AppenderRef ref="RollingFileInfo"/>
            <AppenderRef ref="RollingFileError"/>
        </Root>
    </Loggers>

单元测试

@SpringBootTest
class Log4j2ApplicationTests {

    /**
     * 普通类日志
     */
    private final Logger normalLogger = LoggerFactory.getLogger(Log4j2ApplicationTests.class);

    /**
     * 定时任务类日志,这里的name必须和XML中logger 的name一致,这里为 schedule
     */
    private final Logger scheduleLogger = LoggerFactory.getLogger("schedule");

    /**
     * 异步处理日志
     */
    private final Logger asyncLogger = LoggerFactory.getLogger("asyncLog");

    @Autowired
    private MyService myService;

    /**
     * 普通日志测试
     */
    @Test
    void normalLogTest() {
        normalLogger.debug("this is a debug log with out args");
        normalLogger.info("this is a info log with out args");
        normalLogger.error("this is a error log with out args");
    }

    /**
     * 带参数的日志测试
     */
    @Test
    void argsLogTest() {
        MDC.put("user", "鱼大仙");
        MDC.put("args", "参数");
        normalLogger.debug("this is a debug log with args");
        normalLogger.info("this is a info log with args");
        normalLogger.error("this is a error log with args");
    }

    /**
     * 独立日志测试
     * 1、指定日志名称
     * 2、指定包或者类
     */
    @Test
    void independentLogTest() {
        // 指定名称
        scheduleLogger.debug("this is a schedule debug log");
        scheduleLogger.info("this is a schedule info log");
        scheduleLogger.error("this is a schedule error log");
        // 指定包或者类
        myService.myLog();
    }

    /**
     * 异步日志
     */
    @Test
    void asyncLogTest() {
        asyncLogger.debug("this is a async log -- debug");
        asyncLogger.info("this is a begin async log -- info");
        asyncLogger.error("this is a begin async log -- error");
    }

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

推荐阅读更多精彩内容