感谢支持
我们一直在努力

Log4j中配置日志文件相对路径[续集]

这篇文章是基于流传在网上较为完整的关于“log4j中配置日志文件相对路径”问题的解决方法。该篇博文几经转载,流传至今。这是此文的转载[ http://www.linuxidc.com/Linux/2014-09/106571.htm ],为了能够清楚本文所要解决的问题,建议阅读此文。

该文中最后提到关于log4j配置文件初始化时产生的一些异常和警告信息。在这个疑问下和我在实际生产情况下的一些理解,认为log4j的配置日志文件相对路径化是必须的,采用系统环境变量将依赖于系统不利于移植,使用绝对路径显然更不可取,故继续探讨log4j的配置文件相对路径问题。

在初始化Web应用中的所有Filter和Servlet之前通知ServletContextListener关于上下文初始化信息。那么可以尝试在contextInitialized()方法中来完成log4j配置中文件的路径设置和配置文件初始化。

1.创建的Log4jListenter:

public class Log4jListener implements ServletContextListener { 

    @Override

    public void contextInitialized(ServletContextEvent arg0) {

        ServletContext context = arg0.getServletContext();

        String prefix = context.getRealPath(“/”);

        String file = context.getInitParameter(“log4j”);

        String filePath = prefix + file;

        Properties props = new Properties();

        try {

            FileInputStream istream = new FileInputStream(filePath);

            props.load(istream);

            istream.close();

            String logFile = prefix

                    + props.getProperty(“log4j.appender.FILE.File”);

            // 设置路径

            props.setProperty(“log4j.appender.FILE.File”, logFile);

            // 装入log4j配置信息

            PropertyConfigurator.configure(props);

        } catch (IOException e) {

            System.out.println(“Could not read configuration file [” + filePath

                    + “].”);

            System.out.println(“Ignoring configuration file [” + filePath

                    + “].”);

        }

    }

 

    @Override

    public void contextDestroyed(ServletContextEvent arg0) {

 

    }

}

通过获取项目路径,log4j配置文件相对与项目路径二者组合获取到配置文件的绝对路径;读取配置信息;然后重置“log4j.appender.File.File”的值,该值即为日志输入的路径,这样就灵活多了。

这里的“log4j.appender.File.File”具体写法更加log4j.properties的实际配置内容而定。如下是使用的日志配置文件内容:

#日志

log4j.rootLogger=INFO, FILE

#FILE

log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender

log4j.appender.FILE.Threshold=INFO

log4j.appender.FILE.ImmediateFlush=true

log4j.appender.FILE.File=brs.log

log4j.appender.FILE.DatePattern=’.’yyyy-MM-dd

log4j.appender.FILE.layout=org.apache.log4j.PatternLayout

log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n

根据1中的代码可得出输出的日志文件路径是:工程目录/brs.log

2.在web.xml进行配置

<context-param>

        <param-name>log4j</param-name>

        <param-value>WEB-INF/classes/log4j.properties</param-value>

    </context-param>

   

    <listener>

        <listener-class>com.test.Log4jListener</listener-class>

    </listener>

上面配置了log4j配置文件相对应项目路径的路径和ServletContextListener实现类。当然这里的context-param是否需要设置可以根据Log4jListener类中据说使用情况而定。

3.启动web应用将不存在“log4j中配置日志文件相对路径”这篇文章最后提到的问题。

写到这里不由感叹一下,Spring的作者已经想到了,而且如果在Web应用中用到Spring的话则更加简便。日志配置文件中关于日志文件输出路径这样配置即可:

log4j.properties文件:

log4j.appender.FILE.File=${webapp.root}/WEB-INF/logs/brs.lo

web.xml文件:

<listener>

        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

 </listener

是的没错!Spring就是这样来监听日志配置的!

不过上面用到的“webapp.root”这个变量则是Web应用的根目录了。至于“webapp.root”的来龙去脉可以查看源代码:org.springframework.web.util.WebUtils类。

Log4j入门使用教程 http://www.linuxidc.com/Linux/2013-06/85223.htm

Hibernate配置Log4j显示SQL参数 http://www.linuxidc.com/Linux/2013-03/81870.htm

Log4j学习笔记(1)_Log4j 基础&配置项解析 http://www.linuxidc.com/Linux/2013-03/80586.htm

Log4j学习笔记(2)_Log4j配置示例&Spring集成Log4j http://www.linuxidc.com/Linux/2013-03/80587.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-09/106572.htm

赞(0) 打赏
转载请注明出处:服务器评测 » Log4j中配置日志文件相对路径[续集]
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏