【问题标题】:Where should I put the log4j.properties file?我应该把 log4j.properties 文件放在哪里?
【发布时间】:2010-12-01 22:35:42
【问题描述】:

我使用 netbeans 6.7.1 和 glassfish v2.1 编写了一个 Web 服务项目,将 log4j.properties 放到项目的根目录并使用:

static Logger logger = Logger.getLogger(MyClass.class);

在构造函数中:

PropertyConfigurator.configure("log4j.properties");

在函数中:

logger.info("...");
logger.error("...");
// ...

但是,这是错误信息(实际上,我已经尝试将它放在几乎我能意识到的每个目录中):

log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:297)
        at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:315)
        at com.corp.ors.demo.OrsDemo.main(OrisDemo.java:228)
log4j:ERROR Ignoring configuration file [log4j.properties].
log4j:WARN No appenders could be found for logger (com.corp.ors.demo.OrsDemo).
log4j:WARN Please initialize the log4j system properly.

示例项目可以从http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8获取

【问题讨论】:

  • PropertyConfigurator.configure("log4j.properties"); 的目的是什么线 ?我从来不用这个。您的 log4j.xml 文件只能位于类路径中的“某处”。
  • 查看stackoverflow.com/questions/1140358/… 以了解 log4j 配置本身是如何被记录的。我认为这应该对你有很大帮助,因为有些容器有自己的 log4j 配置。
  • @AntoineClaval 我删除了那条被诅咒的线,它就像一个魅力。伙计,真棒..

标签: java netbeans glassfish log4j


【解决方案1】:

我知道现在回答这个问题有点晚了,也许你已经找到了解决方案,但我发布了我找到的解决方案(在我搜索了很多之后),所以它可能会有所帮助:

  1. 将 log4j.properties 放在该线程前面提到的项目的 WEB-INF\classes 下。
  2. 将log4j-xx.jar放到WEB-INF\lib下
  3. 测试是否加载了log4j:在tomcat的java选项末尾添加-Dlog4j.debug@

希望这会有所帮助。

rgds

【讨论】:

  • 使用'run'命令在前台获取tomcat;您可以通过命令行传入 java 选项。此外,bash 的 -x 选项有助于查看您的选项究竟发生了什么: JAVA_OPTS=-Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
【解决方案2】:

如前所述,log4j.properties 应该在类路径中包含的目录中,我想补充一点,在一个 mavenized 项目中,一个好地方可以是src/main/resources/log4j.properties

【讨论】:

    【解决方案3】:

    您可以使用 VM 参数 -Dlog4j.configuration="file:/C:/workspace3/local/log4j.properties" 指定配置文件位置

    【讨论】:

    • 在 unix 系统上是 file:/ 还是 file:/// 或者只是 /path/to/file?
    • 对于 windows 它只是 file:/ ,我猜 unix 是一样的
    • 这是 imo 唯一将具有不同日志级别的多个环境考虑在内的答案。
    • 在 macOS 上,在 Liberty Server 的 jvm.options 中不要使用引号并使用 file:///
    • 只是一个可能有助于节省一些挫折的更新:如果您使用的是 log4j2,则参数的名称已更改为 log4j.configurationFile
    【解决方案4】:

    你必须把它放在根目录,对应你的执行上下文。

    例子:

        MyProject
           src
               MyClass.java
               log4j.properties
    

    如果您从不同的项目开始执行,则需要在项目中使用该文件来启动执行。例如,如果一个不同的项目包含一些 JUnit 测试,它也需要有它的 log4j.properties 文件。


    我建议使用 log4j.xml 而不是 log4j.properties。你有更多的选择,从你的 IDE 获得帮助等等......

    【讨论】:

    • 例如,我几乎把它放在每个目录。但这对 Glassfish 部署项目没有帮助,因为 GF 不会将属性复制到正确的目录。看来 GF 确实输了。
    • 实际上,我认为问题出在 netbeans 的自动部署上。我尝试在管理控制台中通过war文件部署,没关系。我不知道我是否正确。如果我是对的,为什么 netbeans 在自动部署项目时不部署这些文件。
    • 成功了!但它不是不优雅......它认为它最好放在“资源”类型的文件夹中。
    【解决方案5】:

    对于基于 Maven 的项目,请将您的 log4j.properties 保存在 src/main/resources 中。无事可做!

    【讨论】:

    • 就是这样,Maven项目中的XMLConfiguration等其他属性文件也是如此。谢谢!
    【解决方案6】:

    如果你把log4j.properties放在src里面,就不需要使用语句了——

    PropertyConfigurator.configure("log4j.properties");
    

    当属性文件在类路径中时,它将被自动获取。

    【讨论】:

      【解决方案7】:

      试试:

      PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));
      

      【讨论】:

        【解决方案8】:

        该文件应位于 WEB-INF/classes 目录中。 这个目录结构应该打包在war文件中。

        【讨论】:

        • 理论上是答案,但问题是glassfish部署war文件时log4j.properties丢失。
        • 它应该在WEB-INF/classes中并打包在war文件中
        • @mono - 至少在可下载的存档中,web/WEB-INF/classes 中没有 log4j.properties。马丁是对的,应该是这样。
        • 诀窍是,你把它放在你的src文件夹中,(你的根源文件夹),在构建你的代码的过程中,文件会自动转移到classes文件夹中......
        【解决方案9】:

        我的 IDE 是 NetBeans。我把 log4j.property 文件如图所示

        网络

        WEB-INF

        要使用此属性文件,您应该编写以下代码:

        package example;
        
        import java.io.File;
        import org.apache.log4j.PropertyConfigurator;
        import org.apache.log4j.Logger;
        import javax.servlet.*;
        public class test {
        
        public static ServletContext context;
        static Logger log = Logger.getLogger("example/test");
        
        public test() {
        
                String homeDir = context.getRealPath("/");
                File propertiesFile = new File(homeDir, "WEB-INF/log4j.properties");
                PropertyConfigurator.configure(propertiesFile.toString());
                log.info("This is a test");
            }
        }
        

        您可以从另一个 JSP 文件中定义 静态 ServletContext 上下文。 示例:

        test.context = getServletContext(); 
        test sample = new test(); 
        

        现在您可以在项目中使用 log4j.property 文件了。

        【讨论】:

          【解决方案10】:

          已经提供了一些技术上正确的特定答案,但一般来说,它可以位于运行时类路径上的任何位置,即 JVM 寻找类的任何位置。

          这可能是 Eclipse 中的 /src 目录或部署应用程序中的 WEB-INF/classes 目录,但最好了解类路径的概念以及为什么将文件放在其中,不要只处理 WEB -INF/classes 作为“魔法”目录。

          【讨论】:

            【解决方案11】:

            我花了很多时间来弄清楚为什么看不到 log4j.properties 文件。
            然后我注意到它仅在 MyProject/target/classes/MyProject/src/main/resources 文件夹中对项目可见。
            希望它对某人有用。
            PS:该项目是基于 maven 的。

            【讨论】:

              【解决方案12】:

              我发现 Glassfish 默认将 [Glassfish 安装位置]\glassfish\domains[您的域]\ 作为默认工作目录...您可以将 log4j.properties 文件放在此位置并在您的使用前面提到的 PropertyConfigurator 的代码...

              Properties props = System.getProperties();
              System.out.println("Current working directory is " + props.getProperty("user.dir"));
              PropertyConfigurator.configure("log4j.properties");
              

              【讨论】:

                【解决方案13】:

                您的标准项目设置将具有类似的项目结构:

                src/main/java
                src/main/resources
                

                你把log4j.properties放在resources文件夹里面,如果resources文件夹不存在你可以创建一个

                【讨论】:

                  【解决方案14】:

                  我不知道这是正确的方法。但它解决了我的问题。 将 log4j.properties 文件放入“项目文件夹”/config 并使用 PropertyConfigurator.configure("config//log4j.properties");

                  它适用于 IDE,但不能在自己运行 jar 文件时使用。 当你自己运行jar文件时,只需将log4j.properties文件复制到jar文件所在的文件夹中即可。当jar和property文件在同一目录时,它运行良好。

                  【讨论】:

                    【解决方案15】:

                    将 log4j.properties 放在类路径中。 这里有两个案例可以帮助您确定正确的位置- 1. 对于 Web 应用程序,类路径是 /WEB-INF/classes。

                    \WEB-INF      
                        classes\
                            log4j.properties
                    
                    1. 从主/单元测试类路径是源目录

                      \Project\
                         src\
                            log4j.properties
                      

                    【讨论】:

                      【解决方案16】:

                      有很多方法可以做到:

                      方式1:如果你在maven项目中尝试不使用PropertyConfigurator

                      首先: 检查 scr/main 中的资源目录

                        if available,
                             then: create a .properties file and add all configuration details.
                        else
                             then: create a directory named resources and a file with .properties     
                      write your configuration code/details.
                      

                      如下截图:

                      方式 2: 如果您正在尝试使用 java/maven 项目的属性文件使用 PropertyConfigurator

                      将属性文件放在项目中的任何位置并给出正确的路径。 说:src/javaLog4jProperties/log4j.properties

                      静态{

                       PropertyConfigurator.configure("src/javaLog4jProperties/log4j.properties");
                      

                      }

                      方式3:如果你在java/maven项目上尝试使用xml使用DOMConfigurator

                      将属性文件放在项目中的任何位置并提供正确的路径。 说:src/javaLog4jProperties/log4j.xml

                      静态{

                       DOMConfigurator.configure("src/javaLog4jProperties/log4j.xml");
                      

                      }

                      【讨论】:

                        【解决方案17】:

                        实际上,我刚刚在一个标准的Java项目结构中遇到了这个问题,如下所示:

                        \myproject
                            \src
                            \libs
                            \res\log4j.properties
                        

                        在 Eclipse 中,我需要添加 res 文件夹来构建路径,但是,在 Intellij 中,我需要将 res 文件夹标记为资源,如链接的屏幕截图所示:right click on the res folder and mark as resources

                        【讨论】:

                          【解决方案18】:

                          如果您已经在项目结构中定义了 log4j.properties,则无需在 Log4J 类中指定 PropertyConfigurator.configure("log4j.properties");

                          如果是 Web 动态项目:-

                          您需要将 log4j.properties 保存在 WebContent -> WEB-INF -> log4j.properties 下

                          希望对你有帮助。

                          【讨论】:

                            【解决方案19】:

                            打开spark-shell

                            然后输入System.getenv("SPARK_CONF_DIR")

                            这将打印你的log4j.properties 应该去哪里。

                            【讨论】:

                              【解决方案20】:

                              对我来说,当我将文件放入资源文件夹时它就起作用了。 此外,它是我项目的战争文件。我的建议是确保文件名是 log4j.properties,因为我的项目无法识别“log4j2.properties”

                              【讨论】:

                                猜你喜欢
                                • 2018-09-28
                                • 2019-10-04
                                • 1970-01-01
                                • 2020-09-30
                                • 1970-01-01
                                • 2016-05-23
                                • 1970-01-01
                                • 2016-08-25
                                • 2013-08-15
                                相关资源
                                最近更新 更多