slf4j保存日志到数据库

在开发工程中,我们通过slf4j进行日志的打印以及生成日志文件,每次对日志进行查询要么就是通过翻找控制台的打印结果或者文件,这样实在不方便。
在这里插入图片描述
通过将日志记录到数据库中,这样还能够在系统界面查看日志。
在这里插入图片描述

以日志写入mysql为例

一、创建数据表

创建三张数据表logging_event、logging_event_property、logging_event_exception用来保存日志数据;

建表sql如下:

BEGIN;
DROP TABLE IF EXISTS logging_event_property;
DROP TABLE IF EXISTS logging_event_exception;
DROP TABLE IF EXISTS logging_event;
COMMIT;


BEGIN;
CREATE TABLE logging_event 
  (
    timestmp         BIGINT NOT NULL,
    formatted_message  TEXT NOT NULL,
    logger_name       VARCHAR(254) NOT NULL,
    level_string      VARCHAR(254) NOT NULL,
    thread_name       VARCHAR(254),
    reference_flag    SMALLINT,
    arg0              VARCHAR(254),
    arg1              VARCHAR(254),
    arg2              VARCHAR(254),
    arg3              VARCHAR(254),
    caller_filename   VARCHAR(254) NOT NULL,
    caller_class      VARCHAR(254) NOT NULL,
    caller_method     VARCHAR(254) NOT NULL,
    caller_line       CHAR(4) NOT NULL,
    event_id          BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
  );
COMMIT;

BEGIN;
CREATE TABLE logging_event_property
  (
    event_id          BIGINT NOT NULL,
    mapped_key        VARCHAR(254) NOT NULL,
    mapped_value      TEXT,
    PRIMARY KEY(event_id, mapped_key),
    FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
 ON UPDATE CASCADE ON DELETE CASCADE
  );
COMMIT;

BEGIN;
CREATE TABLE logging_event_exception
  (
    event_id         BIGINT NOT NULL,
    i                SMALLINT NOT NULL,
    trace_line       VARCHAR(254) NOT NULL,
    PRIMARY KEY(event_id, i),
    FOREIGN KEY (event_id) REFERENCES logging_event(event_id) ON UPDATE CASCADE ON DELETE CASCADE
  );
COMMIT;

两个外键设置级联,保证数据的完整性

二、配置

1. 引入依赖

<!-- 日志写入数据库引用 begin -->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.7</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.32</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
	<version>1.2.7</version>
</dependency>
<!-- 日志写入数据库引用 end -->

2. 编写logback配置文件

在resource目录创建logback-custom.xml作为日志的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <springProperty scope="context" name="LOG_FILE" source="logging.path"/>
    <springProperty scope="context" name="ServerPort" source="server.port"/>

    <!-- 自定义控制台输出的pattern -->
    <property name="CONSOLE_LOG_PATTERN" value="%date [%thread] %-5level %logger{80} - %msg%n"/>

    <!-- 引用默认的appender, 假如不满足需求, 可以自定义appender(logstash可引用logstash-appender.xml, 进行自定义LOGSTASH_LOG_PATTERN) -->
    <include resource="com/southgis/ibase/logstatistics/logging/logback/console-appender.xml"/>
    <include resource="com/southgis/ibase/logstatistics/logging/logback/logstash-default-appender.xml"/>
    <include resource="com/southgis/ibase/logstatistics/logging/logback/exprout-appender.xml"/>
 
	<!-- 配置属性 -->
    <springProperty scope="context" name="JDBC_URL" source="logging.datasource.url"/>
    <springProperty scope="context" name="USER_NAME" source="logging.datasource.username"/>
    <springProperty scope="context" name="PASSWORD" source="logging.datasource.password"/>
    <springProperty scope="context" name="DATA_SOURCE" source="logging.datasource.type"/>

    <!-- 写入到数据库 -->
    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
            <dataSource class="${DATA_SOURCE}}">
                <jdbcUrl>${JDBC_URL}</jdbcUrl>
                <username>${USER_NAME}</username> <!-- 数据库用户名 -->
                <password>${PASSWORD}</password> <!-- 密码 -->
            </dataSource>
        </connectionSource>
    </appender>

    <!-- 表达式$.print("xx")的输出 -->
    <logger name="script.debug" level="INFO" additivity="false">
        <appender-ref ref="EXPROUT"/>
    </logger>

    <root level="INFO">
        <!-- <appender-ref ref="IBASEDEBUG"/> -->
        <appender-ref ref="LOGSTASH"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="DB"/>
    </root>
</configuration>

通过springProperty标签动态读取appication.yml的内容作为参数。

3.添加配置信息

在application.yml 添加logback要用的配置信息,让logback配置文件动态读取这些配置文件

# 日志配置
logging:
  config: classpath:logback-custom.xml #logback配置文件路径
  path: /ibase/logs
  dbstore:
    enabled: true #特定日志信息是否存贮到数据库
  datasource:
    username: "用户名"
    password: "密码"
    url: "数据库url"
    type: "数据源"

4. 测试

配置完毕,启动服务,可以看到控制台打印日志的同时,执行插入sql将日志插入到数据库中
在这里插入图片描述

三、定期删除日志

通过mysql自己的事件调度器实现定期删除日志数据;

1. 开启事件调度器

确认是否开启

SHOW VARIABLES LIKE 'event_scheduler';

开启命令(具备root权限)

SET GLOBAL event_scheduler = ON;

2. 创建事件(创建后默认开启)

CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule
 [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT 'comment']
 DO sql_statement;

例如:每30天清空30天前的所有记录,仅保留近30天数据

CREATE EVENT LOGGING_EVENT_TRUNCATE ON SCHEDULE EVERY 30 DAY DO 
DELETE FROM LOGGING_EVENT WHERE FROM_UNIXTIME(TIMESTMP/1000,'%Y-%m-%d')<DATE_SUB(CURDATE(),INTERVAL 30 DAY);

3. 关闭事件

alter event LOGGING_EVENT_TRUNCATE disable;

4. 开启事件

drop event if exists event_name;

5. 查看事件

show events;
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值