SpringBoot2.1.4整合log4j2保存日志到MySQL中

SpringBoot2.1.4整合log4j2保存日志到MySQL中_第1张图片

一、框架版本

springboot2.1.4,log4j2(2.11.2),MySQL5.7

maven依赖请自行上网百度,本文不再赘述,网上大多是基于log4j2-spring.xml方式配置jdbc appender,本文基于javaconfig方式配置JdbcAppender,并指定logger输出日志到mysql中,直接上代码。

二、日志表设计

CREATE TABLE `cps_sys_log` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `CLASS` varchar(255) DEFAULT '' COMMENT '类',
  `METHOD` varchar(255) DEFAULT '' COMMENT '方法',
  `THREAD` varchar(255) DEFAULT '' COMMENT '线程',
  `LEVEL` varchar(31) DEFAULT '' COMMENT '日志级别:All < Trace < Debug < Info < Warn < Error < Fatal < OFF',
  `LINE` varchar(4096) DEFAULT '' COMMENT '代码中的行数',
  `MSG` text COMMENT '日志内容',
  `CREATE_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`ID`) USING BTREE,
  KEY `IDX_THREAD` (`THREAD`) USING BTREE,
  KEY `IDX_CREATE_TIME` (`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='日志记录表';

三、代码实现

配置类实现如下:

@Component
public class Log4j2Configuration implements ApplicationListener {
    private final DataSource dataSource;

    public Log4j2Configuration(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final ColumnConfig[] cc = {
                ColumnConfig.newBuilder().setConfiguration(ctx.getConfiguration()).setName("CLASS")
                        .setPattern("%c")
                        .setUnicode(false)
                        .build(),
                ColumnConfig.newBuilder().setConfiguration(ctx.getConfiguration()).setName("METHOD")
                        .setPattern("%M")
                        .setUnicode(false)
                        .build(),
                ColumnConfig.newBuilder().setConfiguration(ctx.getConfiguration()).setName("THREAD")
                        .setPattern("%t")
                        .setUnicode(false)
                        .build(),
                ColumnConfig.newBuilder()
                        .setConfiguration(ctx.getConfiguration()).setName("LEVEL").setPattern("%p")
                        .setUnicode(false)
                        .build(),
                ColumnConfig.newBuilder().setConfiguration(ctx.getConfiguration()).setName("LINE")
                        .setPattern("%l")
                        .setUnicode(false)
                        .build(),
                ColumnConfig.newBuilder().setConfiguration(ctx.getConfiguration()).setName("MSG")
                        .setPattern("%m")
                        .setUnicode(false)
                        .build(),
                ColumnConfig.newBuilder().setConfiguration(ctx.getConfiguration()).setName("CREATE_TIME")
                        .setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS}")
                        .setUnicode(false)
                        .build()
        };

        //配置appender
        final Appender appender = JdbcAppender
                .newBuilder()
                .setName("databaseAppender")
                .setIgnoreExceptions(false)
                .setConnectionSource(new ConnectionFactory(dataSource))
                .setTableName("cps_sys_log")
                .setColumnConfigs(cc)
                .setColumnMappings(new ColumnMapping[0])
                .build();
        appender.start();

        ctx.getConfiguration().addAppender(appender);
        //指定哪些logger输出的日志保存在mysql中
        ctx.getConfiguration().getLoggerConfig("org.mybatis").addAppender(appender, null, null);
        ctx.getConfiguration().getLoggerConfig("org.springframework").addAppender(appender, null, null);
        ctx.getConfiguration().getLoggerConfig("com.alibaba.dubbo").addAppender(appender, null, null);
        ctx.getConfiguration().getLoggerConfig("druid.sql").addAppender(appender, null, null);
        ctx.updateLoggers();
    }

数据源的工厂类

public class ConnectionFactory extends AbstractConnectionSource {
    private final DataSource dataSource;

    public ConnectionFactory(DataSource dataSource) {
        AssertUtils.notNull(dataSource, "dataSource");
        this.dataSource = dataSource;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

注意事项

log4j2的异步存储时,是不会记录日志的位置信息(%l)的,需要在具体的AsyncLogger属性中指定includeLocation="true"才可以,样例配置如下:


	  		
	  		
	  		
	  

四、日志保存结果

SpringBoot2.1.4整合log4j2保存日志到MySQL中_第2张图片

至此,基于springboot实现将log4j2日志保存到mysql的实现完毕,希望可以帮助到有需要的朋友们!

你可能感兴趣的:(知识沉淀,log4j2,mysql,spring,boot,java)