当前位置: 代码迷 >> J2EE >> 请教上log4j.properties加载机制是怎样的
  详细解决方案

请教上log4j.properties加载机制是怎样的

热度:353   发布时间:2016-04-21 23:39:33.0
请问下log4j.properties加载机制是怎样的
请问下log4j.properties加载机制是怎样的

------解决方案--------------------
放在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 

------解决方案--------------------
楼主,你太懒了,这种问题是看源代码就能明白的。
首先是:
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) {
  相关解决方案