log4j在哪里/如何查找log4j.properties文件?

时间:2010-04-26 20:56:36

标签: java logging log4j

我正在一个简单的测试应用程序中尝试log4j。我在eclipse中创建了一个新的Java项目,并将log4j JAR(v1.2.16)添加到我的构建路径中。然后我创建一个打印Hello World的简单类。然后我使用log4j Logger类来记录信息消息。当我运行应用程序时,我看到日志消息,使用我认为是默认的appender和布局。大。我遇到的麻烦是添加我自己的配置。这就是我所做的:

创建一个带有自定义appender和日志级别的log4j.properties文件,并将其放入src文件夹(在编译时将其复制到bin文件夹)。运行应用程序 - 无需更改。

我尝试添加PropertyConfigurator.configure("log4j.properties")。运行应用程序 - 没有变化。没有错误,但没有变化。

如何让log4j加载我的配置文件?

7 个答案:

答案 0 :(得分:37)

对于那些没有RTFM的人,请查看标题Default Initialization Procedure下的内容,您可以在其中找到以下内容:

  

确切的默认初始化算法定义如下:

     
      
  1. log4j.defaultInitOverride系统属性设置为除“false”之外的任何其他值将导致log4j跳过默认值   初始化程序(此程序)。
  2.   
  3. 将资源字符串变量设置为log4j.configuration系统属性的值。指定的首选方式   默认初始化文件是通过log4j.configuration   系统属性。如果是系统属性log4j.configuration   未定义,然后将字符串变量资源设置为其默认值   价值log4j.properties”。
  4.   
  5. 尝试将资源变量转换为URL。
  6.   
  7. 如果资源变量无法转换为URL,例如由于MalformedURLException,则从中搜索资源   classpath通过调用   org.apache.log4j.helpers.Loader.getResource(resource,Logger.class)   返回一个URL。 请注意字符串“log4j.properties”   构成格式错误的网址。请参阅   Loader.getResource(java.lang.String)   搜索位置列表。
  8.   
  9. 如果找不到URL,则中止默认初始化。否则,请从URL配置log4j。该   PropertyConfigurator   将用于解析URL以配置log4j,除非URL结束   使用“.xml”扩展名,在这种情况下   DOMConfigurator   将会被使用。您可以选择指定自定义配置程序。该   log4j.configuratorClass系统属性的值被视为   自定义配置程序的完全限定类名。习俗   您指定的配置程序必须实现Configurator接口。
  10.   

答案 1 :(得分:8)

哎呀。我发现问题是eclipse导入了错误的Logger类。它导入了java.util.logging.Logger,当然它有自己的配置,与log4j不同。哦,希望其他人这样做并通过阅读这个问题解决它。

答案 2 :(得分:7)

您可以通过设置log4j.debug系统属性来启用log4j内部调试。除此之外,这将导致log4j显示它自己的配置方式。

您可以尝试使用log4j.configuration系统属性显式设置配置文件的URL。

另请参阅:this question

答案 3 :(得分:5)

问题可能出在classpath,如果已定义classpath

它没有加载的原因(在我的情况下):我的一个罐子里有一个有冲突的log4j.properties文件,而且我的classpath中的文件超载了。

简而言之,如果您的log4j.properties文件未加载,则可能在其他地方覆盖其他文件。

以为我也会把它扔掉,万一其他人遇到这个。我花了最后5个小时试图找出我的默认log4j.properties无法加载的原因。

答案 4 :(得分:2)

log4j.properties应该在你的类路径中。复制到“bin文件夹”的“src文件夹”(我假设你在这里讲的是Eclipse设置),通常属于你的类路径,所以应该找到它(你把它放在“src”的顶部吗? “文件夹,对吧?”

答案 5 :(得分:1)

我知道这已经有几个月了,但我觉得有必要指出scr文件夹没有“复制”到bin文件夹,也不是你运行时类路径的一部分....(build path不是运行时类路径!)。 Eclipse将src文件夹中的源文件编译为bin(或任何你喜欢的)文件夹。它是bin文件夹,它是运行时类路径的一部分。

只是想指出这一点,因为这些线程经常被非常初级的程序员读取,而且我总是感到沮丧的是,他们中的大多数人都没有掌握Java类路径的技巧,因此可以避免犯错误。

答案 6 :(得分:0)

只需将它扔给所有努力获取log4j.properties文件加载的人。

我通过添加以下行来修复我的问题:

iris = datasets.load_iris()
X=iris.data[:,[2,3]]
y=iris.target

X_train, X_test, y_train, y_test= train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
sc= StandardScaler()
sc.fit(X_train)
X_train_std=sc.transform(X_train)
X_test_std= sc.transform(X_test)

ppn= Perceptron( max_iter=40,eta0= 0.1, random_state=1)
ppn.fit(X_train_std, y_train)

def plot_decision_regions(X, y, classifier,test_idx=None, resolution = 0.02):
    markers = ('s', 'x', 'o', '^','v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    x1_min, x1_max = X[:, 0].min() -1, X[:,0].max() + 1
    x2_min, x2_max = X[:, 1].min() -1, X[:,1].max() + 1
    xx1, xx2= np.meshgrid (np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha= 0.3, cmap = cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())


    for idx, cl in enumerate (np.unique(y)):
        plt.scatter (x=X[y == cl, 0], y= X[y == cl, 1], alpha=0.8, c=colors[idx], marker= markers [idx], label = cl, edgecolor = 'black')

    if test_idx:
        X_test, y_test= X[test_idx,:], y[test_idx]


        plt.scatter(X_test[:,0], X_test[:,1], c='', edgecolor= 'black', alpha= 0.9, linewidth=1, marker='o', s=100, label='test set' )


X_combined_std= np.vstack((X_train_std, X_test_std))
y_combined=np.hstack((y_train, y_test))
plot_decision_regions(X=X_combined_std, y=y_combined, classifier=ppn, test_idx=range(105,150))
plt.xlabel('sepal length [standardized]')
plt.ylabel('petal length [standardized]')
plt.legend(loc='upper left')
plt.show()

最后使用该JVM参数,可以告诉Log4j不要使用-Dlog4j.defaultInitOverride=TRUE 并创建自己的。

我和我斗争。从干净的JAR构建到整个REPO,我都没有做过。结合使用和清理类文件使其工作。