【问题标题】:Log4J creates log file but does not write to itLog4J 创建日志文件但不写入
【发布时间】:2014-06-22 22:22:37
【问题描述】:

我正在尝试将 log4j 配置为将消息记录到文件中。现在,确实使用我提供的名称创建了该文件,但日志并未写入该文件。我的代码:

public class Main extends Application
{
    private static Logger logger = Logger.getLogger( Main.class.getName() );
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        logger.warning("test");
        logger.severe("oh noes");
    }


    public static void main(String[] args) {
        launch(args);
    }
}

我的log4j.properties 文件的内容:

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log.log
log4j.appender.file.MaxFileSize=1024MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

当我运行它时,我会在控制台中得到这个输出:

Jun 23, 2014 3:19:16 AM com.foo.Main start
WARNING: test
Jun 23, 2014 3:19:16 AM com.foo.Main start
SEVERE: oh noes

文件log.log 确实在我的主目录中创建。但它是空的。

任何想法我做错了什么?我正在使用 log4j 版本 1.2.17。

【问题讨论】:

  • 您确定要导入 Log4J 的 Logger 类,而不是 java.util.logging.Logger

标签: java logging log4j


【解决方案1】:

输出似乎是 Java 标准日志框架 (JUL) 发出的默认格式。

所以,有两种可能性(想到):

  1. 您的代码导入java.util.logging.Logger,而不是org.apache.log4j.Logger
  2. 在您的类路径中存在某种库,它拦截 Log4J 调用并将它们转换为 JUL 调用。

【讨论】:

  • 谢谢,就是这样。但我注意到只有我的error 或更高级别的消息被记录到文件或控制台。任何想法如何让它记录所有级别?
  • 您的配置设置方式(也许您在此处发布后更改了它?),Log4J 只会打印info 及以上的消息,并将它们打印到控制台和文件。您可以通过将log4j.rootLogger 中的INFO 更改为ALL 来更改此行为。如果这不起作用,请将-Dlog4j.debug=true 添加到您的 JVM 参数中 - 这将使 Log4J 发出有关其自身的调试消息(发送到 System.out),以便您可以看到发生了什么。
  • 如果是场景#2,有没有办法识别谁带来了拦截器,建议的修改方法是什么?
【解决方案2】:

我和你有同样的问题。文件已创建,但仅在控制台中没有任何日志。在我的情况下,这是因为 maven 项目中的依赖关系不正确。

我的log4j.properties 文件是:

# Root logger option
log4j.rootLogger=DEBUG, file

# Direct log messages to a log file
# configuration to print into file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=10
# Define the layout for file appender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=[%t] %-5p %c %x - %m%n
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Set the name of the file
log4j.appender.file.File=C:\\log\\logging.log
# Set the append to false, overwrite
log4j.appender.file.Append=false

我在 POM 中使用过:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.6.2</version>
</dependency>
    
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

是的,它为我创建了我需要的文件,但日志在控制台中。然后我将其更改为另一个依赖项,例如:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>

我终于把它放在文件而不是控制台中。即使没有像PropertyConfigurator.configure() 这样的显式命令。

【讨论】:

    【解决方案3】:

    我有同样的问题,我解决了。 当我在属性文件中将级别形式 INFO 更改为 DEBUG 时 - 行:

    log4j.rootLogger=DEBUG, file, stdout
    

    比我在脚本中写的:

    logger.debug("Hello world");

    所有内容都保存在文件中。

    【讨论】:

      【解决方案4】:

      这里的文件名其实就是LOGGER类的包

      logger.file.name="你在java中的包名"

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 2018-06-28
        • 2012-11-03
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多