当前位置: 首页 > article >正文

spring6启用Log4j2日志

pom文件

<!--log4j2的依赖-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.23.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j2-impl</artifactId>
    <version>2.23.1</version>
</dependency>

log4j2.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <loggers>
        <root level="DEBUG">
            <appender-ref ref="spring6log"/>
        </root>
    </loggers>
    <appenders>
        <console name="spring6log" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger-{1024} - %msg%n"/>
        </console>
    </appenders>
</configuration>

pattern定义日志输出格式:

配置 说明

%d{HH:mm:ss.SSS} 输出日志打印的时间,精确到毫秒

[%t] 输出当前线程名称

%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,不足在右边补空格

%logger{36} 输出logger名称,一般是类的全限定路径名

%msg 输出要打印的业务日志信息

%n 日志换行

实际会输出如下日志:

11:33:08.438 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log

Log4j2共有8种日志级别,

按照优先级从小到大排序:

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
    <!--properties-->
    <properties>
        <!-- 运行日志位置-->
        <property name="LOG_HOME">logs</property>
        <!-- info日志滚动仓库-->
        <property name="LOG_REPO">logs/%d{yyyy-MM-dd}</property>
        <!-- 错误日志滚动仓库-->
        <property name="WARN_REPO">logs/error</property>
        <!--日志格式-->
        <property name="LOG_PATTERN">%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n</property>
        <!--文件过期时间-->
        <property name="LOG_EXPIRE">15d</property>
        <!--单文件大小-->
        <property name="LOG_SIZE">100MB</property>
    </properties>
    <!--appenders -->
    <appenders>
        <!--控制台输出配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式 -->
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
 
        <!--打印出所有的info信息,每小时滚动一次,单文件最大100M,文件最多保留15天 -->
        <RollingFile name="InfoFile" fileName="${LOG_HOME}/game.log"
                     filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--每小时滚动一次,单文件最大100M-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="10">
                <!-- 每个文件最长保留时长=>15天-->
                <Delete basePath="logs/" maxDepth="2">
                    <IfFileName regex=".*log" />
                    <IfLastModified age="${LOG_EXPIRE}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
        <!--打印出所有的warn/error信息,单文件最大100M后滚动,文件最多保留15天 -->
        <RollingFile name="WarnFile" fileName="${LOG_HOME}/game.warn.log"
                     filePattern="${WARN_REPO}/game.%d{yyyy-MM-dd}.%i.log">
            <Filters>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--单文件最大100M-->
                <SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy>
                <!-- 每个文件最长保留时长=>15天-->
                <Delete basePath="logs/" maxDepth="2">
                    <IfFileName regex=".*log" />
                    <IfLastModified age="${LOG_EXPIRE}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
    </appenders>
 
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <!--运行日志-->
        <logger name="com.msgame" additivity="false">
            <level value="INFO"/>
            <appenderRef ref="InfoFile"/>
            <appenderRef ref="WarnFile"/>
            <appenderRef ref="Console"/>
        </logger>
        <!--默认日志 -->
        <root level="info">
            <appender-ref ref="InfoFile"/>
        </root>
    </loggers>
</configuration>

测试代码

package org.apache.logging.log4j;

public class Log4j2Test {
    private static Logger LOG = LogManager.getLogger(Log4j2Test.class);

    public static void main(String[] args) throws Exception {
        // 一直打印日志,用于测试Log4j2功能
        while (true) {
            logAll();
        }
    }

    // 打印各种级别的日志用于测试
    public static void logAll() throws Exception {
        LOG.trace("trace level log");
        LOG.debug("debug level log");
        LOG.info("info level log");
        LOG.error("error level log");
        LOG.fatal("fatal level log");
        // 设置休眠时间(单位ms),控制日志打印速度
        Thread.sleep(3);
    }
}


http://www.kler.cn/news/329686.html

相关文章:

  • MySQL高阶2066-账户余额
  • 本地部署开源在线PPT制作与演示应用PPTist并实现异地远程使用
  • 【python实操】python小程序之过七游戏以及单词单复数分类
  • Java - LeetCode面试经典150题(三)
  • 交换基础【计算机网络】
  • MySQL 5.7 数据库的备份与恢复
  • Java项目实战II基于Java+Spring Boot+MySQL的美容院管理系统设计与实现(源码+数据库+文档)
  • 在线css像素px到rem的转换器
  • 准备蓝桥杯和ACM:C++标准库头文件及其常用功能简介
  • 服务器使用frp做内网穿透详细教程,请码住
  • Js运算符(操作符)
  • Swoft2.0学习笔记
  • ESP32 Bluedroid 篇(1)—— ibeacon 广播
  • 软件设计——随手笔记
  • Pytest+selenium UI自动化测试实战实例
  • (8)mysql容器启动第一次无论输入密码与否均会报错处理
  • 检索增强生成(RAG)有什么好的优化方案?
  • 拦截器 Interceptor 详解
  • react中的ref三种形式
  • C# Windows EventHandler事件的使用
  • 足球青训俱乐部管理:Spring Boot技术驱动
  • 两个圆形 一个z里面一个z外面,z里面的大,颜色不同 html
  • 通信工程学习:什么是FTP文件传输协议
  • C++系列-继承补充
  • 【Redis 源码】7RDB持久化
  • 迈德斯特升降桌使用说明
  • 5个python多线程简单示例
  • 封装轮播图 (因为基于微博小程序,语法可能有些出入,如需使用需改标签)
  • [Day 77] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • java往word中添加水印,往excel中添加图片