今天看了下之前老员工留下的日志代码, 结合自己查的资料,希望出一份从没接触过日志的小白,也能看明白,并使用的日志,废话不多少,直接进入主题了.
slf4j是The Simple Logging Facade for Java的简称,笼统的讲就是slf4j是一系列的日志接口,这里是一个典型的门面模式的设计。slf4j,log4j和logback的作者都是Ceki Gülcü。最早开发的是log4j,后来基于log4j抽出了统一的日志接口slf4j,并基于slf4j和log4j,优化开发了logback,所以logback无论在使用还是性能方面都要优于log4j。
所以: 日志门面是slf4j
日志实现是 log4j ,log4j2(上一个的升级) ,logback
我这里只讲logback
2、特性
- 同时支持 JDBC3 和 JDBC4
- 配置简单
- 可将 SQL 中的 ?更换成实际的参数
- 能够 显示 SQL 的 执行时间
- 显示 SQL Connection 数量
- 可以与JDK1.4+和SLF4J1.X等大多数常见的JDBC驱动协同工作
- 开放源码
3、驱动支持
log4jdbc 可以会加载以下驱动:
源码可看:net.sf.log4jdbc.sql.jdbcapi
4、logger 介绍 ( 这个会在xml文件中用到)
log4jdbc 中使用了以下 7 种logger,可以进行相应的配置来实现需求
一般常用的是这5个:jdbc.audit jdbc.resultset jdbc.sqlonly jdbc.sqltiming jdbc.connection
5,log4jdbc 使用
以下 基于 SpringBoot 框架的项目进行使用介绍
导包
使用首先导包
2.1 配置
在使用 log4jdbc 时,需要进行三个配置:
更改数据库连接信息
编写 log4jdbc.log4j2.properties 文件
配置 logger
(1)更改数据库连接信息
主要修改 driverClassName 与 url,以yaml 配置为例:
url 加上前缀 jdbc:log4
driverClassName 改为 net.sf.log4jdbc.sql.jdbcapi.DriverSpy
备注: 这里我看了下自己的项目. driverClassName上并没有改变配置,但依然运行良好,并不清楚原因,大家可以自己试下
(2)编写 log4jdbc.log4j2.properties 文件
在 resources 目录下新建 log4jdbc.log4j2.properties 文件,可配置信息如下:
默认文件名称为log4jdbc.log4j2.properties ,如果想自定义配置,需要在System properties文件中指定 log4jdbc.log4j2.properties.file ,value对应文件名称
源码:
- net.sf.log4jdbc.Properties
可配置字段:
简单常用配置**(直接拿去用)**:
# 以下三个都需配置
# spy日志处理类
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
# jdbc驱动(这里对应的mysql驱动版本为8.x)
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
# 自动选择最佳jdbc驱动
log4jdbc.auto.load.popular.drivers=false
# 以下三个配置看自己需求了
# 设置的值为项目应用程序的包的部分或全部的前缀
log4jdbc.debug.stack.prefix=blog
# 当该值为 false 时,boolean 值显示为 0 和 1 ,为 true 时 boolean 值显示为 true 和 false
log4jdbc.dump.booleanastruefalse=true
# 是否在 SQL 的行末添加一个分号
log4jdbc.dump.sql.addsemicolon=true
注:我自己用的就是1-7 行
(3)配置 logger
在 resources 目录下新建 logback.xml 文件(默认文件名)
如果需要自定义,可以在yaml中指定:
logging:
config: classpath:xxxx.xml
配置上述的常用的 5大logger:(看自己实际需求配置了)
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
<!--上下文名称,可加可不加,为了美观可写自己公司名称缩写-->
<contextName>MXK-IOT</contextName>
<!-- 日志存放目录 -->
<property name="log.path" value="logs" />
<property name="log.charset" value="utf-8" />
<!-- 上下文名称 红色 日期格式 绿色 线程 等级 日志最长36 方法 行数 换行 -->
<property name="log.consolePattern" value="%contextName- %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %red([%method,%line]) - %msg%n" />
<!--基本他同上, 具体可看资料3-->
<property name="log.filePattern" value="%contextName- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.consolePattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<!--编码器-->
<encoder>
<pattern>${log.filePattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统日志输出 -->
<appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-debug.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.filePattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>DEBUG</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.filePattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<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="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
<appender-ref ref="file_debug" />
</root>
<!--监控sql日志输出 -->
<!-- 仅仅记录 SQL 语句,会将占位符替换为实际的参数-->
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<appender-ref ref="console" />
</logger>
<!-- 包含 ResultSet 的信息,输出篇幅较长 -->
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="console" />
</logger>
<!-- 如想看到表格数据,将OFF改为INFO -->
<logger name="jdbc.resultsettable" level="OFF" additivity="false">
<appender-ref ref="console" />
</logger>
<!-- 输出了 Connection 的 open、close 等信息 -->
<logger name="jdbc.connection" level="OFF" additivity="false">
<appender-ref ref="console" />
</logger>
<!-- 包含 SQL 语句实际的执行时间 及sql语句(与jdbc.sqlonly功能重复) -->
<logger name="jdbc.sqltiming" level="OFF" additivity="false">
<appender-ref ref="console" />
</logger>
<!-- 除了 ResultSet 之外的所有JDBC调用信息,篇幅较长 -->
<logger name="jdbc.audit" level="OFF" additivity="false">
<appender-ref ref="console" />
</logger>
</configuration>
最后控制台的效果如下(有颜色,看着还可以):
项目下也会有对应的日志,这是按照日期生成的,所以文件大小差异较大
就到这吧,更多的大家看资料吧.
资料链接1:https://blog.csdn.net/weixin_42272869/article/details/124477592
资料链接4:【java】20分钟搞清log4j/logback/log4j2/slf4j || 如何统一日志标准_哔哩哔哩_bilibili