EAR的Log4j2.xml配置文件位置

时间:2015-04-18 15:32:01

标签: java java-ee log4j ear log4j2

我有一个用ejbs和war打包的Java EE应用程序。以下是EAR的结构:

myapp.ear
-lib
-META-INF
-ejbjar1.jar
-ejbjar2.jar
-mywebapp.war

我需要使用log4j2,所以我首先尝试通过跟随instructions to initialize Log4j 2 in a web application从web.xml配置它,但是当我在EJB中创建Logger时它会抛出:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

给出here的指令对我来说不太清楚,但我明白我需要将log4j2.xml放在共享位置。

我试图将EML放在EAR中,在EAR / lib内部,在EAR / META-INF内,但我得到了相同的结果。在这些情况下,我还没有在web.xml中配置任何内容。

如何为EAR配置log4j2,以便配置可用于所有类(ejb-module,web-module的类)?

我正在使用Weblogic 12C。以前我在Weblogic 11G中成功使用了log4j2,但在这种情况下,打包是一个WAR文件。

2 个答案:

答案 0 :(得分:2)

您可以将log4j2.xml文件打包到其中一个ejbjar1.jar中,或者根据需要创建一个新的configonly.jar。然后应该在您的ejb模块和战争中共享它。此外,如果您想将日志与ejb和war分开,您可以配置两个不同的文件追加器和两个不同的记录器,一个用于ejb,另一个用于war。以下是使用GlassFish v4.1的工作示例log4j2.xml。请注意status =“trace”以跟踪任何配置问题。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%d{yyyy-MMM-dd EEE HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </Console>

        <!-- for GlassFish v4.1 the logs will be in the domains directory -->
        <RollingFile name="appServerRollingFile" fileName="../app-logs/app-server.log"
            append="true"
            filePattern="../app-logs/$${date:yyyy-MMM}/app-server-%d{yyyy-MMM-dd}-%i.log.zip"
            ignoreExceptions="false">    
            <PatternLayout
                pattern="%d{yyyy-MMM-dd EEE HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
            <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>

        <!-- for GlassFish v4.1 the logs will be in the domains directory -->
        <RollingFile name="appWebRollingFile" fileName="../app-logs/app-web.log"
            append="true"
            filePattern="../app-logs/$${date:yyyy-MMM}/app-web-%d{yyyy-MMM-dd}-%i.log.zip" ignoreExceptions="false">
            <PatternLayout
                pattern="%d{yyyy-MMM-dd EEE HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
            <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="TRACE">
            <AppenderRef ref="Console" level="TRACE"/>
        </Root>
        <Logger name="test.business" level="TRACE" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="appServerRollingFile" />
        </Logger>

        <Logger name="test.web" level="TRACE" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="appWebRollingFile" />
        </Logger>
    </Loggers>
</Configuration>

答案 1 :(得分:2)

为了确保,我们引用您所指的文档中重要的部分:

  

Java EE应用程序

     

Java EE应用程序将包含一个或多个WAR文件和   可能是一些EJB,通常都包装在EAR文件中。通常,它   希望有一个适用于所有的配置   EAR中的组件。日志类通常放在   跨所有组件和配置共享的位置   也需要分享。务必按照说明进行操作   在Web应用程序中初始化Log4j 2.

来自"Using Log4j 2 in Web Applications"

  

配置

     

Log4j允许在中指定配置文件   web.xml使用log4jConfiguration上下文参数。 Log4j会   按以下方式搜索配置文件:

     
      
  • 如果提供了位置,则将其作为servlet上下文进行搜索   资源。例如,如果log4jConfiguration包含“logging.xml”   然后Log4j将在根目录中查找具有该名称的文件   的Web应用程序。
  •   
  • 如果没有定义任何位置,Log4j将搜索   对于以WEB-INF目录中的“log4j2”开头的文件。如果更多   找到一个文件,如果文件以“log4j2-name”开头   存在,其中name是Web应用程序的名称,然后是它   将会被使用。否则将使用第一个文件。
  •   
  • “正常”   使用类路径和文件URL的搜索序列将被用于   找到配置文件。
  •   

请注意,从EAR开始时,其中的每个模块通常使用它自己的隔离类加载器启动。

首次尝试使其工作可能是通过提供log4j2作为单个嵌入式战争组件的一部分。

所以,我不确定您使用什么来组装您的EAR,但最简单的方法是将其放入您的EE应用程序中打包的(每个)webModule(war)的WEB-INF中{{3} })。

如果您正在使用maven,那么您将拥有单独的EJB和Web模块的单独项目。因此,您应该能够在以下位置提供log4j2文件:

  • 网络模块:src / main / webapp / WEB-INF
  • EJB:src / main / resources(应该让maven将它复制到jar中的META-INF)。

为了仍然提供log4j2文件作为EAR的一部分(由模块共享),我认为需要在META-INF / MANIFEST.MF中创建一个Class-Path条目。您可以将目录或资源jar位置作为Class-Path的一部分提供。要提供目录,需要EAR

我刚才没有尝试过,但我希望它能为你找到线索,你会在需要的地方纠正我。

此外,Log4j2具有trailing path separator的功能,可以即时适应它。为了您的优势,我强烈建议您将Log4j2文件作为服务器类路径的一部分提供,而不是深入嵌入jar,war或ear中。它会更容易找到和修改。