[英]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还支持查找存储为属性的值或配置为初始化参数。 下表列出了可以检索的各种键:
例
<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.