我正在一个简单的测试应用程序中尝试log4j。我在eclipse中创建了一个新的Java项目,并将log4j JAR(v1.2.16)添加到我的构建路径中。然后我创建一个打印Hello World的简单类。然后我使用log4j Logger
类来记录信息消息。当我运行应用程序时,我看到日志消息,使用我认为是默认的appender和布局。大。我遇到的麻烦是添加我自己的配置。这就是我所做的:
创建一个带有自定义appender和日志级别的log4j.properties文件,并将其放入src文件夹(在编译时将其复制到bin文件夹)。运行应用程序 - 无需更改。
我尝试添加PropertyConfigurator.configure("log4j.properties")
。运行应用程序 - 没有变化。没有错误,但没有变化。
如何让log4j加载我的配置文件?
答案 0 :(得分:37)
对于那些没有RTFM的人,请查看标题Default Initialization Procedure下的内容,您可以在其中找到以下内容:
确切的默认初始化算法定义如下:
- 将
log4j.defaultInitOverride
系统属性设置为除“false
”之外的任何其他值将导致log4j跳过默认值 初始化程序(此程序)。- 将资源字符串变量设置为
log4j.configuration
系统属性的值。指定的首选方式 默认初始化文件是通过log4j.configuration
系统属性。如果是系统属性log4j.configuration 未定义,然后将字符串变量资源设置为其默认值 价值“log4j.properties
”。- 尝试将资源变量转换为URL。
- 如果资源变量无法转换为URL,例如由于MalformedURLException,则从中搜索资源 classpath通过调用 org.apache.log4j.helpers.Loader.getResource(resource,Logger.class) 返回一个URL。 请注意字符串“
log4j.properties
” 构成格式错误的网址。请参阅 Loader.getResource(java.lang.String) 搜索位置列表。- 如果找不到URL,则中止默认初始化。否则,请从URL配置log4j。该 PropertyConfigurator 将用于解析URL以配置log4j,除非URL结束 使用“
醇>.xml
”扩展名,在这种情况下 DOMConfigurator 将会被使用。您可以选择指定自定义配置程序。该log4j.configuratorClass
系统属性的值被视为 自定义配置程序的完全限定类名。习俗 您指定的配置程序必须实现Configurator
接口。
答案 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,我都没有做过。结合使用和清理类文件使其工作。