Log4j配置文件路径问题

[color=red]为什么我在做练习的时候。Log4j的配置文件一定要放在工程的根目录下(就是src目录下)。放在其它的地方就不行.[/color]

我在运用当中是用一个Servlet去负责载入Log4j的配置文件。然后就不用在其它地方每次都去加载配置文件。(如我的InitLog4j.java)我在web.xml中配置了这个Servlet。并且给了一个初使化参数--就是log4j配置文件的路径(我没有放在src目录下。但路径是没有错的。否则启动Tomcat5.5进行加载的时候就会报找不到指定文件的异常。)。我让这个Servlet是一启动就自动加载的。如下是我的配置文件的相关信息:


InitLog4j
net.yaye.control.InitLog4j

log4j
/WEB-INF/classes/net/yaye/conf/log4j.properties<!--我放在了一个conf包内,[color=red]路径没有错[/color];如果我把Log4j配置文件放在src根目录下,就不会出错-->

1


InitLog4j
/InitLog4j

但Tomcat启动完毕后。这个Servlet自动加载了。但却报错:
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester).
log4j:WARN Please initialize the log4j system properly.
然后我试着在应用程序中获取一个日志对象时,就会警告说没有初使化log4j:
log4j:WARN No appenders could be found for logger (net.yaye.model.LoggerHandler).
log4j:WARN Please initialize the log4j system properly.
[color=red](如果我把Log4j配置文件放在src根目录下,就不会出错)[/color]

[b]问题补充:[/b]
[color=red]我在代码中也指定log4j的配置文件的相对应的路径[/color]
[b]问题补充:[/b]
代码中是这样加载的:
String basepath = getServletContext().getRealPath("/");
String configfile = getInitParameter("log4j");
PropertyConfigurator.configure(basepath+configfile);
[b]问题补充:[/b]
如果我提供的路径不对的话,那Tomcat启动加载的时候就会报FileNotFoundException这个异常了,那我肯定会知道是路径不对拉!
负责加载的代码也执行了,我测试过的.但还是报这个警告错误:
log4j:WARN No appenders could be found for logger (net.yaye.model.LoggerHandler).
log4j:WARN Please initialize the log4j system properly.
[b]问题补充:[/b]
经过我自己的反复试验,我发现一个现象:
  只要你在工程的根目录(src目录)下有一个Log4j的配置文件(里面配置了Appender),即使你不手动去加载这个配置文件(意思就是说你什么前提工作都不用做,也照样可以取得日志记录器!),Log4j也会自动去加载这个配置文件的,但是前提是这个配置文件的名称一定要是log4j.properties这个名字!不知是不是对扩展名也有要求(我没有试过)?不过好象是区分大小的(因为我试过把这个名字的首字母大写了,就不行),反正我试过几个名字,就只有配置文件名为log4j.properties的才会通过。而且这个现象与框架无关,比如:struts、hibernate、spring。当然了,之后你自己再去手动加载也不会错的!
但记住,只要你的工程的根目录(src目录)下没有一个Log4j的配置文件(名叫log4j.properties),Tomcat启动加载应用程序时就会出现警告:
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester).
log4j:WARN Please initialize the log4j system properly.
但这个警告对实际上你已有过对log4j的配置文件进行加载的时候根本就是骗人的,因为之后你去获得一个一个日志记录器的时候,就不会出现警告说没有找到Appenders的话,因为你已经加载了嘛,所以这是个幻觉!!

我的理解就到这里,不知还有哪位高手能有更高深的见解。或者指出我的理解错误。
小生在这里抛砖引玉了!
[b]问题补充:[/b]
我说的都是启动Tomcat时出现的信息!!

6个回答

1.先配置一个启动servlet

[code="java"]

Log4jInit

com.chinarainbow.stk.init.Log4jInit


log4j-init-file
config/logfile.properties

1

[/code]

  1. Log4jInit.java

[code="java"]
package com.chinarainbow.stk.init;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.PropertyConfigurator;

/**

  • @author averyleo */

public class Log4jInit extends HttpServlet {

private static final long serialVersionUID = 1L;

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    String fileSep = System.getProperty("file.separator");
    String prefix = getServletContext().getRealPath(fileSep) + fileSep;
    String initfileName = getInitParameter("log4j-init-file");

    FileInputStream fis;
    Properties prop = new Properties();
    try {
        fis = new FileInputStream(prefix + initfileName);
        prop.load(fis);
        String logfileName = prop.getProperty("log4j.appender.A1.file");
        prop.put("log4j.appender.A1.file", prefix + logfileName);
        if (initfileName != null) {
            PropertyConfigurator.configure(prop);
        }
        fis.close();
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e) {
        System.out.println(e);
    }
}

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
}

}

[/code]

3.说明:config目录与WEB-INFO目录平级

4.配置文件内容:

[code="java"]
log4j.rootLogger=DEBUG,A0
log4j.logger.mo=DEBUG,A2
log4j.logger.mt=DEBUG,A3
log4j.logger.user=DEBUG,A1
log4j.logger.manager=DEBUG,A1

log4j.appender.A0=org.apache.log4j.ConsoleAppender
log4j.appender.A0.layout=org.apache.log4j.PatternLayout
log4j.appender.A0.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] [%m] - [%l] %3x %n

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.file=log/log.txt
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] [%m] - [%l] %3x %n

log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=log/molog.txt
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] [%m] - [%l] %3x %n

log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A3.file=log/mtlog.txt
log4j.appender.A3.DatePattern='.'yyyy-MM-dd
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] [%m] - [%l] %3x %n

[/code]

放在src目录下就不会出错,是因为你把log4j的配置文件跟代码一起打成jar包了,而jar包被添加到classpath下了,所以log4j就能找到,自然不会报错了。

你可以在代码中指定log4j的配置文件的路径。如下:
[quote]DOMConfigurator.configure("e:/log4j.xml");[/quote]

那你没放到src目录下是报的什么错误啊?要是报没有找到appender的话,那肯定还是路径有问题,看看你加载log4j配置文件的那个代码是否执行了,执行了的话,看看路径对不?

因为log4j的配置文件是log4去加载的,不是tomcat去加载的。所以即使你根本就没有log4j的配置文件,也不会抛找不到文件这个异常的。你可以写一个小程序试试。看看没有配置文件的时候,还有路径错误的时候,抛的是哪个异常。肯定是这个:
[quote]log4j:WARN No appenders could be found for logger (net.yaye.model.LoggerHandler).
log4j:WARN Please initialize the log4j system properly. [/quote]
这个问题,其实你debug一下就知道了。

WEB-INF/classes/net/yaye/conf/log4j.properties

把WEB-INF前面的/去掉。

你是不是在加载log4j配置文件之前,就开始打日志了。那样也会出现[quote]log4j:WARN No appenders could be found for logger (net.yaye.model.LoggerHandler).
log4j:WARN Please initialize the log4j system properly. [/quote]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐