1

我的目标是使用 java.util.logging(jdk1.6)

  • 将所有日志写入同一个日志文件并
  • 做日志轮换
  • 可以在文件模式中使用 %u 以避免与其他程序的潜在文件冲突

我已经配置了一个根记录器和几个命名记录器,其中根记录器的处理程序设置java.util.logging.FileHandler

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.pattern = xxx.%u.log
java.util.logging.FileHandler.limit = 200000
java.util.logging.FileHandler.count = 20
java.util.logging.FileHandler.append = true

并将命名记录器的处理程序设置为customFileH 自定义设置

customFileH.class = java.util.logging.FileHandler
customFileH.level = ALL
customFileH.formatter = xxxFormat

当我运行程序时,根记录器会将日志写入 xxx.0.log,

而命名记录器会将日志写入 xxx.0.log.1,作为不同的日志文件。

即使我在文件模式中取出“%u”;备注文件轮换配置,它们是否写入不同的日志文件。:(

感谢您提前发表任何评论。:)

4

1 回答 1

1

看起来您正在尝试将 log4j 样式配置应用于 java.util.logging。如果要创建多个具有不同格式化程序的 FileHandler,则必须使用config选项来安装每个 FileHandler。创建一个配置类:

package so;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.logging.XMLFormatter;

public final class LoggingConfig {

    /**
     * Pin the loggers.
     */
    private static final Logger root = Logger.getLogger("");
    private static final Logger named = Logger.getLogger("some.name");

    /**
     * Configure the loggers.
     * @throws Exception if there is a problem.
     */
    public LoggingConfig() throws Exception {
        root.addHandler(newRootHandler());
        named.addHandler(newNamedHandler());
    }

    private FileHandler newRootHandler() throws IOException {
        FileHandler f = new FileHandler("simple%g.%u.log", 200000, 20, true);
        f.setFormatter(new SimpleFormatter());
        return f;
    }

    private FileHandler newNamedHandler() throws IOException {
        FileHandler f = new FileHandler("xml%g.%u.log", 200000, 20, true);
        f.setFormatter(new XMLFormatter());
        return f;
    }
}

然后将以下内容添加到您的 logging.properties:

config=so.LoggingConfig

否则,您可以将 FileHandler 子类化,以创建可在您的 logging.properties 中使用的新类名。

您必须使用%g选项来区分旋转日志和 %u 来处理冲突。从 FileHandler 文档:

因此,如果三个进程都试图登录到 fred%u.%g.txt,那么它们最终可能会使用 fred0.0.txt、fred1.0.txt、fred2.0.txt 作为其轮换序列中的第一个文件。

默认情况下,所有命名记录器都将写入根记录器的处理程序。因此,根据您在做什么,您可能不需要将文件处理程序附加到命名记录器。

于 2014-08-18T18:45:20.440 回答