每个上下文的Log4J

时间:2016-04-07 16:20:26

标签: java xml log4j2

目前我在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}”的文件夹,其中会写入一些日志。

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

2 个答案:

答案 0 :(得分:2)

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

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

  

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

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

实施例

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

答案 1 :(得分:1)

我通常只为每个使用

的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>

但是,我自己没试过。