繁体   English   中英

每个上下文的Log4J

[英]Log4J for each context

目前我在WebApps上使用Log4J2,它运行在Tomcat上。 每个webapp都必须将其日志推送到单个文件夹,名称类似于webapp的上下文。

在webapp中,我实现了一个ServletContextListener,当Webapp Context准备就绪时会引起注意。 它设置系统属性的日志记录路径,如下所示:

public void contextInitialized(ServletContextEvent sce) {
    context = sce.getServletContext().getContextPath();
    if(context == null || context.isEmpty()){
        context = "ROOT";
    }
    System.setProperty("WebappContext", context);
    log.info("Context \"" + context + "\" erstellt");
}

然后我在log4j2.xml中使用这个属性:

<Properties>
    <Property name="log-path">/srv/tomcat/logs/${sys:WebappContext}</Property>
</Properties>
<Appenders>
    <RollingFile name="rollingLogFile" fileName="${log-path}/out.log"
                 filePattern="${log-path}/out-%d{MMM-dd--HH-mm}.log" >
     ...
    </RollingFile>

当我部署第一个webapp时,这很好用。 但是,只要我部署了两个或更多,所有来自所有上下文的日志都会转到最新的文件夹,因为系统属性对于所有实例都是全局的。 有时我甚至会得到一个名为“{sys:WebappContext}”的文件夹,其中会写入一些日志。

实现我想要的登录的正确方法是什么?

尝试使用Web上下文查找而不是系统查找。

资料来源: https//logging.apache.org/log4j/2.0/manual/lookups.html#WebLookup

WebLookup允许应用程序检索与ServletContext关联的变量。 除了能够在ServletContext中检索各种字段之外,WebLookup还支持查找存储为属性的值或配置为初始化参数。 下表列出了可以检索的各种键:

  • attr.name返回具有指定名称的ServletContext属性
  • contextPath Web应用程序的上下文路径
  • effectiveMajorVersion获取此ServletContext所代表的应用程序所基于的Servlet规范的主要版本。
  • effectiveMinorVersion获取此ServletContext所代表的应用程序所基于的Servlet规范的次要版本。
  • initParam.name返回具有指定名称的ServletContext初始化参数
  • majorVersion返回此servlet容器支持的Servlet API的主要版本。
  • minorVersion返回此servlet容器支持的Servlet API的次要版本。
  • rootDir返回使用值“/”调用getRealPath的结果。
  • serverInfo返回运行servlet的servlet容器的名称和版本。
  • servletContextName返回部署描述符的display-name元素中定义的Web应用程序的名称

<Appenders>
  <File name="ApplicationLog" fileName="${web:rootDir}/app.log"/>
</Appenders>

我通常只为每个Web应用程序使用单独的log4j2.xml

<properties>
    <property name="LOG_DIR">${sys:catalina.home}/logs/AppName</property>
</properties>

但是,如果你想要一个log4j2.xml,按照alan7678的建议你应该能够添加

<context-param>
    <param-name>applicationName</param-name>
    <param-value>AccountService</param-value>
</context-param>

到web.xml然后使用

<properties>
    <property name="LOG_DIR">${sys:catalina.home}/logs/${web:applicationName}</property>
</properties>

但是,我自己没试过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM