slf4j-log4j12加log4j自定义配置包路径日志输出
项目日志在定位问题原因上起着重要的作用,有用的日志输出能提高解决问题的效率,所以日志配置还是很关键的,对一个项目来说有用的日志包路径一般都是项目自己包路径下的日志,集成的框架和依赖包中的包路径下的日志其次,代码在哪里需要输出日志和开发者的水平有关,排除这个因素,假设项目代码输出日志都很合理,那就剩下日志配置了,下面记录一下配置log4j.properties文件,实现自定义包路径日志输出。
配置遵循以下几个原则:
1、项目本身包路径就使用info级别日志,
2、项目依赖第三方包中的日志对接好之后一般对解决公司业务问题不会起到作用,这些日志级别可以设置在ERROR
3、可能还会要看sql,这对前期项目问题较多的时候很有用,sql输出有种两种,一种mybatis配置文件配置上logImpl,可以有格式的输出sql,参数,和结果集,但是这种用在生产上就不太好了,有的结果集多了导致日志很大,所以这种开发的时候用用可以,测试以后的阶段禁止。第二种就是log4j里配置mapper路径下的级别在DEBUG,可以输出sql和参数,这里是没有结果集的。
这是目前认为比较合理好的配置,下面说我遇到的问题:
原项目配置
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version>
</dependency>
原项目只引用了上面这一个slf4j-log4j12的依赖包,项目也是正常的在跑,日志也是看似正常的输出,日志一直是info级别,且只是简单的配置了一下输出到控制台,如下:
log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c]-[%p] %m%n
上面这个log4j.properties配置只是把项目中所有info级别的可见日志输出到控制台,因为用的tomcat也就是会输出到catalina.out这个文件里,并且log4j配置里没有控制文件切割,如果服务器上也没控制catalina.out文件切割那么这个文件就会越来越大,等哪天真的有问题要查日志了那文件估计大到打不开,不能给自己找那麻烦。
额外多说几句
这里切割文件直接在服务器上做了,脚本处理逻辑:加了一个定时任务0点钟catalina.out文件内全部内容复制到另一个文件,当前文件清空,亲测可用。这里不能mv成新文件名再从新创建一个catalin.out文件,亲测不可用。
改动的内容
最近在升级项目架构,支持多数据源切换,部署的时候发现log4j不能正常初始化,配置内容如下:
让日志根级别是warn,项目自己包路径下是info,打印sql的要配置成debug,其它的第三方包都是error,看着清净
log4j.rootLogger=WARN,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c]-[%p] %m%n
#这里配置是自定义的包路径日志级别,只要这些就行
log4j.logger.xxx.xxx=INFO,A2
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c]-[%p] %m%n#...这里配置的三项和上面一样就不写了
log4j.logger.xxx.xxx.service=INFO,A3
...
log4j.logger.xxx.xxx.mapper=DEBUG,A4
...
log4j.logger.org.apache.dubbo=ERROR,A5
...
出现异常一
1、log4j WARN No appenders could be found for logger, Please initialize the log4j system properly
2、Class path contains multiple SLF4J bindings,这里提示是类是StaticLoggerBinder.class
原因是有两个同名类,一个在activemq-all包里,一个在slf4j-log4j12包里,第一个感觉这第一个错是因为第二个错导致,所以解决先第二个,在mq依赖包中排除slf4j-log4j12的依赖就行了,但是我从依赖树关系查看(maven项目pom.xml文件dependency analyzer可以看到),项目mq引用的依赖包是activemq-all这个包里只有一个slf4j-api的依赖包,没有看到slf4j-log4j12,这个包比较坑,它把slf4j-log4j12包中东西应该打进去了,看图:
不知道的一定不会想到为什么mq没有依赖slf4j-log4j12还一直提示在mq包中找到了StaticLoggerBinder这个类,所以以后引用什么依赖就专门找那个包,像这种带all的包指不定加了什么东西,所以果断更换mq依赖:
<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-client</artifactId><version>${activemq.version}</version>
</dependency>
出现异常二
上面的问题解决之后,发现很多日志都打印了两遍,原因在上面log4j.properties配置文件,只有log4j.rootLogger的时候日志会打印一遍,后面又单独配置了包路径和控制台输出又打印一遍,所以log4j.rootLogger配置了控制台输出就不需要配置其它包路径输出了,除非指定出错到文件,所以上面的配置最终修改是:
log4j.rootLogger=WARN,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c]-[%p] %m%n
#这里配置是自定义的包路径日志级别,只要这些就行
log4j.logger.xxx.xxx=INFO
log4j.logger.xxx.xxx.service=INFO
log4j.logger.xxx.xxx.mapper=DEBUG
log4j.logger.org.apache.dubbo=ERROR
我这里没有配置输出到文件切割,因为做了catalina.out切割输出,看这一个文件就够了
补充
上面配置发现还存在一个导致日志输出两边的问题,就是自定义的两个包路径是父子包路径的时候,配置了父包之后,增加一条子包配置就会出现打印两边的问题,所以不能配置子包路径日志级别。
slf4j-log4j12加log4j自定义配置包路径日志输出相关推荐
- tinymce加载自定义语言包
对tinymce自带的语言包不满意,重新修改语言包后通过language_url来加载自定义语言包.但是不管怎么修改language_url都没有生效,最后发现自定义的语言代码不能和既有的语言代码重复 ...
- log4j.properties配置与将异常输出到Log日志文件实例
将异常输出到 log日志文件 实际项目中的使用: <dependencies><dependency><groupId>org.slf4j</groupId& ...
- dojo 加载自定义module的路径问题
因为最近想学学ArcGIS API for JavaScript ,翻了下ESRI的官网guide,发现其是基于dojo框架的,看了两页实在看不懂,于是先来熟悉下dojo框架.人蠢不能怪社会%> ...
- vue下载文件自定义路径_npm 自定义配置 文件下载路径
Nodejs 内置的npm默认会把模块安装在c盘的用户AppData目录下,以下步骤是为了让大家学习如何更改npm 安装目录的 首先你可以使用cmd命令进行查看当前电脑的npm 安装路径. 输入 np ...
- linux启动jar包指定日志输出目录下,linux 启动jar包 指定yml配置文件和输入日志文件...
命令为: nohup java -jar project.jar --spring.config.location=/home/project-conf/application.yml > ...
- linux log4j2.xml,动态配置log4j2.xml日志输出文件的位置
目标:根据启动jar时传进main()的参数动态修改日志位置 一.修改启动项 MainMapLookup.setMainArguments(args); 注:不要在lookup设置之前初始化log(如 ...
- [转载]java日志框架log4j详细配置及与slf4j联合使用教程
一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到"build path" 1 2 3 4 5 &l ...
- java日志框架log4j详细配置及与slf4j联合使用教程
最后更新于2017年02月09日 一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到"build path&q ...
- SpringBoot和日志框架:缘由,日志框架的选择,使用,自定义配置,日志框架切换
日志框架 缘由 如果像我们初学者,想知道代码运行到哪里了,一般都是会System.out.println() 进行输出到控制台查看代码运行的情况,好知道代码错误在哪里 但是大型的系统里面,如果有很多的 ...
最新文章
- 漫话:如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?
- Node.js前置知识点(二):同步/异步
- C#进行MapX二次开发之鹰眼实现
- 把数据自动填入exe的输入框_2000余字长文讲解Excel中的“数据验证”,我收藏了...
- UE3客户端加入DS过程
- aba会导致问题_肌肤缺水会导致哪些问题呢?我们又该怎么判断呢?
- ICS/SCADA 系统的对比
- 数据中台和业务中台的区别
- Memcached的安装与使用
- Go实现Raft第四篇:持久化和调优
- python消费kafka逻辑处理导致cpu升高_Kafka 消费迟滞监控工具 Burrow
- 论文赏析[EACL17]K-best Iterative Viterbi Parsing(K-best迭代维特比句法分析)
- 有监督对比学习在分类任务中的应用 Supervised Contrastive Learning
- photoshop cs3 调色教程 让夏天成秋天
- 关于Google谷歌微信不能使用小程序
- 如何保障企业业务流程的落地实施?
- echarts 地图显示(定位图标)
- 【pytest官方文档】解读-fixtures函数和测试函数的参数化
- 计算机word画铁路,在word中画铁路线.docx
- OpenCV 保存视频