springboot集成Logback 日志写入数据库

2023-09-12 15:26:57

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复制运行即可.

image-20230912150349157

添加配置文件(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>

image-20230912151239248

如果只希望记录某个包(如 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>

更多推荐

【Purple Pi OH RK3566鸿蒙开发板】OpenHarmony音频播放应用,真实体验感爆棚!

本文转载于PurplePiOH开发爱好者,作者ITMING。原文链接:https://bbs.elecfans.com/jishu_2376383_1_1.html01注意事项DevEcoStudio4.0Beta2(BuildVersion:4.0.0.400)OpenHarmonySDKAPI9创建工程类型选择Ap

ARM 汇编指令集——汇编中三种符号(汇编指令、伪指令、伪操作)、汇编基本格式、数据操作指令、跳转指令、特殊功能寄存器操作指令、内存操作指令、混合编程

目录一、汇编中三种符号(汇编指令、伪指令、伪操作)二、汇编基本格式三、数据操作指令3.1数据搬移指令mov/mvn①示例②立即数3.2移位操作指令lsl/lsr/asr/ror示例3.3位运算操作指令and/orr/eor/bic①示例1②示例23.4算数运算操作指令add/adc/sub/sbc/mul①实现两个64

数字化管理平台建设实践

在勘察设计行业,各企业加速推进数字化转型。通过管理要素数字化,不断优化内部组织运营效率;通过生产手段数字化、技术产品数字化,提升服务质量,改善客户体验;通过数字化营销,精准对接市场需求,挖掘发展蓝海。本文基于勘察设计企业数字化管理系统普遍存在的问题,结合湖北省交通规划设计院股份有限公司(以下简称“湖北交规院”)的数字化

vue的组件化编程的详细讲解加代码演示

😀前言本片文章是vue系列第5篇整理了vue的组件化编程的详细讲解加代码演示🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣💓Java全栈群星计划t

Mysql002:(库和表)操作SQL语句

目录:》SQL通用规则说明SQL分类:》DDL(数据定义:用于操作数据库、表、字段)》DML(数据编辑:用于对表中的数据进行增删改)》DQL(数据查询:用于对表中的数据进行查询)》DCL(用户权限:用于创建用户、修改数据库访问权限等)SQL通用规则说明:1.SQL语句可以单行编写,也可以多行编写,以英文分号结束2.SQ

基于Java+vue前后端分离高校社团管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

如何实现微服务

一、问题拆解1.1、客户端如何访问这些服务原来的Monolithic方式开发,所有的服务都是本地的,UI可以直接调用;现在按功能拆分成独立的服务,跑在独立的虚拟机上的Java进程了。客户端UI如何访问他的?后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不符合我们拆分的理念

【LeetCode题目详解】第十章 单调栈part02 ● 503.下一个更大元素II ● 42. 接雨水 (day59补)

本文章代码以c++为例!一、力扣第503题:下一个更大元素II题目:给定一个循环数组nums(nums[nums.length-1]的下一个元素是nums[0]),返回nums中每个元素的下一个更大元素。数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的

vvic API接口接入说明:解锁新一代数据可视化的无限可能

随着大数据时代的来临,数据可视化已成为我们理解、分析和呈现复杂数据的重要手段。在这个领域中,vvic以其独特的优势,引领着数据可视化的发展潮流。其强大的API接口,更是为开发者提供了无限可能,让数据可视化变得更为简单、直观和生动。vvicAPI接口是一个高度灵活、易于使用的工具,旨在帮助开发者快速创建出美观、功能丰富的

web应用及微信小程序版本更新检测方案实践

背景:随着项目体量越来越大,用户群体越来越多,用户的声音也越来越明显;关于应用发版之后用户无感知,导致用户用的是仍然还是老版本功能,除非用户手动刷新,否则体验不到最新的功能;这样的体验非常不好,于是我们团队针对该问题给出了相应的解决方案来处理;技术栈:vue3+ts+vite+ant-design-vue1.web应用

视屏点播项目

项目背景大家应该在电脑上刷过视频吧,这个项目就是模拟一下我们刷视频的整个流程,我们要做的是一个类似B站的网页,这里面包含视频的上传修改和观看以及删除,注意我这个是一个简易版本的,在后面我会做一个升级,增加其他的功能.基本原理下面我们说一下我们项目的基本原理.我们这里做的是服务器客户端类型的项目.当客户端发起请求之后,我

热文推荐