gpt4 book ai didi

java - 如何在 log4j 文件名中插入当前 webapp 的文件夹名称

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:52 25 4
gpt4 key购买 nike

我正在编写一个要在 Tomcat 中部署的 Java Web 应用程序,并且我正在使用 log4j 进行日志记录。我喜欢在生成的日志文件的名称中自动插入 Web 应用程序的文件夹名称。

目前 log4j.properties 中的文件名设置如下所示:

log4j.appender.R.File=${catalina.home}/logs/mywebapp.log

我需要这样的东西:

log4j.appender.R.File=${catalina.home}/logs/${current.webapp.folder}.log

是否需要在属性文件中为此指定某种环境变量,或者我必须从代​​码中实例化记录器?

最佳答案

您可以使用上下文监听器来设置系统属性,然后在您的 log4j 配置中使用该属性。

第一步:设置系统属性

您可以先将系统属性(例如,contextPath)设置为应用程序的 Tomcat 上下文路径的值。您可以在上下文监听器中执行此操作。

package my.package.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListener implements ServletContextListener {

@Override
public void contextDestroyed(ServletContextEvent arg0) {
}

@Override
public void contextInitialized(ServletContextEvent event) {
defineContextPath(event);
}

private void defineContextPath(ServletContextEvent event) {
ServletContext context = event.getServletContext();
String contextPath = context.getContextPath();

if (contextPath != null) {
String pattern = ".*/(.*)";
String contex = contextPath.replaceAll(pattern, "$1");
System.setProperty("contextPath", contex);
System.out.println("contextPath: " + contex);
} else {
System.out.println("contextPath not found");
}
}
}

在您的 web.xml 中声明监听器:

<!-- Be sure to keep my.package.ContextListener as the first listener 
if you have more listeners as below -->
<listener>
<listener-class>my.package.ContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

第 2 步:使用系统属性设置您的 log4j 文件名

然后在您的 log4j 配置文件中,您可以使用系统属性 contextPath 来设置您的 log4j 文件名。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %5p %c{1}:%L - %m%n" />
</Console>
<RollingFile name="RollingFile" fileName="${catalina.base}/logs/${tomcat.hostname}/${contextPath}.log"
filePattern="${catalina.base}/logs/${tomcat.hostname}/$${date:yyyy-MM}/${contextPath}-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="500 MB" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.apache.log4j.xml" level="info" />
<Root level="info">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>

引用

关于java - 如何在 log4j 文件名中插入当前 webapp 的文件夹名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com