log4j ,logback 具体如何配置

      今天看了下之前老员工留下的日志代码, 结合自己查的资料,希望出一份从没接触过日志的小白,也能看明白,并使用的日志,废话不多少,直接进入主题了.

    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

字体颜色: https://www.jianshu.com/p/65329ea56184

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值