【问题标题】:File Handler doesn't start working until i have a file created在我创建文件之前,文件处理程序不会开始工作
【发布时间】:2014-11-20 10:12:03
【问题描述】:

我有一个 loggers.config 文件,它指定了一个自定义文件处理程序以将日志消息格式化为文件。除非使用指定的文件模式创建默认文件,否则处理程序将无法工作。然后它会创建一个新文件,并按照模式指定的附加 0 并开始记录到该文件。如何在不先指定默认文件的情况下将其记录到文件中。

这是日志文件:

handlers=com.daniel.logging.MyFileHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO

com.daniel.logging.MyFileHandler.level=INFO

# Naming style for the output file: 
com.daniel.logging.MyFileHandler.pattern=daniel%g.log

# Limiting size of output file in bytes -defaulted to 1MB: 
com.daniel.logging.MyFileHandler.limit=1MB

# Number of output files to cycle through, by appending an 
# integer to the base file name: 
com.daniel.logging.MyFileHandler.count=10

# Style of output (Simple or XML): 
com.daniel.logging.MyFileHandler.formatter=com.daniel.logging.MyLogFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

在安装程序中(这是一个应用程序日志记录属性文件,其中创建了一个文件,其中有一行将 logger.config 文件指定为 logger.properties。几行之后,创建了一个文件并使用命令 CMD [@] >> default_file 2>&1. 我不确定那行是做什么的(我对 bash 很陌生)

【问题讨论】:

  • 您能否更新问题以包含不起作用的 loggers.config 以及创建附加 0 的文件的 loggers.config?
  • MyFileHandler 是否扩展了 j.u.l.FileHandler?
  • 是 MyFileHandler 中扩展了 FileHandler 类

标签: java logging config filehandler


【解决方案1】:

检查程序正在执行的用户帐户是否具有文件路径的写入权限。

com.daniel.logging.MyFileHandler.limit=1MB

应该改为:

com.daniel.logging.MyFileHandler.limit=1048576

您的文件模式正在使用相对路径。您应该使用绝对路径或使用主目录或临时目录的模式。 FileHandler 将无法创建新的日志文件if the directory path doesn't exist。在 FileHandler 创建日志文件之前,这些目录必须存在。

如果您想在文件模式中使用 SimpleDateFormat 模式,您可以执行以下操作:

    public final class MyFileHandler extends FileHandler {

        public MyFileHandler() throws IOException {
            super(toPattern());
        }

        private static String toPattern() throws IOException {
            String defaultPattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
            String p = MyFileHandler.class.getName();
            String v = LogManager.getLogManager().getProperty(p + ".pattern");
            if (v == null) {
                v = defaultPattern;
            }

            try {
                return new SimpleDateFormat(v).format(new Date());   
            } catch (RuntimeException re) {
                throw new IOException(v, re);
            }
        }
    }

如果您需要旋转支持,您可以参考PackageNameFileHandler 作为起点。

【讨论】:

  • 是否可以指定允许日期的 FileHandler 模式?例如,如果我有一个初始文件 home-application,然后应用了以下格式的日期:$(date +%Y%m%d-%H%M%S)
  • j.u.l.FileHandler 不支持日期模式。但是,在您的子类中,很容易创建一个静态方法来预处理来自文件模式的 j.t.SimpleDateFormat 模式,然后再将其传递给超级构造函数。
  • 您是否有任何正在创建此类静态方法的链接示例?谢谢
  • 我实际上要做的是在创建每个日志文件时在它们的末尾添加一个 iso 8601 时间戳。
  • 我更新了答案,为您提供了一些示例。
猜你喜欢
  • 2014-01-13
  • 2013-03-07
  • 1970-01-01
  • 2018-01-31
  • 2018-03-03
  • 1970-01-01
  • 2023-03-22
  • 2015-07-07
相关资源
最近更新 更多