【问题标题】:Is it possible to configure logback logger levels on the command line?是否可以在命令行上配置 logback 记录器级别?
【发布时间】:2014-04-23 19:50:06
【问题描述】:

Log4J 允许您传递您希望应用程序中特定记录器从命令行登录的级别,例如“-Dlog4j.logger.com.whatever.MyClass=DEBUG”。我在 Logback 中找不到任何类似的工具。根据常见问题解答,它似乎允许您做的只是使用变量替换设置根记录器的级别。有什么我遗漏的东西还是 Logback 不支持这个?谢谢。

【问题讨论】:

    标签: java logging log4j logback


    【解决方案1】:

    如果您使用的是 logback 和 Spring,那么您可以使用 logging.level.xxxx 系统属性在命令行上覆盖日志记录级别。

    有关示例,请参阅 https://stackoverflow.com/a/71403675/3059685

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但如果有人需要,这是我从 SysProps 初始化 Logback Logger 级别的解决方案代码。请注意,它使用 Slf4j 的 LoggerFactory 检索 Logback Logger。它使用 Java 8 lambda,但可以轻松转换为 Java 7 或更低版本。

      您只需在 main 方法的开头添加 SysPropLogbackConfigurator.applyOnce()。如果多次调用,静态初始化程序将阻止重新扫描属性。

      package com.yourpackage;
      
      import org.slf4j.LoggerFactory;
      import ch.qos.logback.classic.Level;
      
      /**
       * Looks into System.properties for props -DLOG.loggerName=LEVEL to set Logback levels at startup
       * If LEVEL is empty (setting -DLOG.loggerName without level), it erases a previously set level and will inherit from parent logger
       */
      public class SysPropLogbackConfigurator {
      
          public static final String PROP_PREFIX = "LOG.";
      
          public static void apply() {
              System.getProperties().stringPropertyNames().stream().filter(name -> name.startsWith(PROP_PREFIX)).forEach(SysPropLogbackConfigurator::applyProp);
          }
      
          public static void applyOnce() {
              OnceInitializer.emptyMethodToForceInit();//force static init. applySysPropsToLogback will be called only once
          }
      
          private static void applyProp(final String name) {
              final String loggerName = name.substring(PROP_PREFIX.length());
              final String levelStr = System.getProperty(name, "");
              final Level level = Level.toLevel(levelStr, null);
              ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(loggerName)).setLevel(level);
          }
      
          private static class OnceInitializer {
              static {
                  apply();
              }
      
              static void emptyMethodToForceInit() {
              };
          }
      }
      

      【讨论】:

        【解决方案3】:

        是的,好像没有这个功能。据我了解,部分原因是 logback 配置更复杂,因此很难通过扁平字符串属性实现合理的配置灵活性。 部分原因是,恕我直言,它鼓励不良做法——放置过多的系统属性——导致运行脚本或命令行臃肿,比单独的日志配置文件更难管理。

        不过,我可以提出几个选择:

        • 在您的 logback.xml 配置文件中使用 ${sys.prop.var.name} 替换
        • 在本地复制 logback.xml,将其修改为所需的记录器级别并指定-Dlogback.configurationFile=/path/to/customised/logback.xml。请记住,“Logback-classic 可以扫描其配置文件中的更改,并在配置文件更改时自动重新配置”。因此,您甚至无需重新启动进程即可更改日志记录级别。
        • DIY:在您的应用程序中添加一个代码,该代码将读取系统属性并将这些属性应用于启动期间的日志记录级别。

        【讨论】:

        • 我刚刚在单独的答案中添加了 DIY 代码 (stackoverflow.com/questions/23253916/…)
        • 6 年后:) - 同时有什么变化吗?
        • 请使用logging.config 而不是logback.configurationFile
        • 如果使用 Spring,则需要 logging.config。在这种情况下,您可以使用 classpath: 协议引用您的 .xml 文件:-Dlogging.config=classpath:my-custom-logback.xml
        【解决方案4】:

        FAQ中所述:

        Logback 不允许从命令行禁用日志记录。但是,如果配置文件允许,您可以通过 Java 系统属性在命令行上设置记录器的级别。

        所以正如@kan 前面提到的,你必须使用其他选项。

        【讨论】:

          猜你喜欢
          • 2015-08-13
          • 2014-02-17
          • 1970-01-01
          • 1970-01-01
          • 2014-09-26
          • 2014-07-18
          • 2011-08-04
          • 1970-01-01
          相关资源
          最近更新 更多