请问下log4j.properties加载机制是怎样的
解决方案 »
- bs架构,使用java开发的系统可以在浏览器关闭的情况下给出消息提示吗?
- myeclipse中JSP文件找不到图片
- 各位大侠救急呀 酒店接口的问题。
- 我发现我同事的java代码中所有class的方法都是static,他说这样调用就很方便(因为不用new一个对象了,直接class.方法调用),请问他这样
- 字符串如何转换成int?
- Spring配置问题
- [OpenJPA]数据已经保存到数据库,但find取不到数据,重启tomcat后,又可以取到
- 我的web程序最高同时在线2000人以上,用tomcat的做服务器的话如何设置呢?服务器的内存应该在多大比较合适?
- tomcat连接池的配置问题
- 怎样将一个从图片获得的字节数组用ejb存到数据库的blob字段中
- 马士兵老师JAVAEE struts2视频项目源代码
- 在spring 的官网上没找到jar包下载,只有spring tool suit请问怎么获得jar包
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) {
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优先 你可以自己测试一下。以上是个人意见,希望你结合自己的测试结果看看。