HanYaye 2009-01-04 21:02
浏览 414
已采纳

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条回答 默认 最新

  • avery_leo 2009-01-06 14:39
    关注

    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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗