将 Log4j.properties 放入 Eclipse 项目的正确位置在哪里?

Posted

技术标签:

【中文标题】将 Log4j.properties 放入 Eclipse 项目的正确位置在哪里?【英文标题】:Where is the correct location to put Log4j.properties in an Eclipse project? 【发布时间】:2011-07-02 03:58:39 【问题描述】:

我应该在我的 Eclipse 项目中的哪个位置添加 log4j.properties 文件以便它按预期工作?

【问题讨论】:

你的问题太模糊了。通常它被添加到类路径中。右键单击项目,构建路径。 【参考方案1】:

您可以将它添加到您想要的任何位置,当您运行项目时,配置类路径并通过单击添加 log4j.properties 文件的位置: 运行->运行配置->[类路径选项卡]->单击用户条目->高级->选择添加文件夹->选择log4j.properties文件的位置

然后 -> 确定 -> 运行

它应该被加载

【讨论】:

如果我的项目是一个库会发生什么?我将 log4j.properties 放在源根目录中,然后我的图书馆用户使用 log4j 也会捕获这个 log4j.properties 可能会覆盖他们的,或者至少它会造成混乱 @jaime 我有同样的问题,我的项目使用了我的 2 个库,其中每个库和主项目在源根目录中都有 log4j.properties,现在当我运行主项目从其中一个库中获取错误的 log4j.properties。解决这个问题的最佳方法是什么? @JaimeHablutzel 通常你不应该在你的库中捆绑 log4j 属性。您的库的用户应该提供他们的日志记录配置,理想情况下我会说您应该让您的用户能够注入他们喜欢的日志记录策略,并且您针对接口编写日志记录。它不仅仅是 log4j 配置文件,它可能是整个记录器实现等。 我最终在我的库中添加了参考 log4j.properties /org/example/mylibrary/log4j.properties。这样它就不会被我的库用户自动捕获,但如果他们的 JVM 配置了-Dlog4j.configuration=...,或者至少可以将它们作为他们自己的log4j.properties 的参考,它仍然可以使用。【参考方案2】:

IMO 最安全的方法是指向运行/调试配置中的文件

-Dlog4j.configuration=file:mylogging.properties

!请注意:使用 eclipse 启动配置时,file: 协议的规范是强制性的。

通过这种方式,记录器不会捕获任何出现在类路径中的 logging.properties,也不会捕获 JDK 中的默认属性。

另外,考虑实际使用 log4j.xml,它具有更丰富的表达式语法并允许更多的东西(log4j.xml tahe 优先于 log4j.properties。

【讨论】:

更像 -Dlog4j.configuration="file:path/to/log4j.properties"【参考方案3】:

将 log4j.properties 文件添加到项目的运行时类路径中。 有些人将它添加到源代码树的根目录(以便将其复制到已编译类的根目录)。

编辑: 如果您的项目是 Maven 项目, 您可以将 log4j.properties 放在 src/main/resources 文件夹中(以及用于单元测试的 src/test/resources)。

如果您有多个环境(例如开发和生产), 想要为每个环境使用不同的日志记录, 并希望将相同的 jar(或 war,或 ear)文件部署到每个环境 (就像在一个构建中适用于所有环境一样) 然后将 log4j.properties 文件存储在 jar 文件之外,并将其放在每个环境的类路径中(可由环境配置)。 从历史上看,我会在类路径中的每个环境中包含一些已知目录,并在那里部署环境特定的东西。 例如, ~tomcat_user/localclasspath 其中 ~tomcat_user 是将运行我的 war 文件将部署到的 tomcat 实例的用户的主目录。

【讨论】:

注意类路径中的 jar 是否包含其自己的 log4j.properties @AlainPannetier 我想知道如何解决这个问题?因为据我了解,如果我将 log4j.properties 放在类路径中,它会自动将其包含到 src/root 中? 是的,这就是为什么我说“...将它添加到源代码树的根...” 你能帮我解决一个相关问题吗 - ***.com/questions/23278607/…【参考方案4】:

最好的方法是创建名为resources 的特殊源文件夹并将其用于包括log4j.properties 在内的所有资源。所以,把它放在那里。

在动态 Web 项目自动创建的 Java 资源文件夹上,右键单击并添加一个新的源文件夹并将其命名为“资源”。然后这里的文件会被导出到war文件到classes目录下

【讨论】:

你能帮我解决一个相关问题吗 - ***.com/questions/23278607/…【参考方案5】:

如果你有一个库并且想要附加 log4j:

    在您的项目中创建一个名为“resources”的文件夹。 创建一个名为 log4j 的 .properties 文件 在 log4j.properties 文件中设置属性 在项目中按右键并转到属性->Java 构建路径,最后转到“源”选项卡。 推送添加文件夹并搜索在步骤 1 中创建的“资源”文件夹。 完成。

(我假设您添加了 log4j 库。)

PD:对不起我的英语。

【讨论】:

【参考方案6】:

这个问题已经回答here

类路径从不包含特定文件。它包括目录和 jar 文件。因此,将该文件放在您的classpath 中的目录中。

Log4j 属性(通常)不用于开发应用程序(除非您正在调试 Eclipse 本身!)。因此,您真正想要构建可执行的 Java 应用程序(Application、WAR、EAR 或其他)并在运行时类路径中包含 Log4j 属性。

【讨论】:

你能帮我解决一个相关问题吗 - ***.com/questions/23278607/…【参考方案7】:

log4j.properties 放在运行时类路径中。

这个forum 显示了一些关于可能的方法的帖子。

【讨论】:

你能帮我解决一个相关问题吗 - ***.com/questions/23278607/…【参考方案8】:

一般我把它放在一个特殊的文件夹“res”或“resources”中,如前所述,但是对于Web应用程序,我将带有ant任务的log4j.properties复制到WEB-INF/classes目录。它是就像将文件放在 src/ 文件夹的根目录下一样,但通常我更喜欢在专用文件夹中查看它。

对于 Maven,通常的放置位置是在 src/main/resources 文件夹中,正如 other post 中所回答的那样。 那里的所有资源都将转到根类路径中的构建(例如target/classes/

如果你想要一个强大的记录器,你也可以看看slf4j library,它是一个记录器门面,可以使用后面的 log4j 实现。

【讨论】:

【参考方案9】:

我发现 log4j.properties 文件的位置取决于 Eclipse 项目的类型。

具体来说,对于 Eclipse 动态 Web 项目,涉及将 log4j.properties 添加到 war 文件的大多数答案实际上并未将属性文件添加到正确的位置,尤其是对于 Tomcat/Apache。

这是我的一些研究和我对这个问题的解决方案(再次专门针对在 Tomcat/Apache 6.0 上运行的动态 Web 项目)

请参阅这篇文章,了解 Tomcat 将如何加载类。它不同于 Java 的普通类加载器。 (https://www.mulesoft.com/tcat/tomcat-classpath) 请注意,它只在 war 文件中的两个位置查找,WEB-INF/classes 和 WEB-INF/lib。

请注意,对于动态 Web 项目,将 .properties 文件存储在 build/../classes 目录中是不明智的,因为每当您清理构建项目时都会擦除该目录。

Tomcat 不处理 WEB-INF/lib 位置中的 .property 文件。

您不能将 log4j.properties 文件存储在 src 目录中,因为 Eclipse 会将该目录从您的视图中抽象出来。

我发现解决此问题的一种方法是更改​​构建并添加一个附加目录,该目录最终将加载到 war 文件中的 WEB-INF/classes 目录中。具体......

(1) 在项目资源管理器中右键单击您的项目,选择“新建”->“文件夹”。您可以将文件夹命名为任何名称,但在这种情况下,标准是“资源”。新文件夹应该出现在项目的根目录中。

(2) 将 log4j.properties 文件移动到这个新文件夹中。

(3) 再次右键项目,选择'Build-Path'->'Configure Build Path'。选择“来源”选项卡。单击“添加文件夹”按钮。浏览以找到您在上述步骤 (1) 中创建的新文件夹。选择“确定”。

(4) 返回 eclipse Project Explorer 视图后,请注意该文件夹现在已移至“Java Resources”区域(即,由于 eclipse 表示抽象,它不再位于根目录)。

(5) 干净构建您的项目。

(6) 要验证 .properties 文件现在是否存在于您的 war 文件的 WEB-INF/classes 中,请将一个 war 文件导出到一个简单的位置(右键单击项目 -> 导出 -> War 文件)并检查内容.请注意,log4j.properties 文件现在出现在 WEB-INF/classes 中。

(7) 将您的项目推广到 Tomcat/Apache 并注意 log4j 现在可以正常工作。

现在 log4j 工作了,开始记录,解决世界问题,休息一下,享受美味的成人饮料。

【讨论】:

【参考方案10】:

您不希望将 log4j.properties 与您的项目打包一起部署 - 这是一个坏主意,正如其他海报所提到的那样。

找到 Eclipse 在运行应用程序时指向的根 Tomcat 安装,并将 log4j.properties 文件添加到那里的适当位置。对于 Tomcat 7,正确的位置是

$TOMCAT_HOME/lib

【讨论】:

【参考方案11】:

对于 eclipse 中的普通(非 maven 和非 web)java 项目。

    在项目目录下创建一个包含新选项和任意名称(作为标准我们可以将其命名为资源)的“源”文件夹 将 log4j.properties 文件推送到此“源”文件夹。 构建并运行应用程序。

【讨论】:

以上是关于将 Log4j.properties 放入 Eclipse 项目的正确位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

无法阻止 Hibernate 将日志写入控制台(log4j.properties 可以)

将 log4j.properties 文件从 Log4j 版本 1 迁移到 2 的合适指南

如何读取jar包外的properties文件和log4j.properties

如何读取jar包外的properties文件和log4j.properties

log4j.properties 的作用是啥?求详解

Kuboard映射外部log4j.properties调整日志级别