目前我在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}”的文件夹,其中会写入一些日志。
实现我想要的登录的正确方法是什么?
答案 0 :(得分:2)
尝试使用Web上下文查找而不是系统查找。
来源: https://logging.apache.org/log4j/2.0/manual/lookups.html#WebLookup
WebLookup允许应用程序检索变量 与ServletContext相关联。除了能够 检索ServletContext中的各个字段,WebLookup支持 查找存储为属性的值或配置为初始化的值 参数。下表列出了可以使用的各种密钥 检索到:
实施例
<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>
但是,我自己没试过。