您的位置:首页 > 运维架构 > Tomcat

tomcat中多个项目(web项目)共用log4j.jar的情况下,如何让其各自打印各自的日志文件。及输出同级别日志信息

2018-01-31 10:08 1106 查看
问题描述:

1.项目A中有一个log4j.properties(配置为把日志输出到以项目名称命名的文件夹中) 

2.为了减轻tomcat负担,把项目A的WEB-INF/lib下的所有jar文件拷贝到tomcat下的lib中并修改catalina.properties对其加载 

3.把项目A复制一份为项目B 

4.然后把项目A和项目B同时发布在tomcat中(发布时删除了WEB-INF/lib) 
访问项目A和项目B,发现两个应用的日志全部输出到了项目A的文件夹中。 

在所有的jar文件都拷贝到tomcat/lib中的前提下,如何使得各个应用的log4j.properties生效呢?? 

目前知道的是,两个工程中的log4j.properties的确都被加载了,只是最后一个被加载的log4j.properties覆盖了前面加载的配置,也就是说只有最后被加载的生效了。

解决办法目前综合网上的有两种方法:

方法1:删除tomcat文件夹下里共用的log4j.jar,分别在项目里添加上自己的log4j.jar(要加在WEB-INF下的lib文件夹下),log4j.properties文件依然放在src下,项目启动加载会把其加载到WEB-INF下,正常情况这样就可以了,但是有些同学会遇到启动报错,说找不到log4j.jar这个jar,这里还须修改一下web.xml里的配置

正常情况下需要配置路径及监听器的,如下图(多个项目配多个日志请款下,其红圈里的value值要不一样,value自己随意起名字,不同即可)



我们只需把配置路径及监听器去掉即可。只留一个webAppRootKey这一项既可(本方法以亲测有效)

方法2:

所有的工程的日志配置也放在在同一个log4j.properties文件中,不需要再每个工程中存在log4j.properties文件

将这个log4j.properties文件放到某一个工程的classes目录中

例如:tomcat下部署了bgapi和report两个项目,

一个简单的log4j.properties配置如下:

log4j.rootlogger=info

log4j.addivity.org.apache=true //是否追加写入

#CONSOLE

#log4j.category.com=INFO,console //category已被放弃

log4j.logger.com=INFO,console

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.Threshold=DEBUG

log4j.appender.console.Target=System.out

log4j.appender.console.Encoding=UTF8

#PatternLayout布局就要指定的打印信息的具体格式

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern= %d - %c -%-4r [%t] %-5p %x - %m%n

# bgapi的项目log输出配置,每天生成一个文件

log4j.logger.com.bgapi=DEBUG,bgapi

log4j.appender.bgapi=org.apache.log4j.DailyRollingFileAppender

log4j.appender.bgapi.File=/usr/local/bgapi/log

log4j.appender.bgapi.Encoding=UTF8 

log4j.appender.bgapi.Threshold=DEBUG

log4j.appender.bgapi.DatePattern=yyyy-MM-dd'.log'

log4j.appender.bgapi.layout=org.apache.log4j.PatternLayout 

log4j.appender.bgapi.layout.ConversionPattern= %d - %c -%-4r [%t] %-5p %x - %m%n

# report项目的log输出配置

log4j.logger.com.report=DEBUG, report

log4j.appender.report.file=/usr/local/report/log

log4j.appender.report.=org.apache.log4j.RollingFileAppender

#文件的最大尺寸

log4j.appender.report.MaxFileSize=500kb 

#最大记录文件数, N(这里为10)天前的会被删除

log4j.appender.report.MaxBackupIndex=10 

log4j.appender.report.layout=org.apache.log4j.PatternLayout

log4j.appender.report.layout.ConversionPattern=%d{mm/dd hh:mm:ss.sss} %-5p %c %m%n

使用说明如下:

对于bgapi项目中的类,package必须以 com.bgapi 开头

如:Test类,日志调用 private static Logger logger = LogManager.getLogger(Test.class);

或者:static Logger loggerError = Logger.getLogger("com.bgapi");

report的功能的package以 com.report开头

或者:static Logger loggerError = Logger.getLogger("com.report");

所以我们在每个项目在开发时,最好在com开头,且不重名的package名区分,这样才能区分输出日志时针对的工程

在说一下只输出同级日志的办法

即:你定义的级别为info的时候,在info里也会输出error级别的日志,这样看着很乱,所以可以让info只输出info级别的日志,

在log4j.appender.info = org.apache.log4j.DailyRollingFileAppender 这一栏,表示输出动啊日志文件里,但其底层是判断该日志信息是否是本级或高于本机的,我们只需重写一下即可,简单粗暴:

package com.zab;

import org.apache.log4j.DailyRollingFileAppender;

import org.apache.log4j.Priority;

public class LogAppender extends DailyRollingFileAppender {
@Override  
public boolean isAsSevereAsThreshold(Priority priority) {  
  //只判断是否相等,而不判断优先级  
  return this.getThreshold().equals(priority);  
}  

}

然后再log4j.properties里

log4j.appender.info = org.apache.log4j.DailyRollingFileAppender 

改成

log4j.appender.info = com.zab.LogAppender 

即可

附加一个我的log4j.properties,适用于新手

###根配置 优先级高到低--ERROR(错误信息)、WARN(警告)、INFO(一般)、DEBUG(调试)
log4j.rootLogger = debug,stdout,i,D,E
###关闭多余输出信息,关闭ssh框架的输出信息
log4j.logger.org.hibernate=OFF
#log4j.logger.org.springframework=OFF
#log4j.logger.org.apache.struts2=OFF
#log4j.logger.com.opensymphony.xwork2=OFF
#log4j.logger.com.ibatis=OFF

###输出信息到控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出INFO 级别以上的日志到=d:/data/logs/info/log.log ###
###每天产生一个日志文件
log4j.appender.i = org.apache.log4j.DailyRollingFileAppender
###日志文件存放地址
log4j.appender.i.File = d:/data/root/info/log.log
###log4j.appender.i.File =${web.root.one}/WEB-INF/logs/log4j.log
###默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
log4j.appender.i.Append = true
log4j.appender.i.Threshold = INFO
###灵活指定布局模式
log4j.appender.i.layout = org.apache.log4j.PatternLayout
###日志编码
log4j.appender.i.Encoding=UTF-8
### %m 输出代码中指定的消息
### %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
### %r 输出自应用启动到输出该log信息耗费的毫秒数
### %c 输出所属的类目,通常就是所在类的全名
### %t 输出产生该日志事件的线程名
### %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
### %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22 : 10 : 28 , 921
### %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )
log4j.appender.i.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=d:/data/logs/debug/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = d:/data/root/debug/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.Encoding=UTF-8
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] method:%l%n%m%n

### 输出ERROR 级别以上的日志到=d:/data/logs/error/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = d:/data/root/error/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.Encoding=UTF-8
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] method:%l%n%m%n

###设置一些信息的输出级别#可自行参考
log4j.logger.net.sf.hibernate=error
log4j.logger.org.quartz.core=error
log4j.logger.org.apache.axis=error
log4j.logger.com.mchange=error
log4j.logger.com.opensymphony=error
log4j.logger.net.sf.hibernate.SQL=error
log4j.logger.net.sf.hibernate.type=error
log4j.logger.net.sf.hibernate.tool.hbm2ddl=warn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐