把项目的日志输出一份到mysql数据库(也输出日志文件和控制台,本文只说输出到数据库)
我用的dbcp连接池,貌似不支持druid
commons-dbcp
commons-dbcp
1.4
在这个文件中添加一个appender,然后在root那里引用
ERROR
com.mysql.jdbc.Driver
jdbc:mysql://${DataSourceIp}:3306/user-center?characterEncoding=UTF-8
${DataSourceUser}
${DataSourcePassWord}
注意: 这个 “ 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的问题。
以上只是我的个人见解,错误的地方欢迎指正。