JUL

JUL是Java原生日志框架
java.util.logging
image.png

  • Logger快速入门

    1. @Test
    2. public void test() throws IOException {
    3. //获取日志记录器对象
    4. Logger logger = Logger.getLogger("LogsTest.test");
    5. //关闭系统默认配置
    6. logger.setUseParentHandlers(false);
    7. //设置日志级别
    8. logger.setLevel(Level.ALL);
    9. //创建简单格式转换对象
    10. SimpleFormatter simpleFormatter = new SimpleFormatter();
    11. //创建 consoleHandler 控制台输出
    12. ConsoleHandler consoleHandler = new ConsoleHandler();
    13. consoleHandler.setLevel(Level.ALL);
    14. consoleHandler.setFormatter(simpleFormatter);
    15. logger.addHandler(consoleHandler);
    16. //创建 FileHandler 文件输出
    17. //需要有文件
    18. FileHandler fileHandler = new FileHandler("jul.log");
    19. fileHandler.setFormatter(simpleFormatter);
    20. logger.addHandler(fileHandler);
    21. //输出所有级别日志
    22. logger.severe("severe");
    23. logger.warning("warning");
    24. logger.info("info");
    25. logger.config("config");
    26. logger.fine("fine");
    27. }
  • Logger对象父子关系

    1. @Test
    2. public void test() throws IOException {
    3. //根据包命名规范定义父记录器
    4. //子记录器会继承父记录器的级别
    5. Logger logger1 = Logger.getLogger("cn");
    6. Logger logger2 = Logger.getLogger("cn.landsall");
    7. //所有日志记录器的顶级父元素 LogManager$RootLogger
    8. //java.util.logging.LogManager$RootLogger@61e4705b
    9. System.out.println(logger1.getParent());
    10. System.out.println(logger2.getParent() == logger1);
    11. }
  • 读取配置文件

    1. @Test
    2. public void test() throws IOException {
    3. InputStream inputStream = LogsTest.class.getClassLoader().getResourceAsStream("logging,properties");
    4. LogManager logManager = LogManager.getLogManager();
    5. logManager.readConfiguration(inputStream);
    6. Logger logger = logManager.getLogger("cn.landsall");
    7. }

log4j

https://wiki.jikexueyuan.com/project/log4j/overview.html

  • maven

    1. <dependency>
    2. <groupId>log4j</groupId>
    3. <artifactId>log4j</artifactId>
    4. <version>1.2.12</version>
    5. </dependency>
  • log4j入门

    1. @Test
    2. public void log4jTest(){
    3. //初始化配置信息
    4. BasicConfigurator.configure();
    5. //创建日志记录器对象
    6. Logger logger = Logger.getLogger(LogsTest.class);
    7. //严重错误,一般会导致系统崩溃
    8. logger.fatal("fatal");
    9. //错误信息,不会影响系统运行
    10. logger.error("error");
    11. //警告信息
    12. logger.warn("warn");
    13. //运行信息
    14. logger.info("info");
    15. //调试信息
    16. logger.debug("debug");
    17. //追踪信息
    18. logger.trace("trace");
    19. }

    log4j组件

    image.png

    Loggers(记录器)

    image.png

    Appenders(输出源)

    image.png

    Layouts(布局)

    image.png

    配置文件

    log4j会读取Resource下的配置文件log4.xml 或 log4j.properties
    image.png
    Log4j内置日志
    LogLog.setInternalDebugging(true);


    日志格式

    SimpleLayout

    简单格式

    HTMLLayout

    html格式

    1. Log4j.appender.FILE.layout=org.apache.Log4j.HTMLLayout
    2. Log4j.appender.FILE.layout.Title=HTML Layout Example
    3. Log4j.appender.FILE.layout.LocationInfo=true

    image.png

方法 & 描述
setContentType(String)设置 HTML 的内容类型,默认为 text/html。
setLocationInfo(String)设置日志事件的地域信息。
setTitle(String)设置 HTML 文件的标题,默认为 Log4j Log Messages。

PatternLayout

自定义格式

  1. log4j.appender.console.layout = org.apache.log4j.PatternLayout
  2. # 指定PatternLayout的消息格式
  3. log4j.appender.console.layout.conversionPattern = [%-5p]%r %l %d{yyyy-MM-d HH:mm:ss.SSS} %m%n

模式转换字符

下面的表格解释了上面模式中用到的字符,以及所有定制模式时能用到的字符:

转换字符 含义
%c 使用它为输出的日志事件分类,比如对于分类 “a.b.c”,模式 %c{2} 会输出 “b.c” 。
%C 使用它输出发起记录日志请求的类的全名。比如对于类 “org.apache.xyz.SomeClass”,模式 %C{1} 会输出 “SomeClass”。
%d 使用它输出记录日志的日期,比如 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}。
%F 在记录日志时,使用它输出文件名。
%l 用它输出生成日志的调用者的地域信息。
%L 使用它输出发起日志请求的行号
%m 使用它输出和日志事件关联的,由应用提供的信息。
%M 使用它输出发起日志请求的方法名
%n 输出平台相关的换行符
%p 输出日志事件的优先级
%r 使用它输出从构建布局到生成日志事件所花费的时间,以毫秒为单位。
%t 输出生成日志事件的线程名。
%x 输出和生成日志事件线程相关的 NDC (嵌套诊断上下文)。
%X 该字符后跟 MDC 键,比如 X{clientIP} 会输出保存在 MDC 中键 clientIP 对应的值。
%% 百分号, %% 会输出一个 %。

格式修饰符

缺省情况下,信息保持原样输出。但是借助格式修饰符的帮助,就可调整最小列宽、最大列宽以及对齐。
下面的表格涵盖了各种修饰符:

格式修饰符 左对齐 最小宽度 最大宽度 注释
%20c 20 如果列名少于 20 个字符,左边使用空格补齐。
%-20c 20 如果列名少于 20 个字符,右边使用空格补齐。
%.30c 不适用 30 如果列名长于 30 个字符,从开头剪除。
%20.30c 20 30 如果列名少于 20 个字符,左边使用空格补齐,如果列名长于 30 个字符,从开头剪除。
%-20.30c 20 30 如果列名少于 20 个字符,右边使用空格补齐,如果列名长于 30 个字符,从开头剪除。

Appenders

ConsoleAppenders

输出到控制台

  1. # 指定日志级别=trace,添加 appender 名为console
  2. log4j.rootLogger = trace,console
  3. # 指定 console 的类型
  4. log4j.appender.console = org.apache.log4j.ConsoleAppender
  5. #指定 console 的 Layout
  6. log4j.appender.console.layout = org.apache.log4j.PatternLayout
  7. # 指定PatternLayout的消息格式
  8. log4j.appender.console.layout.conversionPattern = [%-5p]%r %l %d{yyyy-MM-d HH:mm:ss.SSS} %m%n

FileAppenders

输出到文件

  1. # 指定rootLogger的日志级别 trace,添加 appender 名为 file
  2. log4j.rootLogger = trace,file
  3. # 指定 file 的类型
  4. log4j.appender.file = org.apache.log4j.FileAppender
  5. # 指定 file 的layout
  6. log4j.appender.file.layout = org.apache.log4j.PatternLayout
  7. # 指定消息格式
  8. log4j.appender.file.layout.conversionPattern = [%-5p]%r %l %d{yyyy-MM-d HH:mm:ss.SSS} %m%n
  9. # 指定日志文件的保存路径
  10. log4j.appender.file.file = log4j.log
  11. # 指定日志文件字符集
  12. log4j.appender.file.encoding = UTF-8

RollingFileAppender

输出到多个文件(以文件大小拆分)

  1. # 指定日志级别 trace,指定 appender 为 rollingFile
  2. log4j.rootLogger = trace,rollingFile
  3. # 指定 appender 的类型
  4. log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
  5. # 指定 rollingFile 的 layout
  6. log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
  7. # 指定消息格式
  8. log4j.appender.rollingFile.layout.conversionPattern = [%-5p]%r %l %d{yyyy-MM-d HH:mm:ss.SSS} %m%n
  9. # 指定日志文件的保存路径
  10. log4j.appender.rollingFile.file = log4j.log
  11. # 指定日志文件字符集
  12. log4j.appender.rollingFile.encoding = UTF-8
  13. # 指定每个日志文件的最大容量 (KB,MB,GB)
  14. log4j.appender.rollingFile.maxFileSize = 1MB
  15. # 指定日志文件的数量 (超出数量会覆盖最早的)
  16. log4j.appender.rollingFile.maxBackupIndex = 10

image.png

DailyRollingFileAppender

以日期分隔日志文件

  1. # 指定日志级别 trace,指定 appender 为 dailyFile
  2. log4j.rootLogger = trace,dailyFile
  3. # 指定 appender 的类型
  4. log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
  5. # 指定 rollingFile 的 layout
  6. log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
  7. # 指定消息格式
  8. log4j.appender.dailyFile.layout.conversionPattern = [%-5p]%r %l %d{yyyy-MM-d HH:mm:ss.SSS} %m%n
  9. # 指定日志文件的保存路径
  10. log4j.appender.dailyFile.file = log4j.log
  11. # 指定日志文件字符集
  12. log4j.appender.dailyFile.encoding = UTF-8
  13. # 指定日期拆分规则 (只能用-分隔)
  14. log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss

image.png

DatePattern 描述
‘.’ yyyy-MM 在本月末,下月初回滚文件。
‘.’ yyyy-MM-dd 在每天午夜回滚文件,这是缺省值。
‘.’ yyyy-MM-dd-a 在每天中午和午夜回滚文件。
‘.’ yyyy-MM-dd-HH 在每个整点回滚文件。
‘.’ yyyy-MM-dd-HH-mm 每分钟回滚文件。
‘.’ yyyy-ww 根据地域,在每周的第一天回滚。

JDBCAppenders

JDBCAppender 配置

属性 描述
bufferSize 设置缓冲区大小,缺省为 1。
driver 以字符串形式设置驱动类,如果未设置,缺省为 sun.jdbc.odbc.JdbcOdbcDriver
layout 设置 layout,缺省为 org.apache.Log4j.PatternLayout
password 设置数据库密码。
sql 设置每次日志事件触发时需要执行的 SQL 语句,该语句可以是 INSERT、UPDATE 或 DELETE。
URL 设置 JDBC URL.
user 设置数据库用户名。
  1. # 指定日志级别 trace,指定 appender 为 logDB
  2. log4j.rootLogger = trace,logDB
  3. # 指定 appender 的类型
  4. log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
  5. # 驱动
  6. Log4j.appender.logDB.Driver = com.mysql.cj.jdbc.Driver
  7. # url
  8. Log4j.appender.logDB.URL = jdbc:mysql://ip/database?serverTimezone=Asia/Shanghai
  9. # 用户名密码
  10. Log4j.appender.logDB.User = admin
  11. Log4j.appender.logDB.Password = XXXXXX
  12. # 插入语句
  13. Log4j.appender.logDB.Sql = INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')
  14. # 指定 rollingFile 的 layout
  15. log4j.appender.logDB.layout = org.apache.log4j.PatternLayout

日志门面

image.png

JCL

image.png

  • Log的实现类

image.png

  • JCL支持的日志实现

image.png

SLF4J

简介

image.png
image.png

SLF4J入门

  • maven

    1. <!--slf4j 门面-->
    2. <dependency>
    3. <groupId>org.slf4j</groupId>
    4. <artifactId>slf4j-api</artifactId>
    5. <version>1.7.30</version>
    6. </dependency>
    7. <!--slf4j 实现-->
    8. <dependency>
    9. <groupId>org.slf4j</groupId>
    10. <artifactId>slf4j-simple</artifactId>
    11. <version>1.7.30</version>
    12. </dependency>
    1. public static final Logger LOGGER = LoggerFactory.getLogger(LogsTest.class);
    2. @Test
    3. public void log4jTest() {
    4. //日志输出
    5. LOGGER.error("error");
    6. LOGGER.warn("warn");
    7. LOGGER.info("info");
    8. LOGGER.debug("debug");
    9. LOGGER.trace("trace");
    10. //使用占位符
    11. String name = "admin";
    12. LOGGER.info("用户:{}登入", name);
    13. //将系统的异常信息输出
    14. try {
    15. int i = 10/0;
    16. }catch (Exception e){
    17. LOGGER.error("出现异常",e);
    18. }
    19. }

    绑定日志实现

    image.png

  • log4j和JUL需要导入适配器

    log4j

    1. <!-- log4j -->
    2. <dependency>
    3. <groupId>log4j</groupId>
    4. <artifactId>log4j</artifactId>
    5. <version>1.2.12</version>
    6. </dependency>
    7. <!-- log4j适配器 -->
    8. <dependency>
    9. <groupId>org.slf4j</groupId>
    10. <artifactId>slf4j-log4j12</artifactId>
    11. <version>1.7.30</version>
    12. </dependency>

    JUL

    1. <!-- JUL适配器 -->
    2. <dependency>
    3. <groupId>org.slf4j</groupId>
    4. <artifactId>slf4j-jdk14</artifactId>
    5. <version>1.7.30</version>
    6. </dependency>

    桥接器

    http://www.slf4j.org/legacy.html
    image.png

  • JCL

    1. <dependency>
    2. <groupId>org.slf4j</groupId>
    3. <artifactId>jcl-over-slf4j</artifactId>
    4. <version>1.5.6</version>
    5. </dependency>

日志实现

logback

https://www.cnblogs.com/cjsblog/p/9113131.html
image.png

组件

image.png

日志级别

从上往下递减
image.png

配置文件

image.png

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!--
  4. 属性 get ${name}
  5. -->
  6. <property name="pattern" value="[%-5level] %d{yyyy-mm-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>
  7. <!--
  8. 日志输出格式:
  9. %level 级别
  10. %d{yyyy-MM-dHH:mm:SS.SSS} 日期
  11. %c类的完整名称
  12. %M为 method
  13. %L为行号
  14. %thread 线程名称
  15. %m或者%msg为信息
  16. %n换行
  17. -->
  18. <!-- 控制台 appender -->
  19. <!-- name:console -->
  20. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  21. <!-- 控制输出流对象狀认 System.out 改为 System,err -->
  22. <target>System.err</target>
  23. <!-- 日志消息格式配置 -->
  24. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  25. <pattern>${pattern}</pattern>
  26. </encoder>
  27. </appender>
  28. <!-- root Logger配置 -->
  29. <root level="ALL">
  30. <appender-ref ref="console"/>
  31. </root>
  32. </configuration>

appender

ConsoleAppender

控制台输出

  1. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  2. <!-- 控制输出流对象狀认 System.out 改为 System,err -->
  3. <target>System.err</target>
  4. <!-- 日志消息格式配置 -->
  5. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  6. <pattern>${pattern}</pattern>
  7. </encoder>
  8. </appender>

FileAppender

  • log

    1. <!-- FileAppender -->
    2. <!-- name:file -->
    3. <appender name="file" class="ch.qos.logback.core.FileAppender">
    4. <!-- 日志文件保存路径 -->
    5. <file>logback.log</file>
    6. <!-- 日志消息格式配置 -->
    7. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    8. <pattern>${pattern}</pattern>
    9. </encoder>
    10. </appender>
  • html

    1. <!-- FileAppender 输出html-->
    2. <appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
    3. <!-- 日志文件保存路径 -->
    4. <file>logback.html</file>
    5. <!-- 日志消息格式配置 -->
    6. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    7. <layout class="ch.qos.logback.classic.html.HTMLLayout">
    8. <pattern>%-5level%d{yyyy-mm-dd HH:mm:ss.SSS}%c%M%L%thread%m</pattern>
    9. </layout>
    10. </encoder>
    11. </appender>

    RollingFileAppender

    实现日志拆分(时间和大小)和归档压缩

    1. <!-- RollingFileAppender -->
    2. <!-- 实现日志拆分(时间和大小)和归档压缩 -->
    3. <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
    4. <file>rolling_logback.log</file>
    5. <!-- 日志消息格式配置 -->
    6. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    7. <pattern>${pattern}</pattern>
    8. </encoder>
    9. <!-- 指定拆分规则 -->
    10. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    11. <!-- 按照时间和文件大小拆分的文件名 -->
    12. <fileNamePattern>rolling_logback.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
    13. <!-- 按照文件大小拆分 -->
    14. <maxFileSize>1MB</maxFileSize>
    15. </rollingPolicy>
    16. </appender>

    image.png
    rolling_logback.log 为最新的log文件
    其他文件为归档文件

    AsyncAppender

    异步日志
    在使用JDBC等耗时较大的情况下能够提高性能

    1. <!-- 异步日志 -->
    2. <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
    3. <!-- 指定某个具体的 appender -->
    4. <appender-ref ref="rollFile"/>
    5. </appender>


filter

  • Appender属性之一

日志级别过滤器

  1. <appender>
  2. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  3. <!-- 日志过滤规则 -->
  4. <!-- 拦截指定级别 ERROR -->
  5. <level>ERROR</level>
  6. <!-- 大于等于指定级别 ACCEPT放行 -->
  7. <omMatch>ACCEPT</omMatch>
  8. <!-- 小于指定级别 DENY拦截 -->
  9. <onMismatch>DENY</onMismatch>
  10. </filter>
  11. </appender>

自定义Logger

  1. <!--
  2. 自定义 logger 对象
  3. level 日志级别
  4. name="包名" 指定该包下的日志输出appender
  5. additivity="false" 该logger不会继承 rootLogger
  6. -->
  7. <logger name="cn.landsall" level="info" additivity="false">
  8. <appender-ref ref="console"/>
  9. </logger>

access

logback转换器

http://logback.qos.ch/translator/
log4j.properties 转换为 logback.xml

log4j2

http://logging.apache.org/log4j/2.x/index.html
https://www.docs4dev.com/docs/zh/log4j2/2.x/all/index.html#

  1. <!-- log4j2 门面 -->
  2. <dependency>
  3. <groupId>org.apache.logging.log4j</groupId>
  4. <artifactId>log4j-api</artifactId>
  5. <version>2.13.3</version>
  6. </dependency>
  7. <!-- log4j2 日志实现 -->
  8. <dependency>
  9. <groupId>org.apache.logging.log4j</groupId>
  10. <artifactId>log4j-core</artifactId>
  11. <version>2.13.3</version>
  12. </dependency>
  • 使用 slf4j 门面 ```xml org.slf4j slf4j-api 1.7.30
org.apache.logging.log4j log4j-slf4j-impl 2.13.3

org.apache.logging.log4j log4j-core 2.13.3

  1. <a name="Z0XNU"></a>
  2. ### Appender
  3. <a name="Tlbw0"></a>
  4. #### Console
  5. [https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-appenders.html#ConsoleAppender](https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-appenders.html#ConsoleAppender)
  6. ```xml
  7. <!-- 控制台输出 Appender -->
  8. <Console name="Console" target="SYSTEM_OUT">
  9. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36:L} --- %m%n"/>
  10. </Console>

File

  1. <!-- 文件输出 -->
  2. <File name="File" fileName="./logs/log4j2.log">
  3. <PatternLayout>
  4. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c{36} %L %M - %m%n</Pattern>
  5. </PatternLayout>
  6. </File>

RollingFile

  1. <RollingFile name="err" bufferedIO="true" fileName="${fileName}" filePattern="${filePatternSizeAndTime}">
  2. <PatternLayout pattern="${logPattern}" />
  3. <Policies>
  4. <!-- 根据时间切割日志 -->
  5. <!-- 当小时可被 6 整除时,它将每 6 小时滚动一次 -->
  6. <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
  7. <!-- 根据文件大小自动切割日志 -->
  8. <!-- 文件模式必须包含%i,否则目标文件将在每次翻转时均被覆盖 -->
  9. <SizeBasedTriggeringPolicy size="100KB" />
  10. </Policies>
  11. <!-- 相同切割模式的日志最多保留10份 -->
  12. <DefaultRolloverStrategy max="10" />
  13. </RollingFile>

JDBC

  • 不通过数据库连接池

性能最差

  1. <!-- 写入数据库 -->
  2. <JDBC name="databaseAppender" tableName="table">
  3. <DriverManager connectionString="jdbc:mysql://ip:datebase/table?serverTimezone=Asia/Shanghai"
  4. driverClassName="com.mysql.cj.jdbc.Driver"
  5. username="username"
  6. password="pasword" />
  7. <Column name="level" pattern="%level" />
  8. <Column name="logger" pattern="%logger" />
  9. <Column name="message" pattern="%message" />
  10. </JDBC>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration xmlns="http://logging.apache.org/log4j/2.0/config">
  3. <Properties>
  4. <!-- 定义日志格式 -->
  5. <Property name="logPattern">%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36:L} --- %m%n</Property>
  6. <!-- 定义文件名变量 -->
  7. <Property name="fileName">logs/app.log</Property>
  8. <Property name="filePatternSize">logs/app_%i.log</Property>
  9. <Property name="filePatternSizeAndTime">logs/$${date:yyyy-MM}/app_%d{yyyy-MM-dd}_%i.log</Property>
  10. </Properties>
  11. <!-- 定义Appender,即目的地 -->
  12. <Appenders>
  13. <!-- 定义输出到屏幕 -->
  14. <Console name="console" target="SYSTEM_OUT">
  15. <!-- 日志格式引用上面定义的log.pattern -->
  16. <PatternLayout pattern="${logPattern}"/>
  17. </Console>
  18. <!-- 定义输出到文件-->
  19. <RollingFile name="err" bufferedIO="true" fileName="${fileName}" filePattern="${filePatternSizeAndTime}">
  20. <PatternLayout pattern="${logPattern}"/>
  21. <Policies>
  22. <!-- 根据时间切割日志 -->
  23. <!-- 当小时可被 6 整除时,它将每 6 小时滚动一次 -->
  24. <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
  25. <!-- 根据文件大小自动切割日志 -->
  26. <!-- 文件模式必须包含%i,否则目标文件将在每次翻转时均被覆盖 -->
  27. <SizeBasedTriggeringPolicy size="100KB"/>
  28. </Policies>
  29. <!-- 相同切割模式的日志最多保留10份 -->
  30. <DefaultRolloverStrategy max="10"/>
  31. </RollingFile>
  32. <!-- 写入数据库 -->
  33. <JDBC name="databaseAppender" tableName="table">
  34. <DriverManager connectionString="jdbc:mysql://ip:datebase/table?serverTimezone=Asia/Shanghai"
  35. driverClassName="com.mysql.cj.jdbc.Driver"
  36. username="username"
  37. password="pasword" />
  38. <Column name="level" pattern="%level" />
  39. <Column name="logger" pattern="%logger" />
  40. <Column name="message" pattern="%message" />
  41. </JDBC>
  42. </Appenders>
  43. <Loggers>
  44. <Root level="info">
  45. <AppenderRef ref="databaseAppender" level="info"/>
  46. </Root>
  47. </Loggers>
  48. </Configuration>

PatternLayout

https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-layouts.html#PatternLayout

异步日志

  1. <!-- 异步日志依赖 -->
  2. <dependency>
  3. <groupId>com.lmax</groupId>
  4. <artifactId>disruptor</artifactId>
  5. <version>3.4.2</version>
  6. </dependency>

AsyncLogger方式

  • 全局异步

添加配置文件log4j2.component.properties

  1. #log4j2.component.properties
  2. Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
  • 混合异步
    1. <!--
    2. includeLocation="false" 不在打印位置信息,打印位置信息会急剧降低异步日志的性能
    3. -->
    4. <AsyncLogger name="cn.landsall" level="trace" includeLocation="false" additivity="false">
    5. <AppendeRef ref="Console"/>
    6. </AsyncLogger>