springboot集成Logback 日志写入数据库

news2024/11/23 6:36:09

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++从0到王者】第二十九站:二叉搜索树常见题

文章目录 一、根据二叉树创建字符串二、二叉树的最近公共祖先1.解法一&#xff1a;递归2.解法二&#xff1a;借助栈来寻找路径 三、二叉搜索树与双向链表四、前序与中序构建二叉树五、中序与后序构建二叉树 一、根据二叉树创建字符串 题目链接&#xff1a;力扣第606题&#xff…

fabic 在canvas中绘制group元素,如何获取并修改group中某一元素的填充色

1、创建一个Fabric组并向其添加元素 2、标识要修改的组中的特定元素 3、访问并修改该元素的填充颜色 下面是JavaScript中的一个代码示例: // Create a Fabric.js canvas var canvas new fabric.Canvas(canvas);// Create a rectangle and a circle var rectangle new fabric…

Linux——环境变量

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——环境变量 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作…

2023年一级建造师建设工程经济真题

2023年一级建造师建设工程经济真题 1.根据《建设工程工程量清单计价规范》规定&#xff0c;代表专业工程的项目编码是 ()。 A、1&#xff0c;2 B、3&#xff0c;4 C、5&#xff0c;6 D、7&#xff0c;8&#xff0c;9 【答案】B 2.某公司希望所投资项目在第5年末回收1000万…

银行笔试篇---职业能力测试(行测)

数字推理 数字推理可分为等差数列、等比数列、和数列、积数列、幂数列以及分数数列六类&#xff0c;做题时的总体原则为&#xff1a; 关键点1&#xff1a;凡是一次变化找不到规律的&#xff0c;直接放弃&#xff01;所谓一次变化指的是&#xff1a;1.通过一次相邻两数作差、作…

成绩定级脚本(Python)

成绩评定脚本 写一个成绩评定的python脚本&#xff0c;实现用户输入成绩&#xff0c;由脚本来为成绩评级&#xff1a; #成绩评定脚本.pyscoreinput("please input your score:") if int(score)> 90:print("A") elif int(score)> 80:print("B&…

Pytest系列- assert断言详细使用(4)

简介 在断言方面&#xff0c;pytest框架比其他类似的框架&#xff08;比如unittest&#xff09;更加简洁&#xff0c;易用&#xff0c;我想这是选择pytest作为自动化测试框架之一的原因之一。pytest的assert断言关键字支持使用python内置的assert表达式。可以理解为pytest的断…

合宙Air724UG LuatOS-Air lvgl7-lvgl(矢量字体)

如何用开发板实现lvgl加载外部矢量字体功能 目录名称 如何用开发板实现lvgl加载外部矢量字体功能 简介材料准备API 说明步骤 1. 将字库芯片接在模块spi上2. 版本定制3. 初始化spi4. 设置字体5.字体使用测试固件和脚本显示效果字号灰度最佳粗细值对应表常见问题 1. 设置68号字体…

Aapache Tomcat AJP __ 文件包含漏洞 __ CVE-2020-1938

Aapache Tomcat AJP __ 文件包含漏洞 __ CVE-2020-1938 漏洞描述 Ghostcat是Chaitin Tech安全研究员发现的Tomcat中的一个严重漏洞&#xff0c;由于Tomcat AJP协议中的缺陷&#xff0c;攻击者可以读取或包含Tomcat的Webapp目录中的任何文件。例如&#xff0c;攻击者可以读取 …

9月12日华为新品发布会

华为MATE 60 Pro作为华为Mate系列的最新力作&#xff0c;备受期待。这款手机在设计和功能上都带来突破&#xff0c;大家都认为是遥遥领先。 9月12日下午&#xff0c;大家期待的华为发布会&#xff0c;实际上是问界新M7发布会。虽然此前已有消息称&#xff0c;此次发布不包括手机…

4.3-内置后置PostProcess处理器深度讲解

在reader里面注册了很多Bean定义 reader会调取register()来注册配置类 调用上句&#xff0c;就会把配置类注册到BeanDefinitionMap中去 配置类有了、解析配置类的处理器有了 然后&#xff0c; 在第三步refresh() 进行IOC容器刷新中的invokeBeanPostProcessors(beanFactory…

Java密码学之加解密

前篇&#xff1a;Java密码学之数字签名_东皋长歌的博客-CSDN博客 日常开发中用的比较多的功能点&#xff0c;加解密数据&#xff0c;用Java实现也是很快很实用。 下面记录一下加解密数据的过程。 1&#xff0c;创建密钥对生成器 KeyPairGenerator keyPairGen KeyPairGener…

我的新书《Java编程动手学》

关于这本书 很高兴&#xff0c;我又一本书籍《Java编程动手学》上市了。记得早在2017年&#xff0c;在我跟人邮出版社的傅道坤编辑合作完《Tomcat内核设计剖析》这本书后&#xff0c;傅编就问我考不考虑写一本面向Java初学者的图书&#xff0c;当时我谢绝了傅编的邀请。一来是…

21.Xaml Expander控件--->可折叠的带标题的内容控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

day55:C++ day5,运算符重载剩余部分、静态成员、继承

#include <iostream> #include <cstring> #define pi 3.14 using namespace std;class Shape { protected:double round;double area; public://无参构造Shape():round(40),area(100){cout<<"Shape::无参构造函数&#xff0c;默认周长为40&#xff0c;面…

渐变线条拖尾特效-原理及pygame实现

文章目录 效果预览视频教程代码内容介绍总结更多宝藏 效果预览 &#x1f60e;&#x1f973;&#x1f60e;&#x1f920;&#x1f916;&#x1f648;&#x1f4ad;&#x1f373;&#x1f371; 视频教程 https://www.bilibili.com/video/BV1vu411A7zy/ 代码 import pygame# 初…

基于HOG特征提取和GRNN神经网络的人脸表情识别算法matlab仿真,测试使用JAFFE表情数据库

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1.HOG特征提取 2.GRNN神经网络 3.JAFFE表情数据库 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

解决MySQL数据库拒绝远程计算机连接问题

错误信息&#xff1a;Host is not allowed to connect to this mysql server 以前MySQL数据库部署在云服务器上&#xff0c;程序服务端也部署在云服务器上&#xff0c;连接服务器从没出现过问题。最近有一次需要做一个完全局域网的环境部署&#xff0c;我把数据库和程序服务端…

python爬虫教程:用scrapy实现模拟登录

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 背景&#xff1a; 初来乍到的pythoner&#xff0c;刚开始的时候觉得所有的网站无非就是分析HTML、json数据&#xff0c;但是忽略了很多的一个问题&#xf…

Python第一次作业练习

题目分析&#xff1a; """ 参考学校的相关规定。 对于四分制&#xff0c;百分制中的90分及以上可视为绩点中的4分&#xff0c;80 分及以上为3分&#xff0c;70 分以上为2分&#xff0c;60 分以上为1分; 五分制中的5分为四分制中的4分&#xff0c;4分为3分&#…