【问题标题】:Dropwizard application not using log config from configuration.ymlDropwizard 应用程序未使用 configuration.yml 中的日志配置
【发布时间】:2015-12-06 23:08:47
【问题描述】:

我正在尝试让 DropWizard 记录到输出文件。正在创建文件,但没有写入任何内容。

实际上,提供的 .yml 文件中的配置似乎没有被使用。

我在启动过程中也收到以下警告,不确定它们是否相关:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/conor/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/conor/.m2/repository/com/conor/project/project-common/0.1-SNAPSHOT/project-common-0.1-SNAPSHOT.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

如何让 dropwizard 获取启动时提供的 yml 中的日志记录配置,以及如何确定当前配置的来源?谢谢。

更新::

我正在运行 DropWizard v0.9.1,我的日志配置如下:

# Logging settings.
logging:

  # The default level of all loggers. Can be OFF, ERROR, WARN, INFO, DEBUG, TRACE, or ALL.
  level: TRACE

  # Logger-specific levels.
  loggers:

#     Sets the level for 'com.example.app' to DEBUG.
    io.dropwizard: INFO

#     Redirects SQL logs to a separate file
    org.hibernate.SQL:
      level: DEBUG

# Logback's Time Based Rolling Policy - archivedLogFilenamePattern: /tmp/application-%d{yyyy-MM-dd}.log.gz
# Logback's Size and Time Based Rolling Policy -  archivedLogFilenamePattern: /tmp/application-%d{yyyy-MM-dd}-%i.log.gz
# Logback's Fixed Window Rolling Policy -  archivedLogFilenamePattern: /tmp/application-%i.log.gz

  appenders:
    - type: console
    - type: file
      threshold: DEBUG
      logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"
      currentLogFilename: output/logs/dropwizard.txt
      archivedLogFilenamePattern: output/logs/dropwizard-%d{yyyy-MM-dd}-%i.txt.gz
      archivedFileCount: 10
      timeZone: UTC
      maxFileSize: 10MB

【问题讨论】:

  • 你能分享你的日志配置吗?
  • 还有dropwizard的版本
  • 大家好,我添加了更多信息。谢谢。
  • 嘿,我已将您的配置 1 对 1 添加到我的项目中,并且我在日志记录方面完全没有问题。坦率地说,trace 太垃圾了,我以为我的电脑自己死了。您是否尝试过从项目中排除其中一个 SL4J 绑定?据我所知,dropwizard 与 logback 一起使用。第二个绑定是什么?看起来您正在尝试实现自己的日志记录:project-common-0.1-SNAPSHOT.jar!/org/slf4j/impl/StaticLoggerBinder.class ?
  • 顺便说一句,如果你的文件被创建,它显然是在拾取你的 yaml 配置。能否通过:DefaultLoggingFactory 进行调试。特别是 configure 方法,这是您应该设置记录器的地方。你可以确切地看到它在那里做什么。让我知道你发现了什么,我相信我们可以解决这个问题:)

标签: java logback dropwizard


【解决方案1】:

这看起来像一个典型的SLF4J 绑定问题,很容易解决。先看看URL provided with the warning里的相关部分有什么解释。:

SLF4J 发出的警告就是这样,一个警告。即使存在多个绑定,SLF4J 也会选择一个日志框架/实现并与之绑定。 SLF4J 选择绑定的方式由 JVM 决定,并且出于所有实际目的应该被认为是随机的。从 1.6.6 版本开始,SLF4J 将命名它实际绑定的框架/实现类。 诸如库或框架之类的嵌入式组件不应声明对任何 SLF4J 绑定的依赖,而应仅依赖于 slf4j-api。当库声明对 SLF4J 绑定的编译时依赖项时,它将该绑定强加给最终用户,从而否定了 SLF4J 的目的。当您遇到一个嵌入式组件声明对任何 SLF4J 绑定的编译时依赖项时,请花时间联系该组件/库的作者,并请他们改正他们的方式

由于绑定选择是随机的,我的猜测是绑定了 project-common SLF4J 依赖项,而不是来自 logback-classic 的预期依赖项,dropwizard 的传递依赖项。您应该在 Maven pom 文件中排除 project-common 中的那个,或者更好的是,如果您可以访问 project-common 的代码,请按照链接到网页的建议将其从 pom 文件中删除(即“改过自新”)。

【讨论】:

    【解决方案2】:

    从异常中,我认为您在产生冲突的类路径中使用了两个不同版本的 logback classic。尝试找出包含两次但版本不同的 jar 并删除其中一个。如果您使用 Maven 来管理依赖项,请使用标记排除 jar

        <exclusions>
          <exclusion>
           <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
             <version>the version you want to remove</version>
         </exclusion>
        </exclusions>  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多