springboot集成Logback 日志写入数据库
引入maven依赖
<!-- logback日志-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
注意:springboot内部是有Logback的包,但是本人使用的时候缺少部分类文件,因此单独映入了一次
建表
logback有三张表logging_event、logging_event_exception、logging_event_property,不需要自己创建,只需要在如下位置找到自己保存的库表生成sql复制运行即可.
添加配置文件(logback-spring.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!--scan="true" 表示每60秒检测自动加载配置文件,debug="false" 无需打印logback自身日志信息-->
<configuration
scan="false"
scanPeriod="60 seconds"
debug="false">
<!--定义日志输出路径-->
<property name="log.filepath" value="logs" />
<!--定义日志展示各式
%d{yyyy-MM-dd HH:mm:ss.SSS} 定义日志展示时间
[%thread] 当前线程名称
%5-level 空出5个空格显示日志级别
%logger{100} 显示全限定类名,最大长度100
%msg%n 日志信息及换行-->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{100} %msg%n" />
<!-- 彩色日志依赖的渲染类与彩色日志格式 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--输出到控制台-->
<!-- 数据库的连接属性(注意,写自己的数据库配置文件目录) -->
<springProperty scope="context" name="DATA_SOURCE" source="spring.datasource.type" />
<springProperty scope="context" name="JDBC_URL" source="spring.datasource.dynamic.datasource.yeWu.url" />
<springProperty scope="context" name="USER_NAME" source="spring.datasource.dynamic.datasource.yeWu.username" />
<springProperty scope="context" name="PASSWORD" source="spring.datasource.dynamic.datasource.yeWu.password" />
<springProperty scope="context" name="DRIVER_CLASS_NAME" source="spring.datasource.dynamic.datasource.yeWu.driver-class-name" />
<!-- 输出到数据库 -->
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="${DATA_SOURCE}">
<url>${JDBC_URL}</url>
<username>${USER_NAME}</username>
<password>${PASSWORD}</password>
<driverClassName>${DRIVER_CLASS_NAME}</driverClassName>
</dataSource>
</connectionSource>
</appender>
<!--定义日志输出媒介,控制台输出-->
<appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--定义日志输格式-->
<pattern>${log.pattern}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--定义debug级别日志输出-->
<appender name="DEBUG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.filepath}/debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${log.pattern}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档-->
<!--<fileNamePattern>${log.filepath}/debug-%d{yyyy-MM-dd_HH_mm}.log.gz</fileNamePattern>-->
<fileNamePattern>${log.filepath}/debug-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过100M,若超过100M,日志文件会以索引0开始,命名日志文件,例如debug-2013-12-21.0.log.gz -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志最多保存的份数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--定义info级别日志输出-->
<appender name="INFO_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.filepath}/info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${log.pattern}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档-->
<!--<fileNamePattern>${log.filepath}/info-%d{yyyy-MM-dd_HH_mm}.log.gz</fileNamePattern>-->
<fileNamePattern>${log.filepath}/info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过100M,若超过100M,日志文件会以索引0开始,命名日志文件,例如info-2013-12-21.0.log.gz -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志最多保存的份数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--定义warn级别日志输出-->
<appender name="WARN_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.filepath}/warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${log.pattern}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档-->
<!--<fileNamePattern>${log.filepath}/warn-%d{yyyy-MM-dd_HH_mm}.log.gz</fileNamePattern>-->
<fileNamePattern>${log.filepath}/warn-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过100M,若超过100M,日志文件会以索引0开始,命名日志文件,例如warn-2013-12-21.0.log.gz -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志最多保存的份数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--定义error级别日志输出-->
<appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.filepath}/error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${log.pattern}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档-->
<!--<fileNamePattern>${log.filepath}/error-%d{yyyy-MM-dd_HH_mm}.log.gz</fileNamePattern>-->
<fileNamePattern>${log.filepath}/error-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过100M,若超过100M,日志文件会以索引0开始,命名日志文件,例如error-2013-12-21.0.log.gz -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志最多保存的份数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--根日志记录器-->
<root level="info">
<appender-ref ref="DB"/>
<appender-ref ref="CONSOLE_APPENDER" />
<appender-ref ref="DEBUG_APPENDER" />
<appender-ref ref="INFO_APPENDER" />
<appender-ref ref="WARN_APPENDER" />
<appender-ref ref="ERROR_APPENDER" />
</root>
</configuration>
在上面的配置内容中,最重点的是配置 MySQL 数据库的连接信息和 DBAppender
,并引用 `DBAppender
<!-- 数据库的连接属性 -->
<springProperty scope="context" name="DATA_SOURCE" source="spring.datasource.type" />
<springProperty scope="context" name="JDBC_URL" source="spring.datasource.druid.url" />
<springProperty scope="context" name="USER_NAME" source="spring.datasource.druid.username" />
<springProperty scope="context" name="PASSWORD" source="spring.datasource.druid.password" />
<springProperty scope="context" name="DRIVER_CLASS_NAME" source="spring.datasource.druid.driver-class-name" />
<!-- 输出到数据库 -->
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="${DATA_SOURCE}">
<url>${JDBC_URL}</url>
<username>${USER_NAME}</username>
<password>${PASSWORD}</password>
<driverClassName>${DRIVER_CLASS_NAME}</driverClassName>
</dataSource>
</connectionSource>
</appender>
<!-- 引用 DBAppender -->
<root level="info">
<appender-ref ref="DB"/>
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
如果只希望记录某个包(如 com.gz.bussines
)的错误日志信息到 MySQL 数据库,可以参考以下配置内容
<!-- 输出到数据库 -->
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="${DATA_SOURCE}">
<url>${JDBC_URL}</url>
<username>${USER_NAME}</username>
<password>${PASSWORD}</password>
<driverClassName>${DRIVER_CLASS_NAME}</driverClassName>
</dataSource>
</connectionSource>
<!-- 数据库只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 指定某个包的日志记录方式 -->
<logger name="com.gz.bussines" value="ERROR" additivity="false" >
<appender-ref ref="DB"/>
<appender-ref ref="CONSOLE" />
<appender-ref ref="ERROR_FILE" />
</logger>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>