Spring-boot2使用log4j2将日志写入数据库

1.导入依赖

Spring-boot2 中Starters包含log4j2,所以进入log4j2只要引入以下依赖性进入pom.xml

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    但是springboot默认使用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>

2.配置lo4j2

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<Configuration status="WARN" monitorInterval="30">
	<!--全局属性 -->
	<Properties>
		<Property name="LOG_FILE_PATH">D:/apache-tomcat-8.5.33/logs</Property>
		<!-- linux日志存放路径 <Property name="LOG_FILE_PATH">/usr/logs</Property> -->
		<Property name="PATTERN_FORMAT">%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L
			%M - %msg%xEx%n</Property>
	</Properties>
	<CustomLevels>
	    <CustomLevel name="OPERATING" intLevel="350" />
	 </CustomLevels>
	<Appenders>
		<!--输出到控制台 -->
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout pattern="${PATTERN_FORMAT}" />
		</Console>
 
 
		<!--输出到文件 用来定义超过指定大小自动删除旧的创建新的的Appender. -->
		<RollingFile name="RollingInfoFile" fileName="${LOG_FILE_PATH}/pinyu.log"
			filePattern="${LOG_FILE_PATH}/$${date:yyyyMM}/info-%d{yyyyMMdd}-%i.log.gz">
			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<Filters>
				<ThresholdFilter level="warn" onMatch="DENY"
					onMismatch="NEUTRAL" />
				<ThresholdFilter level="debug" onMatch="ACCEPT"
					onMismatch="DENY" />
			</Filters>
 
			<PatternLayout>
				<pattern>${PATTERN_FORMAT}</pattern>
			</PatternLayout>
 
			<Policies>
				<!-- rollover on startup, daily and when the file reaches 10 MegaBytes -->
				<OnStartupTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="100 MB" />
				<TimeBasedTriggeringPolicy />
			</Policies>
		</RollingFile>
 
		<!--保存到数据库配置文件 -->
		<JDBC name="DatabaseAppender" tableName="sys_logs">
			<ConnectionFactory
				class="com.pinyu.system.global.config.log4j2.ConnectionFactory"
				method="getDatabaseConnection" />
			<!-- 方法名 -->
			<Column name="function" pattern="%M" />
			<!-- 日志级别 -->
			<Column name="level" pattern="%level" />
			<Column name="logger" pattern="%logger" />
			<!---->
			<Column name="class" pattern="%C" />
			<!-- 时间 -->
			<Column name="create_date" pattern="%d{yyyy-MM-dd hh:mm:ss}" />
			<!-- 日志内容 -->
			<Column name="message" pattern="%message" />
			
			<Column name="user_id" pattern="%X{userId}" />
			<Column name="creater" pattern="%X{creater}" />
			<Column name="ip" pattern="%X{ip}" />
			<Column name="create_user_name" pattern="%X{createUserName}" />
			<Column name="type" pattern="%X{type}" />
		</JDBC>
	</Appenders>
 
	<Loggers>
 
		<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
		<Logger name="org.springframework" level="INFO" />
		<Logger name="org.mybatis" level="INFO" />
 
		<!-- LOG "com.luis*" at TRACE level -->
		<Logger name="com.luis" level="INFO" />
 
		<!-- LOG everything at INFO level -->
		<Root level="ALL">
			<AppenderRef ref="Console" />
			<AppenderRef ref="RollingInfoFile" />
			<AppenderRef ref="RollingWarnFile" />
			<AppenderRef ref="RollingErrorFile" />
			<AppenderRef ref="DatabaseAppender" level="operating"/>
		</Root>
<!-- 		<Root level="OPERATION"> -->
<!-- 		</Root> -->
	</Loggers>
 
</Configuration>

3. 配置Hikari数据库连接池(springboot默认的)

在config路径下创建新的类ConnectionFactoryConfig,初始化Hikari的数据库连接池,返回一个Connection.

package com.sdk.management.config;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * @author caohongyun
 */
public class ConnectionFactoryConfig{

    private static interface Singleton{
       final ConnectionFactoryConfig INSTANCE = new ConnectionFactoryConfig();
    }

    private HikariDataSource dataSource;

    private ConnectionFactoryConfig(){

        //也可以使用配置文件直接加载
//        HikariConfig config = new HikariConfig("application.properties");
//        this.dataSource = new HikariDataSource(config);

        String user = "xxxxx";
        String password = "xxxxxx";
        String url = "jdbc:mysql://127.0.0.1:3306/xxxxxx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
        String driverClassName = "com.mysql.cj.jdbc.Driver";

        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driverClassName);
        config.setJdbcUrl(url);
        config.setUsername(user);
        config.setPassword(password);
        config.addDataSourceProperty("cachePrepStmts","true");
        config.addDataSourceProperty("prepstmtCacheSize","250");
        config.addDataSourceProperty("prepstmtCacheSqlLimit","2048");
        //设置连接超时为8小时
        config.setConnectionTimeout(8*60*60);
        this.dataSource = new HikariDataSource(config);
    }
    
    public static Connection getDatabaseConnection() throws SQLException{
        return Singleton.INSTANCE.dataSource.getConnection();
    }
}

配置文件详解
(1).根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).

    status:Configuration的属性,用来指定log4j本身的打印日志的级别.

    monitorinterval:Configuration的属性,用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.

(2).Appenders节点,常见的有三种子节点:Console、RollingFile、File.

Console节点用来定义输出到控制台的Appender.

    name:Console的属性,指定Appender的名字.

    target:Console的属性,SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.

    PatternLayout:Console的子节点,输出格式,不设置默认为:%m%n.

File节点用来定义输出到指定位置的文件的Appender.

    name:File的属性,指定Appender的名字.

    fileName:File的属性,指定输出日志的目的文件带全路径的文件名.

    PatternLayout:File的子节点,输出格式,不设置默认为:%m%n.

RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.

    name:RollingFilede的属性,指定Appender的名字.

    fileName:RollingFilede的属性,指定输出日志的目的文件带全路径的文件名.

    filePattern:RollingFilede的属性,指定新建日志文件的名称格式.

    PatternLayout:RollingFilede的子节点,输出格式,不设置默认为:%m%n.

    DefaultRolloverStrategy:RollingFilede的子节点,用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

    Policies:RollingFilede的子节点,指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.

        TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.

        SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.

    Filters:RollingFilede的子节点,决定日志事件能否被输出。过滤条件有三个值:ACCEPT(接受), DENY(拒绝) or NEUTRAL(中立)(后面具体讲)

    ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。所以,在组合过滤器中,接受使用NEUTRAL(中立),被第一个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件。

        ThresholdFilter:Filters的子节点

            level:ThresholdFilterde的属性,将被过滤的级别。

            onMatch:ThresholdFilterde的属性,默认值是NEUTRAL

            onMismatch:ThresholdFilterde的属性,默认是DENY

(3).Loggers节点,常见的有两种:Root和Logger.

Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

    level:Root属性,日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

    appender-ref:Root的子节点,用来指定该日志输出到哪个Appender,通过ref指定.

Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

    level:Logger属性,日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

    name:Logger属性,用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.

    additivity:Logger属性

appender-ref:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

4.创建数据库就不说了

5.测试功能

   /*
    * 测试输出日志到数据库
    * */
    @GetMapping("warn")
    public Object errorTest() {
        logger.error("除数不能为0啊!");
        int i=1/0;
        return null;
    }

你可能感兴趣的:(Spring-boot2使用log4j2将日志写入数据库)