Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee LOG4J-EAR中不同战争的单独日志文件_Jakarta Ee_Logging_Log4j_War_Ear - Fatal编程技术网

Jakarta ee LOG4J-EAR中不同战争的单独日志文件

Jakarta ee LOG4J-EAR中不同战争的单独日志文件,jakarta-ee,logging,log4j,war,ear,Jakarta Ee,Logging,Log4j,War,Ear,我有以下场景:一个EAR,有3场战争(销售模块、内部网模块和主应用程序-lms系统)。每个WAR都有它的log4j.properties来配置单个日志文件、组织和更容易发现每个系统上的问题 问题是,这3场战争与我的服务层(实体、存储库、服务等)共享一个依赖项—一个核心jar。jar没有log4.properties,这里所做的所有日志记录都转到server.log。我想避免它 当我单独部署war时,一切都很好——因为jar在war中,并且与log4j.properties一起。因此: Re

我有以下场景:一个EAR,有3场战争(销售模块、内部网模块和主应用程序-lms系统)。每个WAR都有它的log4j.properties来配置单个日志文件、组织和更容易发现每个系统上的问题

问题是,这3场战争与我的服务层(实体、存储库、服务等)共享一个依赖项—一个核心jar。jar没有log4.properties,这里所做的所有日志记录都转到server.log。我想避免它

当我单独部署war时,一切都很好——因为jar在war中,并且与log4j.properties一起。因此:

   Request -> Intranet.war -> Core JAR -> all logging here goes to intranet.log
   Request -> LMS.war -> Core JAR -> all logging here goes to lms.log
   Request -> Sales.war -> Core JAR -> all logging here goes to sales.log
现在我在EAR中的lib/文件夹中只有一个核心jar,由所有人共享

问题是:我如何根据被称为核心的战争来组织日志

我的意思是,如果我在EAR中调用intranet.war,那么在core.jar中的所有日志仍然会转到intranet.log。同样适用于lms和销售

我在考虑一个对整个EAR都唯一的log4j.properties文件,但是如何在文件中分离呢?我可以使用包方法(例如xxx.lms.yyy转到lms.log),但核心jar中的包是共享的

有什么想法吗


提前谢谢

我找到了一种使用CDI和ThreadLocal的方法

每个请求都有一个关联的线程,所以我制作了一个CDI生产者方法,它有一个简单的逻辑:当前threadlocal中是否有一个记录器?如果是,请退回。如果没有,请从SLF4J LoggerFactory获取一个,将其保存在ThreadLocal中并返回

然后,为了在wars和core jar中获得记录器,我执行以下操作:

@Inject @MyQualifier private Logger logger; 
//I created a specific qualifier because one of the frameworks I use also have a Logger Producer
生产者方法:

@Produces @MyQualifier
public Logger getLogger(InjectionPoint ip){

    ThreadLocal<Logger> t = new ThreadLocal<>();
    if(t.get() == null) {
        Class<?> clazz = ip.getMember().getDeclaringClass();
        t.set(org.slf4j.LoggerFactory.getLogger(clazz));
    }
    return t.get();
}
@产生@MyQualifier
公共记录器getLogger(注入点ip){
ThreadLocal t=新的ThreadLocal();
如果(t.get()==null){
类clazz=ip.getMember().getDeclaringClass();
t、 set(org.slf4j.LoggerFactory.getLogger(clazz));
}
返回t.get();
}
工作起来很有魅力!我的services/daos类都是@requestscope的,因此对于每个请求,我只有一个关联的记录器,该记录器在WAR中被实例化——log4j.properties配置为我想要的上下文


然而,有一种情况是它不起作用的:@Schedule方法在EJB中。在本例中,线程不是在war中“创建”的,而是已经在jar上下文中创建的。对于这些情况,我在EAR的META-INF文件夹中创建了另一个log4j.properties。现在一切都正常了。

您应该能够在EAR本身中放置一个log4j.properties文件,然后在其中为每个单独的war文件包路径添加不同的记录器(希望有不同的!)-在同一个log4j.properties中,还可以为共享jar添加不同的记录器,并将其放到自己的文件中。。这是我一直在考虑的解决方案,但不希望共享jar包含在单独的日志文件中。。。但我认为基于这种基于包的方法是不可能的。如果这有助于您解决问题,请随时为其他人更新此方法-与用一个好的具体工作示例回答您自己的问题一样-获得一些“代表”!:-)成功了!谢谢你的帮助。太棒了,很高兴你的答案也能用+1!当我阅读“机器人”时,别忘了接受你自己的答案,它们会发现未回答的问题,有时会再次将它们排在未回答列表的前面;-)