Log4J 系列:log4j 整合SpringMVC+MyBatis 实现日志记录(01)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4J 系列:log4j 整合SpringMVC+MyBatis 实现日志记录(01)相关的知识,希望对你有一定的参考价值。

一、准备工作

1、工程目录

  技术分享技术分享

2、所需jar包 

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

二、配置log4j

1、修改log4j DailyRollingFileAppender.java 这个类太大就不复制了,直接看关键性代码

由于log4j自带的DailyRollingFileAppender在根据时间来生成日志文件时控制台日志会显示Failed to rename(无法重命名)

所以没办法根据log4j提供的方法去根据日期生成日志文件,我们先去看看log4j的这个BUG

技术分享

由于tomcat在运行期间会一直占用该文件,在调用该方法的时候就会抛出这个异常来,接下来我们需要创建自己的DailyRollingFileAppender类,

log4j提供的DailyRollingFileAppender类有很多方法在我们的项目中是无法重写的在这里我们去继承DailyRollingFileAppender父类FileAppender.java

文件来达到我们想要的效果

public class CmsDailyRollingFileAppender extends FileAppender

 在这里只为大家演示关键性代码,PS:这段代码是在网上Copy下来的,在我们自己定义的DailyRollingFileAppender 添加一个复制方法用来处理log4j的这个bug

boolean copy(File src, File dst) throws IOException {  
          try {  
           InputStream in = new FileInputStream(src);  
           
           OutputStream out = new FileOutputStream(dst);  
           
           // Transfer bytes from in to out  
           byte[] buf = new byte[8192];  
           int len;  
           while ((len = in.read(buf)) > 0) {  
            out.write(buf, 0, len);  
           }  
           in.close();  
           out.close();  
           return true;  
          } catch (FileNotFoundException e) {  
           LogLog.error("源文件不存在,或者目标文件无法被识别." );  
           return false;  
          } catch (IOException e) {  
           LogLog.error("文件读写错误.");  
           return false; 
          }
      }

修改rollOver()方法,找到这段代码干掉替换成 copy方法保存文件

技术分享

2.配置log4j.properties文件

# 这里的INFO,Stdout,D,E 看官们可以理解为变量,也可以说是输出平台,在下面我们可以看到
log4j.rootLogger = info,stdout,D,E # 控制台输出,stdout在这里就对应了上面的变量,consoleAppender 看名字也可以明白这个是控制台输出日志信息 log4j.appender.stdout = org.apache.log4j.ConsoleAppender
# 这里没人的是System.out,也就是输出 out输出是黑色字体,err输出的字体是红色 log4j.appender.stdout.Target
= System.out
# layout是指布局,也就是说输出日志信息的格式样式,在这里我们使用的是log4j提供的 log4j.appender.stdout.layout
= org.apache.log4j.PatternLayout
# 这里就是指定我们日志文件以哪一种格式去输出 log4j.appender.stdout.layout.ConversionPattern
= [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n
# INFO级别输出日志文件
# 这里可以看到使用的是我们自定义的DailyRollingFileAppender.java log4j.appender.D
= com.nc.rms.log4j.CmsDailyRollingFileAppender
# 指定日志输出位置${catalina.home}这个是tomcat的变量,不了解的看官可以自行脑补下 log4j.appender.D.File
= ${catalina.home}/logs/rms/info/info
#这个的意思是指是追加还是覆盖 默认是 true true是追加 false是覆盖 log4j.appender.D.Append
= true
# 这个是指日志输出的级别在这里指定的是 INFO级别 log4j.appender.D.Threshold = INFO
#这个就不做介绍了 log4j.appender.D.layout
= org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#这里就根据时间来生成日志文件了,在这里为了演示定义的是每分钟生成日志文件 log4j.appender.D.DatePattern
= ‘.‘yyyy-MM-dd-HH-mm‘.log‘ # ERROR级别输出日志文件
# 这个跟上面一样 只不过是日志级别是 ERROR级的,方便我们直接查看系统异常信息 log4j.appender.E
= com.nc.rms.log4j.CmsDailyRollingFileAppender log4j.appender.E.File =${catalina.home}/logs/rms/error/error log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n log4j.appender.E.DatePattern = ‘.‘yyyy-MM-dd-HH-mm‘.log‘
# 记录日志至数据库
# log4j.appender.db
=com.nc.rms.log4j.JndiDSAppender
# 这玩意就是每次缓存多少条数据然后插入数据库,为了演示这里设置为1 log4j.appender.db.BufferSize
=1
# 这里使用的是tomcat的数据源
log4j.appender.db.jndiName=java:comp/env/jdbc/DefaultDS
# 看名字也该明白这里是定义Sql语句的啦 log4j.appender.db.sql
=insert into my_log (ID,DATE,MESSAGE,USER_NAME) values (REPLACE(UUID(), ‘-‘, ‘‘),‘%d{yyyy-MM-dd HH\\:mm\\:ss}‘,‘%m‘,‘%X{userName}‘)
log4j.appender.db.layout
=org.apache.log4j.PatternLayout
# 这里定义的哪些包下的日志信息需要记录到数据库当中 log4j.logger.com.nc.rms.manage.web
=info,db log4j.logger.com.nc.rms.service=info,db log4j.logger.com.nc.rms.dao=info,db

 

以上是关于Log4J 系列:log4j 整合SpringMVC+MyBatis 实现日志记录(01)的主要内容,如果未能解决你的问题,请参考以下文章

课时9::MyBatis整合Log4j延迟加载

springboot整合log4j

Log4j整合Flume

Log4J日志整合及配置详解

springboot mybatis 整合后怎么答应输出sql语句

MyBatis5——Mybatis整合log4j延迟加载