我是log4j的新手,我似乎无法弄清楚这一点。如果我将log4j.configuration设置为某个不存在的垃圾文件,则以下程序可以正常工作。但如果我不这样做,那就是沉默(除了打印属性):
package com.example.test;
import org.apache.log4j.*;
public class Log4jExample2 {
final static Logger logger = Logger.getLogger("test.Log4jExample2");
static void kvshow(String[] karray)
{
for (String k : karray)
{
String v = System.getProperty(k);
System.out.println(k+"="+v);
}
}
public static void main(String[] args) {
kvshow(new String[] {"log4j.configuration", "log4j.properties"});
BasicConfigurator.configure();
logger.debug("Hello world.");
}
}
这是一个运行时会话:
>java -cp test-20090219.jar com.example.test.Log4jExample2
log4j.configuration=null
log4j.properties=null
>java -cp test-20090219.jar -Dlog4j.configuration=blah.cfg com.example.test.Log4jExample2
log4j.configuration=blah.cfg
log4j.properties=null
0 [main] DEBUG test.Log4jExample2 - Hello world.
我很难过。 (同样,没有名为blah.cfg的文件,这是我可以使用的最简单方法)log4j从哪里获取指令?
答案 0 :(得分:1)
嗯,我有一个领先......我正在查看log4j手册并随机尝试了这个:
>java -Dlog4j.debug=true com.example.test.Log4jExample2
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@11b86e7.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$ExtClassLoader@35ce36 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@11b86e7.
log4j: Using URL [jar:file:/C:/appl/Java/jre6u10/lib/ext/bsf.jar!/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/C:/appl/Java/jre6u10/lib/ext/bsf.jar!/log4j.properties
log4j: Parsing for [root] with value=[FATAL, CONSOLE].
log4j: Level token is [FATAL].
log4j: Category root set to FATAL
log4j: Parsing appender named "CONSOLE".
log4j: Parsing layout options for "CONSOLE".
log4j: End of parsing for "CONSOLE".
log4j: Parsed "CONSOLE" options.
log4j: Finished configuring.
log4j.configuration=null
log4j.properties=null
看起来bean脚本框架覆盖了我。
我怎么能阻止这个?我想要的是,如果未使用属性文件显式调用JRE,那么我希望它使用我的.jar文件中包含的设置。我尝试将自己的log4j.properties文件放在我的.jar文件的根目录中,但这似乎不起作用。
编辑:啊哈!我想我明白了:我必须在第一次使用Logger.getLogger()之前做一个System.setProperty,如:static
{
System.setProperty("log4j.configuration",
"jar:file:my_jar_file_name_here.jar!/log4j.properties");
}
答案 1 :(得分:0)
BasicConfigurator设置Log4J的默认值。因此,使用BasicConfigurator时,配置文件中没有读取。要从属性文件进行配置,请使用PropertiesConfigurator
答案 2 :(得分:0)
如果您只是想抑制“找不到记录器的appender”错误,可以在 src 文件夹中创建一个新文件,将其命名为 log4j.properties 并填写
#Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=WARN, A1
#A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
然后保存。
请注意,这只会抑制上述错误。