上一节讲了标准日志输出到文件中,本节讲解将日志写入数据库,最主要的核心类就是DBAppender。
我使用的MySQL数据库,创建auge_log数据库,执行以下内容建表。
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)
);
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)
);
COMMIT;
然后在pom中添加的dbcp的依赖
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
之后在logback.xml中添加写入数据库的配置信息(这里设置了写入数据库的日志级别为error,root日志级别为INFO)
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="E:/Code/log" />
<!--将日志写入文件的配置信息在上节中,本节就不展示了,只展示重点配置-->
<!-- 彩色日志 -->
<!-- 按照每天生成日志文件 -->
<!--info-->
<!--error appender-->
<!-- 将日志写入数据库 -->
<appender name="DB-CLASSIC-MYSQL-POOL" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="org.apache.commons.dbcp.BasicDataSource">
<driverClassName>com.mysql.jdbc.Driver</driverClassName>
<url>jdbc:mysql://localhost:3306/auge_log?characterEncoding=UTF-8</url>
<username>root</username>
<password>123456</password>
</dataSource>
</connectionSource>
<!--这里设置日志级别为error-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志输出级别 TRACE < DEBUG < INFO < WARN < ERROR < FATAL-->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="DAYINFO" />
<appender-ref ref="DAYERROR" />
<appender-ref ref="DB-CLASSIC-MYSQL-POOL" />
</root>
</configuration>
示例:
Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping("/login")
@LogApi(info = "用户登陆")
public String login(String loginName, String password, Model model){
User user = userService.getUserByLogin(loginName,password);
if(user==null){
//在此试验是否写入数据库
logger.error("用户名或密码错误,请重新登录");
model.addAttribute("emg","用户名或密码错误,请重新登录");
return "login";
}
logger.info("测试info级别是否也能写入数据库");
session.setAttribute("user",user);
return "index";
}
查看数据库记录如下:
说明配置成功了(只有error才会写入数据库)。