我有一个EJB和战争打包Java EE应用程序。 以下是耳朵的结构:
myapp.ear
-lib
-META-INF
-ejbjar1.jar
-ejbjar2.jar
-mywebapp.war
我需要按照使用log4j2这就是我一直在首先从web.xml中配置它说明在一个Web应用程序初始化Log4j的2 ,但是当我创造的Logger
在EJB它抛出:
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
给出的指令在这里没有太多明确的给我,但我明白,我需要把log4j2.xml共享位置。
我试图将XML放在耳内,耳/ lib目录里面,EAR / META-INF内,但我得到了同样的结果。 在这种情况下,我还没有配置在web.xml什么。
我怎样才能为EAR配置log4j2,这样的配置将可用于所有的类(EJB模块,网络模块类)?
我使用的Weblogic 12C。 此前我已经成功地使用log4j2在Weblogic的11G,但在这种情况下,包装是一个WAR文件。
您可以打包在ejbjar1.jar之一log4j2.xml文件或者如果你喜欢创建新的configonly.jar。 应该然后在您的EJB模块和战争共享。 此外,如果你想从EJB和战争日志分开,你可以配置两个不同的文件追加程序和两个不同的伐木工人一个EJB和一个用于战争。 这是在GlassFish v4.1的工作示例log4j2.xml请注意,状态=“跟踪”跟踪任何配置问题。
<?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>
只是可以肯定,让报价,从你指的是文档的重要部分:
Java EE应用程序
Java EE应用程序将包括一个或多个WAR文件和一些可能的EJB,通常全部打包在EAR文件。 通常,理想的是有适用于在EAR的所有组分的单一结构。 日志记录类通常被放置在所有的组件共享的位置和配置需要也可共享。 一定要按照说明在Web应用程序初始化Log4j的2。
从“Web应用程序中使用的Log4j 2” :
组态
log4j的允许使用log4jConfiguration上下文参数在web.xml中指定的配置文件。 Log4j的将搜索配置文件的方式:
- 如果提供的位置将搜索作为一个servlet上下文的资源。 例如,如果log4jConfiguration包含“logging.xml”,那么Log4j的将寻找在Web应用程序的根目录中该名称的文件。
- 如果没有位置定义的Log4j将搜索在WEB-INF目录“log4j2”开头的文件。 如果找到一个以上的文件,如果以“log4j2名”开头的文件存在,其中name是Web应用程序的名称,那么它将被使用。 否则,第一个文件将被使用。
- 使用类路径和文件的URL的“正常”的搜索序列将被用于定位的配置文件。
请注意,从开始时EAR ,每个模块在其中开始典型地使用它自己的分离的类加载器。
在做它通过提供log4j2作为个人嵌入式战争组件的一部分工作可能第一次尝试。
所以,我不知道你使用的是什么来组装你的耳朵,但最简单的将是砸在你EE应用(内包装(每个)你webModule(战争)的WEB-INF EAR )。
如果您正在使用maven,你将有单独的项目对您的个人EJB和Web模块。 因此,你应该能够提供log4j2文件在以下位置:
- Web模块:SRC /主/ web应用/ WEB-INF
- EJB:SRC /主/资源(这应该让行家将其复制到META-INF你的罐子内)。
为了仍然提供log4j2文件作为EAR(通过模块共享)的一部分,我觉得一个类路径条目,您需要在META-INF / MANIFEST.MF作出。 你会提供目录或资源罐子位置的类路径的一部分。 为了提供一个目录,一个尾随路径分隔将需要。
我没有尝试,就在刚才,但我希望它会得到你一个线索,你会纠正我需要的地方。
此外Log4j2有功能上的变化自动重新加载 ,并适应它的飞行。 对于在你的优势的工作,我会强烈建议为你提供Log4j2文件作为服务器的类路径的一部分,你的罐子,战争,或耳内不深嵌。 这将是更容易找到和修改。