我有一个用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文件。
答案 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文件:
为了仍然提供log4j2文件作为EAR的一部分(由模块共享),我认为需要在META-INF / MANIFEST.MF中创建一个Class-Path条目。您可以将目录或资源jar位置作为Class-Path的一部分提供。要提供目录,需要EAR。
我刚才没有尝试过,但我希望它能为你找到线索,你会在需要的地方纠正我。
此外,Log4j2具有trailing path separator的功能,可以即时适应它。为了您的优势,我强烈建议您将Log4j2文件作为服务器类路径的一部分提供,而不是深入嵌入jar,war或ear中。它会更容易找到和修改。