Java 如何让根和命名记录器';是否将文件处理程序日志保存到同一文件?

Java 如何让根和命名记录器';是否将文件处理程序日志保存到同一文件?,java,logging,rotation,filehandler,Java,Logging,Rotation,Filehandler,我的目标是使用java.util.logging(jdk1.6) 将所有日志写入同一日志文件,然后 进行原木轮换 可以在文件模式中使用%u以避免与其他程序的潜在文件冲突 我已经配置了一个根记录器和几个命名记录器,其中 根记录器的处理程序设置为java.util.logging.FileHandler,并带有设置 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter java.util.loggi

我的目标是使用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”;备注文件旋转配置, 他们是否写入了不同的日志文件:(


感谢您的评论。:

看起来您正在尝试将log4j样式的配置应用于java.util.logging。如果要使用不同的格式化程序创建多个FileHandler,则必须使用该选项安装每个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中使用的新类名

您必须使用该选项来区分轮换日志和%u以处理冲突。从FileHandler文档中:

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


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

看起来您正在尝试将log4j样式的配置应用于java.util.logging。如果要使用不同的格式化程序创建多个FileHandler,则必须使用该选项安装每个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中使用的新类名

您必须使用该选项来区分轮换日志和%u以处理冲突。从FileHandler文档中:

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

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