全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

利用Log4j将不同Package的日志输出到不同文件的方法

前言

随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就存在以下这些日志:

  1. 接收外界消息的日志、对外发送消息的日志;
  2. 后台常驻线程的处理日志;
  3. 外部接口访问的参数、返回结果等接口日志;
  4. Service访问数据库产生的SQL日志;

这其中,消息日志和后台线程的日志数据量非常庞大,如果所有日志打印在一个文件中,使用tail -f log.log文件,会发现日志在快速的滚动,根本无法查看甚至定位某一个具体的SQL或者Service访问日志。

解决方法就是可以将不同的日志加以分类输出,这样相互的日志不影响,尤其重要的接口访问日志,能够很方便的定位和排查问题。

步骤1:在log4j.properties中配置

先贴一下我自己所有的log4j.properties配置:

log4j.rootLogger=INFO, console, file
 
log4j.appender.console=net.czt.log.AsyncConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p crazyant-web %-17c{2} (%13F:%L) %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} - %m%n
log4j.appender.console.bufferSize=10000
log4j.appender.console.encoding=UTF-8
 
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.file=/home/work/apache-tomcat-6.0.39/logs/crazyant.log
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.MaxFileSize=1GB
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p] crazyant-web %d{yyyy-MM-dd HH:mm:ss,SSS} %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} method:%l%n%m%n
log4j.appender.file.bufferSize=10000
log4j.appender.file.encoding=UTF-8
 
log4j.logger.net.czt.crazyant.msg=DEBUG, message
log4j.additivity.net.czt.crazyant.msg=false
log4j.appender.message=org.apache.log4j.RollingFileAppender
log4j.appender.message.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_message.log
log4j.appender.message.Append=true
log4j.appender.message.MaxFileSize=1GB
log4j.appender.message.MaxBackupIndex=5
log4j.appender.message.layout=org.apache.log4j.PatternLayout
log4j.appender.message.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.message.encoding=UTF-8
 
log4j.logger.net.czt.crazyant.async.service=DEBUG, async
log4j.additivity.net.czt.crazyant.async.service=false
log4j.appender.async=org.apache.log4j.RollingFileAppender
log4j.appender.async.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_async.log
log4j.appender.async.Append=true
log4j.appender.async.MaxFileSize=1GB
log4j.appender.async.MaxBackupIndex=5
log4j.appender.async.layout=org.apache.log4j.PatternLayout
log4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.async.encoding=UTF-8
 
log4j.logger.net.czt.orm.mybatis.SqlMonitorManager=DEBUG, showsql
log4j.additivity.net.czt.orm.mybatis.SqlMonitorManager=false
log4j.logger.net.czt.transaction.interceptor.SmartTransactionInterceptor=DEBUG, showsql
log4j.additivity.net.czt.transaction.interceptor.SmartTransactionInterceptor=false
log4j.appender.showsql=org.apache.log4j.RollingFileAppender
log4j.appender.showsql.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.log
log4j.appender.showsql.Append=true
log4j.appender.showsql.MaxFileSize=1GB
log4j.appender.showsql.MaxBackupIndex=5
log4j.appender.showsql.layout=org.apache.log4j.PatternLayout
log4j.appender.showsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.showsql.encoding=UTF-8
 
log4j.logger.net.czt.crazyant.service=DEBUG, service
log4j.additivity.net.czt.crazyant.service=false
log4j.appender.service=org.apache.log4j.RollingFileAppender
log4j.appender.service.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_service.log
log4j.appender.service.Append=true
log4j.appender.service.MaxFileSize=1GB
log4j.appender.service.MaxBackupIndex=5
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.service.encoding=UTF-8

在配置文件的下方,可以方便的看到,我将message(消息)、async(后端线程)、showsql(数据库日志)、service(接口调用)分别输出到了不同的日志文件。

其中的一些解释:

log4j.rootLogger=INFO, console, file

log4j有一个rootLogger和普通Logger的概念,默认情况下我们只需要一个rootLogger,就是所有的日志只会输出到这一个日志文件中。

看一下普通Logger的配置(以接口日志service为例):

1、log4j.logger.net.czt.crazyant.service=DEBUG, service

      这句中的”net.czt.crazyant.service”,表示该普通logger日志配置生效的package的完全路径

      其中色service,表示该普通logger的名字

2、log4j.additivity.net.czt.crazyant.service=false

      其中的”net.czt.crazyant.service”,和上面的相同,表示该配置项针对的package

      该句配置的意思,是不要将该package的日志输出到rootLogger日志中,只输出到自己配置的日志就行了;

3、log4j.appender.service=org.apache.log4j.RollingFileAppender,以及该配置段下面的配置项

       这里的”service”字符串,和上面的第一个配置项的”service”相同,表示对该普通Logger的配置;

       下方的配置项和rootLogger相同,表示每天输出文件、编码UTF8、分片规则、每行的输出模式等等

我自己遇到的问题,是上面的log4j.properties配置好以后,发现各个日志文件创建了,但是里面都没有内容,这是为啥呢?来看下面第二个注意的地方;

步骤2、输出日志时需要设定日志对象对应的具体Class

什么意思呢?上面的配置项中,有一个”net.czt.crazyant.service”的package字符串,那么我们自己想一下,log4j是怎样将不同package中的logger日志输出到不同文件呢,想一下会有两种方法:

1、采用intercepter或者aop的方式,log4j自己检测日志输出,检测到日志产生于哪个package,就将其输出到对应文件中;

2、由用户传一个Class参数,log4j获取该Class对应的Package,以此为准,来定位不同的日志文件;

看一下代码,显然log4j用的是后一种简单直接的方式:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class MyClassImpl implements MyClass {
 /**
  * loger
  */
 private static final Log logger = LogFactory.getLog(MyClassImpl.class);
 
 /**
  * my func
  */
 public void myfunc() {
  logger.info("call method myfunc.");
 }
}

logger = LogFactory.getLog(MyClassImpl.class)中,传入了使用该logger的Class参数,而该Class被反射取到的package地址,就是log4j用来输出日志的package地址。

这种做法也有强大的地方,方便逻辑上的日志归类,比如很多代码不属于一个package,但是它们逻辑上属于一起的,举个例子,消息的处理不只是接口调用Service这个package,可能还会调用发送msg的操作,如果想把msg的package中一些日志也输出到Service,那么在这个msg的logger初始化的时候,传入一个Serivice的Class就行了。

或者对于某一类的所有日志来说,它们所有的logger对象,都来自封装好的单个对象实例即可,而这个单个对象实例传入的参数只有一个,用于标识这个逻辑归类即可。

总结

Log4j.properties中,支持package或者具体class的日志单独输出,但是也需要代码中logger初始化的时候,能和日志配置中的package对应上。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# log4j日志输出到文件  # log4j指定类日志输出  # log4j指定包日志输出  # java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)  # 可替代log4j日志的c#简单日志类队列实现类代码分享  # Java日志软件Log4j的基本使用教程  # 使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析  # Node.js 日志处理模块log4js  # Log4j定时打印日志及添加模块名配置的Java代码实例  # 在Java下利用log4j记录日志的方法  # Log4j按级别输出日志到不同文件的实现方法  # 很详细的Log4j配置步骤  # log4j使用教程详解(怎么使用log4j2)  # 自己的  # 看一下  # 有一个  # 的是  # 这是  # 就行了  # 这一  # 也有  # 会有  # 好了  # 在这个  # 第一个  # 还会  # 两种  # 将其  # 只会  # 第二个  # 是怎样  # 只有一个  # 我将 


相关文章: 黑客如何通过漏洞一步步攻陷网站服务器?  如何快速搭建响应式可视化网站?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何在IIS中新建站点并解决端口绑定冲突?  如何用西部建站助手快速创建专业网站?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  重庆网站制作公司哪家好,重庆中考招生办官方网站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何打造高效商业网站?建站目的决定转化率  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  制作销售网站教学视频,销售网站有哪些?  建站VPS推荐:2025年高性能服务器配置指南  建站主机数据库如何配置才能提升网站性能?  网站制作壁纸教程视频,电脑壁纸网站?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  如何在万网ECS上快速搭建专属网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  宝塔新建站点为何无法访问?如何排查?  如何在Windows 2008云服务器安全搭建网站?  建站之星导航菜单设置与功能模块配置全攻略  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  微信小程序 五星评分(包括半颗星评分)实例代码  完全自定义免费建站平台:主题模板在线生成一站式服务  如何在服务器上三步完成建站并提升流量?  如何在阿里云高效完成企业建站全流程?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  开心动漫网站制作软件下载,十分开心动画为何停播?  高防服务器租用指南:配置选择与快速部署攻略  大连网站制作公司哪家好一点,大连买房网站哪个好?  建站上市公司网站建设方案与SEO优化服务定制指南  建站之星如何实现网站加密操作?  如何选择可靠的免备案建站服务器?  如何快速搭建个人网站并优化SEO?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何在云服务器上快速搭建个人网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  高端云建站费用究竟需要多少预算?  c++ stringstream用法详解_c++字符串与数字转换利器  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  平台云上自助建站如何快速打造专业网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  ,网站推广常用方法?  网站制作员失业,怎样查看自己网站的注册者?  如何零成本快速生成个人自助网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。