整理思路(不感兴趣直接看准备工作)
由于我这里是web应用,自带了logback和hikari的依赖,不需要修改pom,如果不自带需要自行安装。
1.需要采用DBAppender方式去操作数据库,配置 DBAppender
的主要问题在于如何设置 ConnectionSource
实例,ConnectionSource
实例配置完成之后,配合需要的那三张表logging_event, logging_event_property 与 logging_event_exception,logback就会自动插库。
2.ConnectionSource其实相当于做一个再封装的数据源,让logback去操作,ConnectionSource
目前有三种实现,分别为:DataSourceConnectionSource,
DriverManagerConnectionSource
与 JNDIConnectionSource,这里使用的是DataSourceConnectionSource方式+
Hikari数据源
文档在这里:第四章:Appenders - logback
准备工作:
1.记录日志到数据库需要三个表,建表脚本网上很好找,外部库logback-classic/src/main/java/ch/qos/logback/classic/db/script 中也有,(我这里使用的是mysql)在数据源中执行一下,看到三个表就ok;
2.配置文件logback-spring.xml,数据源配置按照实际情况改一下,其他配置直接copy
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="D:/log/" />
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<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}}"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="DB-CLASSIC-MYSQL-POOL" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="com.zaxxer.hikari.HikariDataSource">
<!-- 这里是不需要设置驱动的,设置了反而会报错 <driverClass>com.mysql.jdbc.Driver</driverClass>-->
<jdbcUrl>数据源url(jdbc:mysql://...这种格式)</jdbcUrl>
<username>登录名</username>
<password>密码</password>
</dataSource>
</connectionSource>
<!--
自定义日志过滤实现类,继承Filter<ILoggingEvent>或者TurboFilter重写decide方法
Filter实现的过滤器是与Appender绑定的,而TurboFIlter是与日志上下文绑定的,会过滤所有的日志请求,并且TurboFIlter的方法中提供了丰富的可访问信息用来进行控制和改写。
常规过滤器Filter位置:位于appender内。常规过滤器用<filter>标签,是<appender>的子标签。
TurboFilter过滤器位置:位于configuration内。TurboFilter过滤器用<turboFilter>标签,是<configuration>子标签。
TurboFilter对于解决应用程序中因为框架的叠加,且对接了日志告警的情况下,若出现一个错误产生重复告警的现象有很好的效果,可以在全局进行动态的日志修改。
返回值有三种类型
FilterReply.ACCEPT 记录事件立即被处理,不经过下个记录器
FilterReply.NEUTRAL 下一个记录器接着处理
FilterReply.DENY 记录时事件被立即被抛弃
-->
<!-- <filter class="com.xxxxx.xxxxx.LogsFilter" />-->
</appender>
<!--开发环境:打印控制台-->
<springProfile name="dev">
<logger name="com.nmys.view" level="debug"/>
</springProfile>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DB-CLASSIC-MYSQL-POOL" />
</root>
</configuration>
配置文件需要在application.properties加一行中引入,文件路径按照实际的来
logging.config=classpath:config/logback-spring.xml
使用方式(这里是在controller里面调的,其他也可以)
@RestController
@Api(tags = "测试接口")
public class testController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@GetMapping(value = "/test")
@ApiOperation(value = "测试", notes = "列表信息")
public Response test() {
logger.debug("This is a debug message");//注意 spring 默认日志输出级别为 info 所以默认情况下 这句不会打印到控制台
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
return Response.success(200, null, "测试成功");
}
}
请求一下这个接口,查看数据库和控制台,在这里打印的是info及以上的,如果感觉东西太多可以在logback配置文件改成warn及以上的
以上,如有错误,欢迎指正