【问题标题】:How to specify Log4J 2.x config location?如何指定 Log4J 2.x 配置位置?
【发布时间】:2013-05-18 23:14:03
【问题描述】:

有没有办法手动指定 Log4J 2.x log4j2.xml 文件位置(如 Log4J 1.x 中的 DOMConfigurator),而不会弄乱类路径和系统属性?

【问题讨论】:

  • 您可以为此目的使用 log4j2.component.properties。简短说明here

标签: java logging configuration log4j log4j2


【解决方案1】:

您可以在org.apache.logging.log4j.core.config.Configurator 中使用静态方法#initialize(String contextName, ClassLoader loader, String configLocation)(参见源代码here)。 (您可以为类加载器传递 null。)

请注意,此类不是公共 API 的一部分,因此您的代码可能会因任何次要版本而中断

为了完整起见,您还可以使用此系统属性指定配置文件的位置:

-Dlog4j.configurationFile=path/to/log4j2.xml

【讨论】:

  • 这不是一个简单的方法,因为配置器(和其他)可以扩展(logging.apache.org/log4j/2.0/manual/extending.html
  • 在我的项目中我在哪里调用Configurator.initialize() ?我问它是因为我在静态块中执行此操作,并且 Log4j 正在记录它在我的代码运行之前没有找到该文件。
【解决方案2】:

使用 LoggerContext 允许setConfigLocation

File f = new File(this.logConfigFile);
URI fc = f.toURI();         
System.out.println("Loading logging config file: " + fc);
Logger l = (Logger) LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
l.getContext().setConfigLocation(fc);

或者

LoggerContext.getContext().setConfigLocation(java.net.URI);

【讨论】:

    【解决方案3】:

    你也可以像下面这样初始化

    ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4j file Path));
    XmlConfiguration xmlConfig = new XmlConfiguration(source);
    Logger logger = (Logger) LogManager.getLogger(); 
    logger.getContext().start(xmlConfig); 
    

    在每个类中,您可以获得如下记录器实例

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    private final Logger logger = LogManager.getLogger(ABC.class);
    

    【讨论】:

    【解决方案4】:

    在 Windows 中,请注意您需要使用带有 log4j.configurationFile 属性的 URI

    -Dlog4j.configurationFile=file://C:\path\to\log4j2.xml
    

    【讨论】:

    • 我相信系统属性接受普通文件路径(相对或绝对)以及 URI。
    • 它不起作用。我得到 ERROR StatusLogger No log4j2 configuration file found。使用默认配置:仅将错误记录到控制台。将系统属性 'org.apache.logging.log4j.simplelog.StatusLogger.level' 设置为 TRACE 以显示 Log4j2 内部初始化日志记录。
    • 我使用了“C:\\Users\\P....\\H............\\workspace\\P...... .....\\log4j2.properties”作为系统属性“log4j.configurationFile”的值,它工作正常。 Java 需要双反斜杠(在内部它们被转换为单反斜杠)。这些点实际上是路径中的正确字母。
    【解决方案5】:

    如果您使用的是 log4j2 并且属性在 log4j2.properties 文件中定义,请使用它。

    -Dlog4j2.configurationFile=file:/home/atul/log4j2.properties

    【讨论】:

    • -Dlog4j2.conf.. 还是-Dlog4j.conf.. 就像其他评论所说的那样?
    • 如果您使用的是 log4j2,那么我的回答会对您有所帮助。
    • 似乎两种方式都可以为 log4j2 工作。
    【解决方案6】:

    对于 log4j 版本 2.12.1,您可以找到如何重新配置​​ log4j2 here

    下面是一个例子

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.core.LoggerContext;
    
    File file = new File("C:\\Path for Windows OS\\yourConfig.xml");
        
    LoggerContext context = (LoggerContext) LogManager.getContext(false);
    context.setConfigLocation(file.toURI());
        
    Logger log  = LogManager.getLogger(YourClass.class);
    

    在我看来,配置 log4j2 的方式正在随着新版本的变化而变化,所以你应该意识到这一点。

    【讨论】:

      【解决方案7】:

      步骤:1 - 准备好带有附加程序详细信息的 log4J.xml 文件(主要在资源文件夹下)

      步骤:2 - 应将以下代码添加到配置类(在以前的 log4J 中,我们有 PropertyConfigurator,现在我们需要使用 LoggerContext

      String log4JFilePath = "file path of your log4J.xml file";
      LoggerContext loggerContext = (LoggerContext)LoggerManager.getContext(false);
      File file = new File(log4JFilePath);
      loggerContext.setConfigLocation(file.toURI());
      

      步骤:3 - 添加以下行以在任何类中使用记录器

      private static final Logger logger = LogManager.getLogger(yourClassName.class);
      
      logger.info("log here");
      
       
      

      【讨论】:

        【解决方案8】:
        import org.apache.logging.log4j.LogManager;
        import org.apache.logging.log4j.Logger;
        import org.apache.logging.log4j.core.config.Configurator;
        
        public class Foo {
            public static void main(String[] args) {
        
             Configurator.initialize(null, "src/main/config/log4j2.xml"); //path specify
        
             Logger logger = LogManager.getLogger(APITestToolMain.class);
             logger.info("working");
            }
        }
        

        资源:https://www.baeldung.com/spring-boot-change-log4j2-location

        【讨论】:

          猜你喜欢
          • 2015-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-31
          • 2011-12-11
          • 1970-01-01
          相关资源
          最近更新 更多