Log4j的Appender日志输出

发布于 2022-11-05  3.46k 次阅读


1. 日志输出到文件

    默认Log4j日志输出到控制台,也可以修改到其他输出源,Log4j支持多方向输出,可以同时设置输出控制台和文件,只不过在配置文件中需要配置两份Appender

日志文件输出配置项:

#配置appender输出方式
log4j.appender.自定义名=org.apache.log4j.FileAppender
#指定文件输出位置和文件名
log4j.appender.自定义名.file=文件地址
#输出字符编码
log4j.appender.自定义名.encoding=UTF-8

例:多方向输出到控制台和文件中

① 配置文件

#1.控制台输出配置
#appender输出方式
log4j.appender.myconsole=org.apache.log4j.ConsoleAppender
#输出的格式
log4j.appender.myconsole.layout=org.apache.log4j.PatternLayout
#具体的PatternLayout格式
log4j.appender.myconsole.layout.conversionPattern=[%p]%r %c %t %d{yyyy-MM-dd HH:mm:ss:SSS} %m%n

#2.文件输出配置
log4j.appender.myfile=org.apache.log4j.FileAppender
#输出格式
log4j.appender.myfile.layout=org.apache.log4j.SimpleLayout
#文件输出
log4j.appender.myfile.file=D:\\mylog4j.log
#文件编码
log4j.appender.myfile.encoding=UTF-8

#配置根节点
log4j.rootLogger=trace,myconsole,myfile

② 代码

@Test
public void test1(){

    Logger logger = Logger.getLogger(Log4jTest1.class);

    logger.trace("输出trace日志等级");
    logger.debug("输出debug日志等级");
    logger.info("输出info日志等级");
    logger.warn("输出warn日志等级");
    logger.error("输出error日志等级");
    logger.fatal("输出fatal日志等级");
}

③ 日志输出

2. 日志文件大小拆分

 将日志文件输出到文件,但日志太多时,不方便管理,这时可以对文件进行进行处理输出,Log4j提供了RollingFileAppender进行文件大小拆分

配置项:

#配置appender输出方式
log4j.appender.自定义名=org.apache.log4j.RollingFileAppender
#指定文件输出位置和文件名
log4j.appender.自定义名.file=文件地址
#输出字符编码
log4j.appender.自定义名.encoding=UTF-8
#指定日志文件内容的大小(超过这个大小就对日志文件进行拆分)
log4j.appender.自定义名称.maxFileSize=
#指定日志文件的数量
log4j.appender.自定义名称.maxBackupIndex=

解析:

  • 日志大小:当存储文件大于指定大小就会进行日志切分,重新创建一个日志文件进行存储
  • 日志数量:当指定了日志数量,日志文件超出大小时文件的拆分要少于指定日志数量,当超过日志数量时,就对最早生成的日志文件进行覆盖

例:配置RollingFileAppender

① 配置文件

log4j.appender.myrollingfile=org.apache.log4j.RollingFileAppender
#文件输出位置
log4j.appender.myrollingfile.file=D:\\mylog4j.log
#输出格式
log4j.appender.myrollingfile.layout=org.apache.log4j.SimpleLayout
#文件编码
log4j.appender.myrollingfile.encoding=UTF-8
#指定日志文件内容大小
log4j.appender.myrollingfile.maxFileSize=1MB
#指定拆分日志文件的最大数量
log4j.appender.myrollingfile.maxBackupIndex=5

#配置根节点
log4j.rootLogger=trace,myrollingfile

② 代码

@Test
public void test1(){
   
    Logger logger = Logger.getLogger(Log4jTest1.class);

    for(int a=0;a<100000;a++) {
        logger.trace("输出trace日志等级");
        logger.debug("输出debug日志等级");
        logger.info("输出info日志等级");
        logger.warn("输出warn日志等级");
        logger.error("输出error日志等级");
        logger.fatal("输出fatal日志等级");
    }
}

③ 结果

3. 日志按时间进行拆分

Log4j使用DailyRollingFileAppender对日志文件按照时间进行拆分

配置项:

#指定Appender
log4j.appender.自定义名=org.apache.log4j.DailyRollingFileAppender
#指定文件输出位置和文件名
log4j.appender.自定义名.file=文件地址
#输出字符编码
log4j.appender.自定义名.encoding=UTF-8
#时间拆分模式
log4j.appender.自定义名.datePattern='.'yyyy-MM-dd HH-mm-ss

注:yyyy-MM-dd HH-mm-ss是按秒进行拆分,yyyy-MM-dd是按天进行拆分,以此类推

例:使用DailyRollingFileAppender对文件按时间进行拆分

① 配置项

#指定Appender
log4j.appender.myDailyrollingfile=org.apache.log4j.DailyRollingFileAppender
#指定文件输出位置和文件名
log4j.appender.myDailyrollingfile.file=D:\\mylog4j.log
##输出格式
log4j.appender.myDailyrollingfile.layout=org.apache.log4j.SimpleLayout
#输出字符编码
log4j.appender.myDailyrollingfile.encoding=UTF-8
#时间拆分模式
log4j.appender.myDailyrollingfile.datePattern='.'yyyy-MM-dd HH-mm-ss

#配置根节点myconsole,myfile
log4j.rootLogger=trace,myDailyrollingfile

注:一般正常的是按天或者周进行拆分,这里是按照秒拆分

② 代码

@Test
public void test1(){

    Logger logger = Logger.getLogger(Log4jTest1.class);

    for(int a=0;a<100000;a++) {
        logger.trace("输出trace日志等级");
        logger.debug("输出debug日志等级");
        logger.info("输出info日志等级");
        logger.warn("输出warn日志等级");
        logger.error("输出error日志等级");
        logger.fatal("输出fatal日志等级");
    }
}

③ 输出文件

4. 日志数据库持久化

Log4j使用JDBCAppender日志持久化到数据库

导入mavan依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.14</version>
</dependency>

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

创建数据库表结构:根据具体的业务需求创建

CREATE TABLE `tbl_log`(
  `id` BIGINT(20) AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
  `name` varchar(255)  NOT NULL COMMENT '项目名称',
  `createTime` varchar(255)  NOT NULL COMMENT '创建时间',
  `level` varchar(255)  COMMENT '日志级别',
  `category` VARCHAR(255) DEFAULT NULL COMMENT '全限定类名',
  `filename` VARCHAR(255) DEFAULT NULL COMMENT '文件名称',
  `message` VARCHAR(255) DEFAULT NULL COMMENT '日志消息'
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='log4j日志持久化表';

JDBCAppender配置项:

#配置Appender输出到数据库
log4j.appender.自定义名=org.apache.log4j.jdbc.JDBCAppender
#数据库驱动
log4j.appender.自定义名.Driver=com.mysql.jdbc.Driver
#数据库链接
log4j.appender.自定义名.URL=jdbc:mysql://localhost:3306/……
#账号密码
log4j.appender.自定义名.User=
log4j.appender.自定义名.Password=
#插入SQL
log4j.appender.自定义名.Sql=

例:

① 配置文件

#配置Appender输出到数据库
log4j.appender.myjdbcappender=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.myjdbcappender.Driver=com.mysql.jdbc.Driver
log4j.appender.myjdbcappender.URL=jdbc:mysql://localhost:3306/wql
log4j.appender.myjdbcappender.User=root
log4j.appender.myjdbcappender.Password=123
log4j.appender.myjdbcappender.Sql= INSERT INTO tbl_log(`name`,`createTime`,`level`,`category`,`filename`,`message`) values('project_log','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%m')

② 代码

@Test
public void test1(){
    Logger logger = Logger.getLogger(Log4jTest1.class);
    
    logger.trace("输出trace日志等级");
    logger.debug("输出debug日志等级");
    logger.info("输出info日志等级");
    logger.warn("输出warn日志等级");
    logger.error("输出error日志等级");
    logger.fatal("输出fatal日志等级");
    
}

③ 数据库数据

 


路漫漫其修远兮,吾将上下而求索