zoukankan      html  css  js  c++  java
  • log4j日志输出到web项目指定文件夹

    感谢 eric2500 的这篇文章:http://www.cxyclub.cn/n/27860/

    摘要:尝试将log4j的文件日志输出到web工程制定目录,遇到了很多问题,最终在eric2500的指导下搞定,下面是记录。 其原理在于log4j的配置文件支持服务器的vm的环境变量,如${oss.log4j.path},在log4j加载配置文件之前,先用 System.setProperty("","")设置好日志文件路径,这一操作通过一个初始的servlet来实现。

    步骤:

    1.配置log4j.properties

    注:1.已注释掉了以控制台形式输出日志;2.log4j的layout.ConversionPattern属性对于以HTML形式输出无用(HTML有自己的格式),所以没写。

    log4j.rootCategory=debug,stdout,ROLLFILE,R
    
    # output as console. Now comment it out because I don't want to use it.
    #log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    #log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p (%F:%L) -%m%n
    
    # output as file
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p (%c:%L) -%m%n
    log4j.appender.R.File=${log4j.root.path}logs/log.log
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=1
    
    # output as HTML
    # ConversionPattern to no effect as output HTML 
    log4j.appender.ROLLFILE = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.ROLLFILE.layout = org.apache.log4j.HTMLLayout
    log4j.appender.ROLLFILE.File = ${log4j.root.path}logs/log.html
    log4j.appender.ROLLFILE.Append = true
    log4j.appender.ROLLFILE.Threshold = DEBUG

    2.配置web.xml

    注:<init-param>的<param-value>属性为指定的log4j的存储地址,这里没有设置,在处理log4j的输出地址的systemServlet中指定。

         <!-- 设置log4j的配置路径(类目录下) -->
         <context-param>
              <param-name>log4jConfigLocation</param-name>
              <param-value>classpath:log4j.properties</param-value>
         </context-param>
        <!-- 加载log4j配置文件 -->
        <listener>
          <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        </listener>
        
        <!-- 在自定义的Servlet中设置log4j的存储地址。不需要配置servlet-mapping,load-on-startup设置为0,会在web容器启动时候就装入该servlet。 -->
        <servlet>
            <servlet-name>systemServlet</servlet-name>
            <servlet-class>com.wql.util.SystemServlet</servlet-class>
            <init-param>
                <param-name>log4j.root.path</param-name>
                <param-value></param-value>
            </init-param>
            <load-on-startup>0</load-on-startup>
        </servlet>

    3.编写处理log4j的存储地址的systemServlet

    注:log4j的存储地址在此项目发布的物理路径下:E:Spring2.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsOA2_02logs

    package com.wql.util;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    
    import org.apache.log4j.Logger;
    
    public class SystemServlet  extends HttpServlet{
        private static final Logger logger = Logger.getLogger(SystemServlet.class);
        
        private static final long serialVersionUID = -833322220864312415L;
    
        @Override
        public void init() throws ServletException {
            //获取根路径(web的发布地址)
            String rootPath = this.getServletContext().getRealPath("/");  
            //以info等级打印根路径
            logger.info(rootPath);
            
            //从web.xml中获取param-name为log4j.root.path的值--即指定的log4j的输出地址
            String log4jPath = this.getServletConfig().getInitParameter("log4j.root.path");  
            //若没有指定log4j.root.path初始参数,则使用WEB的工程目录--即web的发布地址  
            log4jPath = (log4jPath==null||"".equals(log4jPath))?rootPath:log4jPath;  
            //将log4j的存储地址设置为系统属性
            System.setProperty("log4j.root.path", log4jPath);
            //初始化
            super.init();  
        }
    }

    大功告成!启动服务器后,就可以在:E:Spring2.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsOA2_02logs中查看日志。

    备注:

    1.按照此方式配置log4j在启动服务器时会出现logslog.log拒绝io流访问异常信息,如下所示:(不要管它,不会有影响。)

    2.若想再项目中直接看到日志文件,则需对eclipse的Servers进行设置,具体设置如下图所示:

    弹出Servers视图后,

    这样,启动服务器,刷新项目在WebContent中查看log文件夹下的log.log,如果没有,则:


    附1:log4j日志文件输出到指定的磁盘: http://blog.csdn.net/mxlxiao7/article/details/7340480 --配置有错,请参考附4.

    附2:lo4j的详情介绍:http://www.blogjava.net/hwpok/archive/2008/01/16/175711.html

    附3:log4j路径配置的其他形式介绍:http://zhidao.baidu.com/link?url=Fjt8F2-hATIAzY3lvj8aMMaKxG7ZeAmFpB2MIyKFXLq2URQmmDHCBhEvPIsqSJhjMMb72WcE2HgBoM-wNEy-WqLXRsMnsQFbKy08SJ-zrwO

    附4:lo4j输出至指定磁盘路径:

    # Output to console file in address of Disk
    log4j.appender.R3=org.apache.log4j.RollingFileAppender
    log4j.appender.R3.layout=org.apache.log4j.PatternLayout
    log4j.appender.R3.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p (%c:%L) -%m%n
    log4j.appender.R3.File=d:/logs/log.log 
    log4j.appender.R3.MaxFileSize=100KB
    log4j.appender.R3.MaxBackupIndex=1
  • 相关阅读:
    ASP.NET MVC one view bind many model
    说一说MVC的CustomHandlerErrorAttribute(五)
    今天俺要说一说工厂方法模式(Factory)
    今天俺要说一说简单工厂模式(Simple Factory)
    我对SQL性能优化的看法,对我的文章有提议的欢迎评论!
    Linux 服务管理两种方式service和systemctl
    Linux grep命令
    Linux 守护进程
    linux Ctrl+z和Ctrl+c的区别
    linux系统卡解决方案
  • 原文地址:https://www.cnblogs.com/wql025/p/4841761.html
Copyright © 2011-2022 走看看