美文网首页
Java日志框架补充(一)——将日志保存到Oracle数据库中

Java日志框架补充(一)——将日志保存到Oracle数据库中

作者: moutory | 来源:发表于2021-12-03 10:57 被阅读0次

    前言

    我们在之前的文章中系统介绍过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

    相关文章

      网友评论

          本文标题:Java日志框架补充(一)——将日志保存到Oracle数据库中

          本文链接:https://www.haomeiwen.com/subject/fkupxrtx.html