【问题标题】:Log4j2 WebLookupLog4j2 网络查找
【发布时间】:2014-10-08 08:13:15
【问题描述】:

我在 Tomcat 8.0.12 中运行的 servlet 3.0 Web 应用程序中使用 log4j2 (2.0.2)。我正在尝试使用 weblookup 来获取 Web 应用程序上下文路径以用作日志文件名的一部分。 (我们使用属性在几个不同的上下文中运行相同的war文件来配置它)。

log4j2.xml 文件包括

        <RollingFile name="Web" fileName="/srv/dnsnet/logs/web-${web:contextPath}.logfile" filePattern="/srv/dnsnet/logs/web-${web:contextPath}-%d{yyyy-MM-dd}-%i.log.gz" append="true" immediateFlush="false">
        <PatternLayout>
            <Pattern>%d %-5p [%25.25t] %40.40c{3.} %15X{sysid} %m%n</Pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy />
        </Policies>
        <DefaultRolloverStrategy max="8"/>
    </RollingFile>

但是 web:contextPath 没有得到解决。我的网络应用程序中有 log4j-web-2.0.2.jar。我在WebLookup类中添加了一些消息,问题是LoggerContext的外部上下文为null。

所以我试图查看 LoggerContext 的创建位置。调用 LoggerContext 构造函数时的堆栈跟踪是

at org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:114)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:113)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:80)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:82)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:37)
    at org.apache.logging.log4j.LogManager.getContext(LogManager.java:269)
    at org.apache.logging.log4j.jcl.LogFactoryImpl$PrivateManager.getContext(LogFactoryImpl.java:108)
    at org.apache.logging.log4j.jcl.LogFactoryImpl.getLoggersMap(LogFactoryImpl.java:52)
    at org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(LogFactoryImpl.java:43)
    at org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(LogFactoryImpl.java:75)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685)
    at org.apache.myfaces.webapp.AbstractMyFacesListener.<clinit>(AbstractMyFacesListener.java:34)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at java.lang.Class.newInstance(Class.java:433)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:151)
    at org.apache.catalina.core.ApplicationContext.addListener(ApplicationContext.java:1231)
    at org.apache.catalina.core.ApplicationContextFacade.addListener(ApplicationContextFacade.java:647)
    at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:110)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5164)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:581)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1686)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745

但是 ClassLoaderContextSelector 总是为外部上下文传递 null。所以看起来我好像错过了什么。

谁能建议我做错了什么或遗漏了什么?我必须指定不同的 ContextSelector 吗?

【问题讨论】:

    标签: java tomcat log4j2


    【解决方案1】:

    您可能在 log4j 中发现了一个错误。我怀疑是 Commons Logging 和 WebLookup 的组合不起作用。您能否验证是否是这种情况(如果您的应用程序使用 log4j 2 API 而不是 Commons Logging,请检查 WebLookup 是否有效)并在 log4j2 Jira issue tracker 中提交错误报告?

    【讨论】:

    • 谢谢。我无法更改真正的应用程序,因为它很大并且具有我无法控制的各种依赖项。但我会尝试创建一个简单的测试应用来调查您的建议。
    • 我的简单应用程序也无法正常工作。 webapp 中唯一的 jars 是 log4j-core、log4j-api 和 log4j-web。
    • 我还发现,在 Tomcat 7.0.55 下,我的主应用程序最初确实解析了 weblookup,但是直到它记录 org.apache.myfaces.webapp.AbstractFacesInitializer "ServletContext 'xyz' initialized" .之后,网络查找失败。但是在 Tomcat 8.0.12 下它永远不会工作。还在挖……
    • 在我的简单应用程序中,我发现 weblookup 仅在 web.xml 中有 元素时才有效。这听起来不对,因为据我在 XSD 中看到的显示名称是可选的。
    • 哇!一定要为此提交错误报告。
    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多