需求
把项目的日志输出一份到mysql数据库(也输出日志文件和控制台,本文只说输出到数据库)
所需依赖
我用的dbcp连接池,貌似不支持druid
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
直接看logback-spring.xml
在这个文件中添加一个appender,然后在root那里引用
<!--配置将异常日志输出到数据库-->
<appender name="errorLog" class="ch.qos.logback.classic.db.DBAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level> <!-- 日志过滤级别 -->
</filter>
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="org.apache.commons.dbcp.BasicDataSource">
<driverClassName>com.mysql.jdbc.Driver</driverClassName>
<url>jdbc:mysql://${DataSourceIp}:3306/user-center?characterEncoding=UTF-8</url>
<username>${DataSourceUser}</username>
<password>${DataSourcePassWord}</password>
</dataSource>
</connectionSource>
</appender>
<!-- <logger name="com" level="INFO" addtivity="false">
<appender-ref ref="errorLog"/>
</logger>-->
<root level="INFO"> <!--基础日志打印级别-->
<appender-ref ref="StdoutAppender"/> <!--输出到控制台(这个appender我没复制出来)-->
<appender-ref ref="FileAppender"/> <!--输出到文件(这个appender我没复制出来)-->
<appender-ref ref="errorLog"/> <!--输出到数据库的appender-->
</root>
注意: 这个 “ appender name="errorLog"中午设置了日志过滤级别是error,不设置的话,会输出info的日志。
所需要的表
要让logback输出到数据库,总得给他个地方存吧(表,固定的,无法灵活配置(蛋疼),看sql吧)
BEGIN;
DROP TABLE IF EXISTS logging_event_property;
DROP TABLE IF EXISTS logging_event_exception;
DROP TABLE IF EXISTS logging_event;
COMMIT;
/*这下边三张表是logback导入日志所需的表(不能改变)*/
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;
这三张表里边基本包含了我们所需要的所有日志信息,但是我需要的不在一张表中(有点烦),怎么办?这里提供两种思路,1:连接表查询;2:弄个视图(相当于一张表);我采用了第二种。上视图sql
DROP VIEW IF EXISTS `error_log`;
CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `error_log` AS SELECT
date_format( from_unixtime( round( ( `logging_event`.`timestmp` / 1000 ), 0 ) ), '%Y-%m-%d %H:%i:%S' ) AS `time`,
`logging_event`.`formatted_message` AS `message`,
`logging_event`.`level_string` AS `level`,
`logging_event`.`thread_name` AS `thread_name`,
`logging_event`.`caller_class` AS `class_name`,
`logging_event`.`caller_method` AS `method`,
`logging_event_property`.`mapped_value` AS `app_name`,
`logging_event`.`event_id` AS `id`
FROM
( `logging_event` JOIN `logging_event_property` ON ( ( `logging_event_property`.`event_id` = `logging_event`.`event_id` ) ) )
WHERE
( `logging_event_property`.`mapped_key` = 'APP_NAME' );
根据自己需求定义哈(我的饿贴出来给你们参考),另外需要注意的地方是:logging_event这个表的timestamp字段,它存的是毫秒值(坑啊),mysql默认秒,这样一来需要把timstamp/1000然后再取整才能格式化成日期(找了好久没找到资料,没人遇到吗)
项目中遇到的坑
项目中连接池本来用的是druid,于是我在datasource那里用的也是druid,但是问题来了,项目启动不起来卡住了,也没有报什么错(没错,我怎么搞。。。。),无奈只能换个连接池试试,就dbcp吧,于是就如上面代码的配置,一试还真行,看来是不支持druid的问题。
以上只是我的个人见解,错误的地方欢迎指正。