Java 使用ConfigurationFactory以编程方式配置log4j2

Java 使用ConfigurationFactory以编程方式配置log4j2,java,logging,log4j2,Java,Logging,Log4j2,我试图仅通过使用和引用来配置和设置Log4j2。我使用的代码如下所示: public class LoggingConfiguration { public static final String PATTERN_LAYOUT = "[%d] [%t] [%-5level] - %msg (%logger{1}:%L) %n%throwable"; public static final String LOG_FILE_NAME = "app.log"; public

我试图仅通过使用和引用来配置和设置Log4j2。我使用的代码如下所示:

public class LoggingConfiguration {

    public static final String PATTERN_LAYOUT = "[%d] [%t] [%-5level] - %msg (%logger{1}:%L) %n%throwable";
    public static final String LOG_FILE_NAME = "app.log";
    public static final String LOG_FILE_NAME_PATTERN = LOG_FILE_NAME + "-yyyy.MM.dd";

    static {
        ConfigurationFactory.setConfigurationFactory(new Log4j2ConfigurationFactory());
    }

    /**
     * Just to make JVM visit this class to initialize the static parts.
     */
    public static void configure() {
    }

    @Plugin(category = "ConfigurationFactory", name = "Log4j2ConfigurationFactory")
    @Order(0)
    public static class Log4j2ConfigurationFactory extends ConfigurationFactory {

        @Override
        protected String[] getSupportedTypes() {
            return null;
        }

        @Override
        public Configuration getConfiguration(ConfigurationSource source) {
            return new Log4j2Configuration();
        }

        @Override
        public Configuration getConfiguration(String name, URI configLocation) {
            return new Log4j2Configuration();
        }

    }

    private static class Log4j2Configuration extends DefaultConfiguration {

        public Log4j2Configuration() {
            setName("app-log4j2");
            String root = System.getProperty("APP_ROOT", "/tmp");
            if (!root.endsWith("/")) {
                root += "/";
            }
                            // MARKER
            Layout<? extends Serializable> layout = PatternLayout.createLayout(PATTERN_LAYOUT, null, null, null, null);

            String oneDay = TimeUnit.DAYS.toMillis(1) + "";
            String oneMB = (1024 * 1024) + "";
            final TimeBasedTriggeringPolicy timeBasedTriggeringPolicy = TimeBasedTriggeringPolicy.createPolicy(oneDay,
                    "true");
            final SizeBasedTriggeringPolicy sizeBasedTriggeringPolicy = SizeBasedTriggeringPolicy.createPolicy(oneMB);
            final CompositeTriggeringPolicy policy = CompositeTriggeringPolicy.createPolicy(timeBasedTriggeringPolicy,
                    sizeBasedTriggeringPolicy);
            final DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy("7", "1", null,
                    Deflater.DEFAULT_COMPRESSION + "", this);
            Appender appender = RollingFileAppender.createAppender(root + LOG_FILE_NAME, LOG_FILE_NAME_PATTERN, "true",
                    "app-log-file-appender", "true", "true", policy, strategy, layout, null, null, null, null, null);
            addAppender(appender);
            getRootLogger().addAppender(appender, Level.INFO, null);
        }
    }

}

如果我在上面的代码中注释掉
MARKER
之后的代码,它会起作用,但似乎缺少配置滚动文件追加器的功能。我应该怎么做才能解决这个问题?

log4j 2.x中,您必须以这种方式指定日期格式

public static final String LOG_FILE_NAME_PATTERN = LOG_FILE_NAME + "-%d{dd-MM-yyy}";
  • %
    标记格式的开头
  • d
    表示它是一种日期格式(您也可以使用
    date
  • 在花括号
    {}
    中定义格式化程序的选项。在本例中为日期格式。你可以使用a可以接受的任何东西
此外,您还可以使用:

  • %d{ABSOLUTE}
    ->
    HH:mm:ss,SSS
  • %d{COMPACT}
    ->
    yyyymmddhhmmssss
  • %d{DATE}
    ->
    dd-MMM-yyyy-HH:mm:ss,SSS
  • %d{ISO8601_BASIC}
    ->
    yyyyMMdd HHmmss,SSS
  • %d{ISO8601}
    ->
    yyyy-MM-dd-HH:MM:ss,SSS

注:此信息基于log4j 2.0-beta9(当前版本)。由于它是beta版,所以可能会略有变化。

如何初始化此log4j2实例?我的意思是无论是在主课还是其他地方?你能告诉我你采取的方法吗
public static final String LOG_FILE_NAME_PATTERN = LOG_FILE_NAME + "-%d{dd-MM-yyy}";