我应该将log4j.properties文件放在哪里?


135

我使用netfishs 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获取


2
PropertyConfigurator.configure(“ log4j.properties”)的目的是什么?行?我从不使用这个。您的log4j.xml文件只能在类路径中的“某处”。
Antoine Claval

1
查看stackoverflow.com/questions/1140358/…以查找如何记录log4j配置本身。我认为这应该对您有很大帮助,因为某些容器具有自己的log4j配置。
dz。

@AntoineClaval我删除了那个被诅咒的台词,它就像一个魅力一样工作。伙计,
悉达多(Siddharth)

Answers:


113

我知道回答这个问题有点晚了,也许您已经找到了解决方案,但是我将发布我找到的解决方案(在我进行大量Google搜索之后),因此可能会有所帮助:

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

希望这会有所帮助。

rgds


使用“运行”命令使tomcat处于前台;您可以通过命令行传入Java选项。另外,bash的-x选项可用于查看您的选项到底发生了什么:JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh运行
RoyM

50

如前所述,log4j.properties应该位于类路径中包含的目录中,我想补充一点,在经过改造的项目中,可以找到一个好地方 src/main/resources/log4j.properties


26

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


是unix系统上的file:/或file:///还是/ path / to / file?
morpheus

对于Windows,它只是file:/,我猜unix是相同的
Amalgovinus

这是imo唯一考虑到具有不同日志级别的多个环境的答案。
马特

在macOS上,Liberty Server的jvm.options不使用引号,而使用file:///
wnm3

只是一个更新,可能会帮助您节省一些挫败感:如果您使用的是log4j2,则参数名称已更改为log4j.configurationFile
dan.m是user2321368

25

您必须将其放在与执行上下文相对应的根目录中。

例:

    MyProject
       src
           MyClass.java
           log4j.properties

如果从另一个项目开始执行,则需要在该项目中使用该文件来开始执行。例如,如果另一个项目包含一些JUnit测试,则它还需要具有其log4j.properties文件。


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


例如,我几乎把它放在每个目录中。但这对Glassfish部署项目没有帮助,因为GF不会将属性复制到正确的目录中。似乎GF确实失去了它。

实际上,我认为问题出在Netbeans的自动部署上。我尝试通过管理控制台中的war文件进行部署,没关系。我不知道我是否正确。如果我是对的,那么为什么在自动部署项目时netbeans不部署这些文件。

有效 !但是它不是很优雅……它认为最好放在“资源”类文件夹中。
Adams.H 2014年

17

对于基于Maven的项目,请将log4j.properties保留在src / main / resources中。没什么可做的!


就是这样,对于其他属性文件(例如Maven Projects中的XMLConfiguration)也是如此。谢谢!
拉蒙

13

如果将log4j.properties放在src中,则无需使用以下语句-

PropertyConfigurator.configure("log4j.properties");

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


10

尝试:

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

9

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


从理论上讲,这是答案,但是问题是,当glassfish部署war文件时,log4j.properties丢失了。
单声道

3
它应该在WEB-INF / class中,并包装在战争文件中
Martin OConnor 2009年

@mono-至少在可下载的存档中,web / WEB-INF / classes中没有log4j.properties。马丁是对的,那是应该的。
fvu

诀窍是,将其放在src文件夹(您的根源文件夹)中,在构建代码的过程中,文件会自动传输到classes文件夹...
Mostafa Zeinali 2015年

7

我的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文件。


5

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

这可以是Eclipse中的/ src目录,也可以是已部署的应用程序中的WEB-INF / classes目录,但是最好要了解类路径的概念以及为什么将文件放置在其中,不要仅仅对待WEB-INF /类作为“魔术”目录。


5

我花了大量时间弄清楚为什么看不到log4j.properties文件。
然后我注意到,只有当项目在MyProject / target / classes /MyProject / src / main / resources文件夹中时,该项目才可见。
希望对别人有用。
PS:该项目基于Maven。


3

我发现默认情况下,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");

1

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

它可以与IDE一起使用,但不能在自己运行jar文件时使用。当您自己运行jar文件时,只需将log4j.properties文件复制到jar文件所在的文件夹中。当jar和属性文件在同一目录中时,它运行良好。


1

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

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

    \Project\
       src\
          log4j.properties

1

有很多方法可以做到这一点:

方式1:如果您在不使用PropertyConfigurator的情况下尝试在Maven项目中

首先:在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");

}

在此处输入图片说明

Way3:如果您尝试在Java / Maven项目上使用 xml,请使用DOMConfigurator

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

静态的{

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

}

在此处输入图片说明


1

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

src/main/java
src/main/resources

将log4j.properties放置在资源文件夹中,如果不存在,则可以创建资源文件夹


0

实际上,我刚刚在stardard Java项目结构中遇到了以下问题:

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

在Eclipse中,我需要添加res文件夹以构建路径,但是,在Intellij中,我需要将res文件夹标记为resouces,如链接的屏幕截图所示:右键单击res文件夹并将其标记为resources


0

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

对于Web动态项目:-

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

希望对您有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.