log4j中配置日志文件几种方式

来源:互联网 发布:new3dsll怎么关掉网络 编辑:程序博客网 时间:2024/05/19 05:34

http://blog.csdn.net/fclwd/article/details/8645410

感谢原作者

1、绝对路径方式

    使用绝对路径那就不用说什么了,直接输出到配置路径

    log4j.appender.infofile.File = D:/logs/info.log

2、使用System设置好日志根路径

log4j.appender.logfile.File=${WORKDIR}/logs/info.log

其中“${WORKDIR}/”是个变量,会被System Property中的“WORKDIR”的值代替。这样,我们就可以在log4j加载配置文件之前,先用System.setProperty设置好根路径。

3、可以使用服务器环境变量 log4j的配置文件支持服务器的vm的环境变量,格式类似${catalina.home}  ${catalina.base}

log4j.appender.logfile.File=${catalina.base}logs/info.log

假如使用Tomcat中间件容器,那么日志存放在Tomcat的日志下

4、通过servlet初始化init()方法中加载file属性实现相对路径

:做一个servlet,在系统加载的时候,就把properties的文件读到一个properties文件中.那个file的属性值(我使用的是相对目录)改掉(前面加上系统的根目录),让后把这个properties对象设置到propertyConfig中去,这样就初始化了log的设置.在后面的使用中就用不着再配置了 一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件 (1).在项目启动时,装入初始化类:

public class Log4jInit extends HttpServlet {
         static Logger logger = Logger.getLogger(Log4jInit.class);
         public Log4jInit() {
         }

         public void init(ServletConfig config) throws ServletException {
             String prefix = config.getServletContext().getRealPath("/");
             String file = config.getInitParameter("log4j");
             String filePath = prefix + file;
             Properties props = new Properties();
             try {
                 FileInputStream istream = new FileInputStream(filePath);
                 props.load(istream);
                 istream.close();
                 //toPrint(props.getProperty("log4j.appender.file.File"));
                 String logFile = prefix + props.getProperty("log4j.appender.file.File");//设置路径
                 props.setProperty("log4j.appender.file.File",logFile);
                 PropertyConfigurator.configure(props);//装入log4j配置信息
             } catch (IOException e) {
                 toPrint("Could not read configuration file [" + filePath + "].");
                 toPrint("Ignoring configuration file [" + filePath + "].");
                 return;
             }
         }

         public static void toPrint(String content) {
             System.out.println(content);
         }
}

 

5、使用Spring提供的日志配置方法

web.xml添加如下代码:

 

Xml代码

<context-param>   

  <param-name>webAppRootKey</param-name>  

  <param-value>project</param-value>  

</context-param>  

<context-param>   

    <param-name>log4jConfigLocation</param-name>   

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

</context-param>  

<listener>   

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

</listener>  

[xml]
[xml] view plaincopy
  1. <span style="font-size:18px;">  <context-param>  
  2.         <param-name>webAppRootKey</param-name>  
  3.         <param-value>project</param-value>  
  4.     </context-param>  
  5.     <context-param>  
  6.         <param-name>log4jConfigLocation</param-name>  
  7.         <param-value>WEB-INF/classes/log4j.properties</param-value>  
  8.     </context-param>  
  9.     <listener>  
  10.         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  11.     </listener></span>  

 

 

 

webAppRootKey: 配置项目的别名,上面配置别名为project。若你部署的项目不在tomcat中的话这个可以忽略,因为tomcat没为每个应用配置不同的webappRoot属性,所以如果出现两个或以上相同的应用属性名的话就会报错了。

 

然后修改log4j.properties的配置,把日志文件输出的路径配置修改为:

log4j.appender.loginfo.File=${project}WEB-INF/logs/Prinfo.log 

loginfo是我的appender命名。 ${project}是使用上述web.xml中的应用别名从而获取应用的绝对路径。

 

注:若不需要配置应用别名的话,即没配置webAppRootKey。可以直接这么写:

log4j.appender.loginfo.File=${webapp.root}WEB-INF/logs/info.log

 

webapp.root为默认属性。若有配置webAppRootKey的话就被覆盖。