通过将日志记录到数据库中,这样还能够在系统界面查看日志。
目录
- 一、创建数据表
- 二、配置
- 1. 引入依赖
- 2. 编写logback配置文件
- 3.添加配置信息
- 4. 测试
- 三、定期删除日志
- 1. 开启事件调度器
- 2. 创建事件(创建后默认开启)
- 3. 关闭事件
- 4. 开启事件
- 5. 查看事件
以日志写入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;