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

时间:2018-01-24 14:36:32

标签: java-ee logging log4j war ear

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

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

当我以前单独部署战争时,一切都很好 - 因为jar在战争中并且与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中的包是共享的。

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我找到了一种方法可以使它与CDI和ThreadLocal一起使用。

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

然后,为了获得战争和核心罐中的记录器,我做了:

@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();
}

像魅力一样!我的服务/ daos类都是@requestscoped,所以对于每个请求,我只有一个关联的记录器,它在WAR中被快速回传 - 我根据需要配置log4j.properties。

然而,还有一个不起作用的场景:EJB中的@Schedule方法。在这种情况下,线程是&#34;创建&#34;不在战争中但已经在jar上下文中。对于这些情况,我在EAR的META-INF文件夹中创建了另一个log4j.properties。它现在都在工作。

相关问题