【问题标题】:Can't Create RollingFileAppender with System property variable无法使用系统属性变量创建 RollingFileAppender
【发布时间】:2016-09-02 21:06:23
【问题描述】:

使用 System 属性变量创建 RollingFileAppender 时出现以下错误。

ERROR Unable to invoke factory method in class class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile. java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:132)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:918)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:858)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:850)
at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:479)
at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:219)
at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:231)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:496)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:566)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:582)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:217)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:551)
at com.hifx.lens.services.AvroSerializerFactory.<init>(AvroSerializerFactory.java:16)
at com.hifx.lens.services.AvroSerializerFactory.init(AvroSerializerFactory.java:43)
at com.hifx.lens.Accumulo.main(Accumulo.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ClassCastException: org.apache.logging.log4j.core.appender.FileManager cannot be cast to org.apache.logging.log4j.core.appender.rolling.RollingFileManager
at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager(RollingFileManager.java:103)
at org.apache.logging.log4j.core.appender.RollingFileAppender.createAppender(RollingFileAppender.java:191)
... 27 more

我的log4j2.yml配置文件是

    Configutation:
    name: Default
    Properties:
        Property:
          name: LOG_PATH
          value: "logs"
      Appenders:
        Console:
          name: Console_Appender
          target: SYSTEM_OUT
          PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
    File:
      name: File_Appender
      fileName: ${sys:LOG_PATH}/log.log
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

    RollingFile:
      name: RollingFile_Appender
      fileName: ${sys:LOG_PATH}/log.log
      filePattern: "logs/archive/rollingfile.log.%d{yyyy-MM-dd-hh-mm}.gz"
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
      Policies:
        SizeBasedTriggeringPolicy:
          size: 100 KB
      DefaultRollOverStrategy:
        max: 30

  Loggers:
    Root:
      level: debug
      AppenderRef:
        - ref: RollingFile_Appender

    Logger:
          - name: Accumulo_File_logger
            level: debug
            AppenderRef:
              - ref: File_Appender

如果我将 RollingFile_Appender 的文件名更改为使用属性名,即:

fileName: ${LOG_PATH}/log.log 

然后错误消失,一切正常。

如果我使用 File_Appender(它也使用相同的系统属性变量(sys:LOG_PATH)),那么一切正常。

如果我将 sys: 更改为 env: 也会出现同样的错误 我认为杰克逊存在一些解析问题。 我需要从环境变量中配置日志路径。

使用 are 的依赖项

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.6.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.6.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>2.2.0</version>
    </dependency>        
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>2.6.2</version>
    </dependency>

谁来帮帮我

【问题讨论】:

    标签: java log4j2


    【解决方案1】:

    这是因为您定义了 File_Appender 和 RollingFile_Appender 来登录到同一个文件。他们有点“拥有”他们的日志文件,因此一旦为${sys:LOG_PATH}/log.log 创建了文件附加程序,您就无法创建指向同一文件的 RollingFile 附加程序。配置文件中的第二个 appender 尝试创建一个负责该文件的 LogManager,发现第一个已经存在,因此尝试强制转换为它需要的类 - 但失败了。

    如果您将 RollingFile_Appender 移到 File_Appender 上方,则会出现以下异常:

    main ERROR Unable to invoke factory method in class class org.apache.logging.log4j.core.appender.FileAppender for element File. java.lang.reflect.InvocationTargetException
    

    现在 RollingFile_Appender 将拥有 ${sys:LOG_PATH}/log.log 文件,由于同样的原因,您将无法创建 File_Appender。

    解决方案:删除其中一个附加程序,同时拥有两个附加程序没有任何意义 - 它们必须相互竞争,或者将每个附加程序指向不同的文件。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2012-12-11
      • 2011-10-26
      • 2021-11-14
      相关资源
      最近更新 更多