前言
我们在之前的文章中系统介绍过Java的日志框架作用以及使用,本篇文章将针对数据输出源为数据库的这种场景,进行代码演示,作为补充。有兴趣的读者可以看一下。
系列文章:Java日志框架详解
一、引入依赖
需要注意的是,由于我本地安装的是Oracle数据库,所以本篇文章是以Oracle数据库来进行演示的,但个人感觉无论是哪一种数据库,无非就是建表语句和引入的数据库驱动不同而已,核心的东西还是差不多的。话不多说,我们先引入依赖:
<!-- log4j实现类依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 引入oracle依赖 -->
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
maven一般不支持直接下载oracle驱动包,所以我们比较多是自己在官方下载或者是在内部的私服上面下载。所以如果上面的oracle依赖不能使用的话,各位读者就自行下载吧。
二、定义表结构
步骤一:创建表
CREATE TABLE MY_Log (
log_id number(11) NOT NULL,
project_name varchar(255) DEFAULT NULL ,
create_date varchar(255) DEFAULT NULL ,
log_level varchar(255) DEFAULT NULL ,
log_category varchar(255) DEFAULT NULL ,
file_name varchar(255) DEFAULT NULL ,
thread_name varchar(255) DEFAULT NULL ,
line varchar(255) DEFAULT NULL ,
all_category varchar(255) DEFAULT NULL ,
message varchar(4000) DEFAULT NULL ,
PRIMARY KEY (log_id)
)
-- 设置注释
comment on COLUMN MY_Log.project_name is '目项名';
comment on COLUMN MY_Log.create_date is '创建时间';
comment on COLUMN MY_Log.log_level is '优先级';
comment on COLUMN MY_Log.log_category is '所在类的全名';
comment on COLUMN MY_Log.file_name is '输出日志消息产生时所在的文件名称 ';
comment on COLUMN MY_Log.thread_name is '日志事件的线程名';
comment on COLUMN MY_Log.line is '号行';
comment on COLUMN MY_Log.all_category is '日志事件的发生位置';
comment on COLUMN MY_Log.message is '输出代码中指定的消息';
步骤二:创建序列和触发器
-- 创建序列
CREATE SEQUENCE mylog_sequence
INCREMENT BY 1
START WITH 1
MAXVALUE 5000 CYCLE;
-- 创建触发器
DROP
CREATE OR REPLACE TRIGGER mylog_cascade
BEFORE INSERT ON MY_Log
FOR EACH ROW
BEGIN
SELECT mylog_sequence.NEXTVAL INTO :new.log_id FROM dual;
END;
三、使用编码的方式来进行日志持久化
我们手动给logger传入jdbcAppender就行,基本上它的API还是比较明显易懂的。
@Test
public void jdbcTest() {
Logger logger = Logger.getLogger(Log4jTest.class);
JDBCAppender jdbcAppender = new JDBCAppender();
jdbcAppender.setDriver("oracle.jdbc.OracleDriver");
jdbcAppender.setURL("jdbc:oracle:thin:@localhost:1521:orcl");
jdbcAppender.setUser("root");
jdbcAppender.setPassword("root");
jdbcAppender.setSql("INSERT INTO my_log(project_name,create_date,log_level,log_category,file_name,thread_name,line,all_category,message)values('log4jTest','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')");
logger.addAppender(jdbcAppender);
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.trace("trace");
logger.debug("debug");
logger.fatal("fatal");
}
运行后,在数据库进行结果验证:
image.png
四、使用配置文件的方式来进行日志持久化
#指定日志的输出级别与输出端
log4j.rootLogger=WARN,DATABASE
### 配置输出到数据库 ###
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:oracle:thin:@localhost:1521:orcl
log4j.appender.DATABASE.driver=oracle.jdbc.OracleDriver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=root
log4j.appender.DATABASE.sql=INSERT INTO my_log(project_name,create_date,log_level,log_category,file_name,thread_name,line,all_category,message)values('log4jTest','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
我们写一下简单的测试代码:
@Test
public void simpleLog() {
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("db fatal...");
logger.error("db error...");
logger.warn("db warn...");
logger.info("db info...");
logger.debug("db debug...");
logger.trace("db trace...");
}
执行代码后,我们可以发现数据库已经有刚刚产生的日志了
image.png
网友评论