【问题标题】:Java util Logger not writing to fileJava util Logger不写入文件
【发布时间】:2019-05-30 10:15:39
【问题描述】:

我为我的应用程序编写了一个愚蠢的 Logger。它将信息、警告和严重消息写入日志文件。前段时间它工作得很好,但突然间,它无缘无故地停止工作。 如果它不存在,它会继续创建日志文件,但没有写入任何内容。 我找不到为什么它现在不起作用。我会感谢一些帮助。

使用我的 IDE 进行调试,我意识到消息已正确传递给记录器,并且正在执行 logger.info()。

public class FsLogger {

    private static FsLogger instance;

    private final String filename = "Logs/LogFsForensics.log";
    private final String loggerName = "FsLogger";
    private static Logger logger;   
        private FileHandler fh;
        private final int limit = 1024*10000; //10 MB
        private SimpleFormatter sf;

    private FsLogger() {
        logger =  Logger.getLogger(loggerName);

        sf = new SimpleFormatter();
        try {
            fh = new FileHandler(filename, limit, 1, true);
            sf = new SimpleFormatter();
            fh.setFormatter(sf);

            logger.addHandler(fh);
        } catch (SecurityException | IOException e) {           
            e.printStackTrace();
        }
    }

    public static FsLogger getInstance() {
        if(instance == null) {
            instance = new FsLogger();
        }
        return instance;
    }

    public void info(String message) {
        logger.info(message);
    }

    public void warning(String message) {
        logger.warning(message);        
    }

    public void severe(String message) {
        logger.severe(message);
    }

记录器调用示例:

private FsLogger logger = FsLogger.getInstance();
logger.severe(e1.getMessage());

【问题讨论】:

  • 请检查是否是文件创建权限问题。

标签: java java.util.logging


【解决方案1】:

我已尝试执行您的代码并在控制台和文件中获得以下输出:

May 30, 2019 12:35:11 PM io.yooksi.Main main
INFO: This is a test.
May 30, 2019 12:35:11 PM io.yooksi.FsLogger info
INFO: This is an info message
May 30, 2019 12:35:11 PM io.yooksi.FsLogger warning
WARNING: This is a warning
May 30, 2019 12:35:11 PM io.yooksi.FsLogger severe
SEVERE: This is a sever error message

这说明你的代码没有问题,所以你可以尝试以下方法:

  • 确保以下代码正确输出到控制台:

    Logger logger = Logger.getLogger("test");
    logger.info("This is a test.");
    
  • 确保文件未处于只读状态。
  • 尝试使用FileWriterPrintWriter 手动写入文件。

如果第一次测试未能向控制台打印任何内容,请阅读以下文档,您可以在其中找到Java 记录器无法正常工作的常见原因列表以及如何解决它们的具体步骤(至少一个配置相关)

Why is my Java Logging not working

【讨论】:

  • 这就是问题所在,logger.info("This is a test") 根本没有输出到控制台。 File 未处于只读模式,并且 FileWriter 正确写入 fly。似乎由于某种原因 java.util.logging 未启用。
  • @JulianG.M.究竟是什么?
  • @JulianG.M.我已经用一个文档链接更新了答案,该链接可能会帮助您找出 Java 记录器不打印的原因。您的下一步应该是阅读该链接文档并确保您没有使用任何 JVM 参数,例如指定记录器配置位置。
  • 经过几个小时的调查,我无法让我的 Logger 工作。显然,这可能是由某些库执行的 reset() 操作引起的。
  • 我知道这不是您最初提出的问题,但您是否考虑过使用 Log4j 代替原生 Java Logger?我个人使用它并认为它比 Java 记录器要好得多。也许你会有更好的运气。
【解决方案2】:

从代码中你使用了Logs/LogFsForensics.log的相对路径这意味着如果当前工作目录如果进程改变了路径将无效。当这种情况发生时,FileHandler will create a file in the default location。使用绝对路径或指定FileHandler special components 之一。例如:

/Logs/LogFsForensics.log 作为绝对路径或%h/Logs/LogFsForensics.log 作为主目录的相对路径。

您可以从Logging not showing 修改测试程序以打印记录器树和处理程序。可能未正确设置级别或未安装处理程序。

查看代码,我认为您希望 getInstance 同步,因此您永远不会尝试创建多个处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多