Nag*_*gyI 9 java tomcat log4j web-applications
我正在编写一个Java Web应用程序来部署在Tomcat中,我正在使用log4j进行日志记录.我想在生成的日志文件名中自动插入Web应用程序的文件夹名称.
目前,文件名设置在log4j.properties中如下所示:
log4j.appender.R.File=${catalina.home}/logs/mywebapp.log
Run Code Online (Sandbox Code Playgroud)
我需要这样的东西:
log4j.appender.R.File=${catalina.home}/logs/${current.webapp.folder}.log
Run Code Online (Sandbox Code Playgroud)
是否有某种环境变量要在属性文件中指定,或者我必须从代码中实例化记录器?
您可以使用上下文侦听器设置系统属性来实现此目的,然后在 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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 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>
Run Code Online (Sandbox Code Playgroud)
然后在 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>
Run Code Online (Sandbox Code Playgroud)
这不是一个仅配置文件的解决方案,所以我暂时保留这个问题。
我已将其重命名log4j.properties为myapp-log4j.properties并修改了日志文件名属性,如下所示:
log4j.appender.R.File=${catalina.base}/logs/#{context.name}.log
Run Code Online (Sandbox Code Playgroud)
因为我有一个在启动时加载的 servlet,所以我在 init() 函数中初始化 log4j。
String contextPath = getServletContext().getContextPath();
// First reconfigure log4j
String contextName = contextPath.substring(1);
if (!configureLog4J(contextName)) {
return;
}
Run Code Online (Sandbox Code Playgroud)
为此的功能:
public static final String LOG4JAPPENDERRFILE = "log4j.appender.R.File";
private boolean configureLog4J(String contextName) {
Properties props = new Properties();
try {
InputStream configStream = getClass().getResourceAsStream("/myapp-log4j.properties");
props.load(configStream);
configStream.close();
} catch(IOException e) {
System.out.println("FATAL! Cannot load log4j configuration file from classpath.");
e.printStackTrace(System.out);
return false;
}
String logFile = props.getProperty(LOG4JAPPENDERRFILE);
logFile=logFile.replace("#{context.name}", contextName);
props.setProperty(LOG4JAPPENDERRFILE, logFile);
LogManager.resetConfiguration();
PropertyConfigurator.configure(props);
return true;
}
Run Code Online (Sandbox Code Playgroud)
看起来工作正常,但我真的不喜欢必须修改代码中的属性文件。
| 归档时间: |
|
| 查看次数: |
4454 次 |
| 最近记录: |