请问下log4j.properties加载机制是怎样的

解决方案 »

  1.   

    不知道,我想知道,为什么我的log4j.properties都写好了,log也能正常输出,什么都对,只是文件不能够达到一定size之后更新输出新文件,就一直在第一个log文件上不断增加。高手回答lz问题的时候顺便帮我也回答一下吧
      

  2.   

    log4j.properties加载机制??其实log4j.properties只是log4j的配置文件。程序启动时,log4j组件去读log4j.properties,和读取普通配置文件没多大区别。获取用户配置的一些log4j的属性值,调用想应该的方法为log4j属性设置。至于l楼说的日志增长的问题,你的配置文件配置了文件的上限大小没。如果配置正确log4j会根据你配置的文件大小去检测日志文件如果超过你配置的大小就会重命名此日志文件,然后在新日志文件输出日志
      

  3.   

    把log4j.properties当作一个struts.xml或者一个hibernate-cfg.xml就可以了,正如楼上说的。但不同的是,log4j不像struts和hibernate,它不是一个独立的组件,没法自己完成初始化,一般都是什么组件需要它 就去初始化。比如,hibernate默认的日志组件就是log4j,在hibernate初始化的时候它会去初始化log4j。如果你没配置log4j.properties,hibernate会抛出异常,但还是可以正常初始化。
      

  4.   

    放在src下的话就不用配置 否则得去web.xml里面配置一个Listener参考:
    log4j.rootLogger=INFO,stdout,A1
    #控制台打印
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #输出的信息
    #如果使用pattern布局就要指定的打印,通常指把电脑或其他电子设备中的文字或图片等可见数据,通过打印机等输出在纸张等记录物上。 更多..打印 信息的具体格式ConversionPattern,打印参数如下:
    #  %m 输出代码中指定的消息
    #  %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
    #  %r 输出自应用启动到输出该log信息耗费的毫秒数 
    #  %c 输出所属的类目,通常就是所在类的全名 
    #  %t 输出产生该日志事件的线程名 
    #  %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” 
    #  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 
    #  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
    log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n#日志文件 每日
    log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.A1.File=F:/mylog.txt
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    #%时间  [%线程] %log级别 %完整类名 - %消息 %换行
    log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 
      

  5.   

    楼主,你太懒了,这种问题是看源代码就能明白的。
    首先是:
    org.apache.log4j.LogManager类有一个静态块,首先是找log4j.xml,找不到的情况下才找log4j.properties // if the user has not specified the log4j.configuration
    // property, we search first for the file "log4j.xml" and then
    // "log4j.properties"
    if (configurationOptionStr == null) {
    url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
    if (url == null) {
    url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
    }
    } else {
    try {
    url = new URL(configurationOptionStr);
    } catch (MalformedURLException ex) {
    // so, resource is not a URL:
    // attempt to get the resource from the class path
    url = Loader.getResource(configurationOptionStr);
    }
    }
    2,然后是怎么找呢:如下代码,是委托给classloader(加载Loader类的classloader)去找了,
       // We could not find resource. Ler us now try with the
       // classloader that loaded this class.
       classLoader = Loader.class.getClassLoader(); 
       if(classLoader != null) {
         LogLog.debug("Trying to find ["+resource+"] using "+classLoader
              +" class loader.");
         url = classLoader.getResource(resource);
         if(url != null) {
           return url;
         }
       }3,classloader的getResource(...)又是怎么找呢:总是先从父classloader里去找,找不到才自己去找
        public URL getResource(String name) {
    URL url;
    if (parent != null) {
        url = parent.getResource(name);
    } else {
        url = getBootstrapResource(name);
    }
    if (url == null) {
        url = findResource(name);
    }
    return url;
        }总结:对于不同的应用服务器(或者web服务器)来说,classloader的层次不尽相同。这里以最简单的tomcat来说,如果你的应用是部署到tomcat下的,使用log4j配置文件的顺序就是$TOMCAT_HOME/lib/log4j.xml或者log4j.properties==>你自己web应用/WEB-INF/classes(或者lib)/log4j.xml或者log4j.properties.
    对于WEB-INF下是classes优先还是lib优先 你可以自己测试一下。以上是个人意见,希望你结合自己的测试结果看看。