Tomcat7多实例Web应用中Log4J局部作用域变量替换方案咨询
Tomcat 7多实例Web应用Log4J局部日志路径配置方案
不需要更换日志框架,利用Tomcat和Log4J本身的特性就能实现应用/主机级的局部变量替换,以下是几种可行方案:
方案一:Tomcat上下文参数+应用初始化监听
- 给每个实例配置独立上下文参数
针对每个Web应用实例,在其META-INF/context.xml(或Tomcat的conf/[主机名]/[应用实例名].xml配置文件)中添加局部参数:
<Context> <Parameter name="webapp_log_dir" value="/opt/tomcat/instances/instance1/logs" override="false"/> </Context>
每个实例设置不同的value路径即可。
- 启动时读取参数并更新Log4J配置
编写ServletContextListener,在应用初始化时读取上下文参数,动态修改Log4J的日志路径:
public class LogConfigListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { ServletContext context = event.getServletContext(); String logDir = context.getInitParameter("webapp_log_dir"); Logger rootLogger = Logger.getRootLogger(); FileAppender fileAppender = (FileAppender) rootLogger.getAppender("file"); if (fileAppender != null && logDir != null) { fileAppender.setFile(logDir + "/logfile.log"); fileAppender.activateOptions(); } } @Override public void contextDestroyed(ServletContextEvent event) {} }
最后在web.xml中注册该监听器:
<listener> <listener-class>com.yourpackage.LogConfigListener</listener-class> </listener>
方案二:预加载自定义属性到Log4J配置
保持log4j.properties中的占位符不变:
log4j.appender.file.File=${webapp_log_dir}/logfile.log
在应用启动时,先读取Tomcat上下文参数,再加载Log4J配置并替换变量:
public class LogConfigListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { ServletContext context = event.getServletContext(); String logDir = context.getInitParameter("webapp_log_dir"); Properties logProps = new Properties(); try { logProps.load(context.getResourceAsStream("/WEB-INF/log4j.properties")); logProps.setProperty("log4j.appender.file.File", logDir + "/logfile.log"); PropertyConfigurator.configure(logProps); } catch (IOException e) { e.printStackTrace(); } } @Override public void contextDestroyed(ServletContextEvent event) {} }
方案三:主机级环境变量配置
如果是按主机部署实例,可在Tomcat的conf/[主机名]/context.xml中设置主机级环境变量,每个主机对应不同日志路径,应用中通过System.getenv("WEBAPP_LOG_DIR")读取后配置Log4J,适合同一主机下实例共用路径规则的场景。
内容的提问来源于stack exchange,提问作者Janus Engstrøm
相关产品推荐
相关产品推荐

