当前位置: 首页 > 知识库问答 >
问题:

合并Spring boot和Logback的日志记录配置

殳越
2023-03-14

我有以下情况:一个使用日志的Spring启动应用程序,以及已经在应用程序中配置的几个日志记录属性

我想添加其他只能通过logback.xml文件可用的配置选项,但是一旦我将此文件添加到类路径(无论它被命名为logback.xml还是logback-spring.xml),它就会覆盖appistio.yml中的所有内容,并且所有日志记录级别/模式以及那里定义的其他选项都不再有效 - 似乎在添加logback后.xml来自appication.yml的所有选项 被忽略,我需要在xml文件中重新添加它们而不是yml。

我的问题是:是否可以合并这两个配置?我的意思是我只需要添加一个选项来回滚.xml我不想强迫其他开发人员学习日志.xml语法,因为他们已经熟悉appistio.yml配置日志记录的方式。

更新1

我正在尝试做的一件事是启用日志回传JMX访问,因此我创建了一个具有以下内容的日志Spring.xml文件:

<configuration debug="true">
   <jmxConfigurator />
</configuration>

在我引入这个文件之后,我丢失了webapp的所有日志记录,即使我在< code>application.yml文件中有< code > logging . level . root:info 。

我还想继续使用在< code>application.yml中定义的根日志记录级别和模式。我还想配置几个特定于logback的< code>turboFilters,据我所知,只能通过logback配置文件来定义。

更新 2

@devatherock和@Ashish Patil asnwers都帮助了我解决这个问题,我已经意识到通过springPropertylogback中包含spring配置元素的可能性.xml但我还没有看到它是一个可行的解决方案,因为我必须以这种方式重写多个元素,使日志.xml更难阅读。

但是正如@devatherock提到的——默认情况下,配置文件是合并的logback需要在配置中存在appender和root logger。即使存在于< code>logback.xml文件中,根记录器级别仍将被< code>application.yml设置覆盖(这是所期望的),但< code>pattern属性不会被覆盖,为此我们必须使用< code>springProperty。

因此,虽然两个答案都很有帮助,但实际上@devatherock的徽章对我更有帮助,我包括接受他的答案。

共有2个答案

桂志诚
2023-03-14

Spring属性的使用可能适合您的要求。

比方说,你有应用程序,如下所示

logging:
  level:
    root: DEBUG
...  // other configs

现在,即使在进行回溯.xml后,您也要强制实施 application.yml 的配置,那么您可以在回溯中添加 spring 属性.xml:

<configuration>
    <jmxConfigurator />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <springProperty scope="context" name="loggerProperty" source="logging.level.root"/>
    
    <root level="${loggerProperty}">
        <appender-ref ref="STDOUT" />
    </root>
    ... //other configurations.
</configuration>

现在,当您启动spring-boot时,您可以看到application.yml的配置值正在被读取,而不是被覆盖。

因此,通过这种方式,您可以在日志回退中配置任意数量的属性

基本上,您正在从日志中引用环境属性(在应用程序属性/ application.yml中定义)。

这里,日志记录.级别.root 是环境属性,它是定义的应用程序.

於德馨
2023-03-14

我创建了一个示例项目,即Spring引导日志回传,它在日志回溯.xml应用程序.yml中指定日志记录配置。

日志级别在日志回传中设置为 WARN.xml如下所示:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <withJansi>true</withJansi>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="WARN">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

有一个处理< code>/hello的控制器方法,带有一个< code>DEBUG和一个< code>INFO日志行。控制器类的日志级别在< code>application.yml文件中设置为< code>DEBUG,如下所示:

logging:
  level:
    io.github.devatherock.demo.controller: DEBUG

我启动了应用程序并点击了< code>/hello控制器endpoint。下面是我看到的日志线:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.7)

08:41:45.051 [http-nio-8080-exec-1] DEBUG i.g.d.d.controller.HelloController - Debug log in sayHello method
08:41:45.052 [http-nio-8080-exec-1] INFO  i.g.d.d.controller.HelloController - Info log in sayHello method

不存在任何应用程序启动日志,因为在日志.xml中,根日志级别设置为 WARN。来自控制器的调试和信息日志行都存在,因为控制器日志级别已在应用程序中设置为 DEBUG.yml。因此,我们可以确认,从 logback.xml 和 application.yml 中应用日志记录配置时不会出现任何问题。

更新1:

日志回溯.xml与 jmx 配置器:

<configuration>
    <jmxConfigurator />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

具有根日志级别的应用程序.yml:

logging:
  level:
    root: WARN
    io.github.devatherock.demo.controller: DEBUG
 类似资料:
  • 目前,我正在与 log4j2.7 springframework 4.3。5; 冬眠5.2。三, 我通过一个xml文件配置log4j 为此,我创建了一些appender,其中一个名为“General”。我需要的是,所有日志都必须转到该appender(包括springframework或hibernate生成的日志),并且后者都不会打印在控制台上(我仍然需要其他类中的其他日志) 我试着写这些日志:

  • 在传统的weblogic容器中部署spring boot web应用程序时,我遇到了一些与日志相关的异常。同一个应用程序在嵌入式tomcat上运行良好,无需对其进行任何更改。 对于weblogic 12 c,我看到了一个例外: ulticaster.java:98Aorg.springframework.boot.context.event.InstanceOf(Aistener.publish)

  • 我的springboot项目中想要异步打印日志到文件,对 logback 做了如下配置 java的controller中使用下面代码打印日志 在日志文件中打印出线程名称,同时在IDEA控制台中也打印线程名称,照理说如果是异步写入的日志这两处的线程名称应该不一样,结果日志文件中输出的结果是 控制台中输出的是 线程ID和名称分别是:86 / http-nio-7076-exec-2 两处的线程名称一样

  • 问题内容: 我正在迁移一个曾经使用log4j进行logback / slf4j的应用程序,并且已经出现问题约2周了……我做了一个小项目来测试logback / slf4j,它的工作效果很好,但是由于某种原因,在应用它时到实际的应用程序,它只是不想工作。 我正在使用JBoss 6.2,将EAR部署到standalone / deployments目录并启动服务器(除了我得到这个异常的事实,这一切都很

  • 我在具有以下logback.xml文件的类路径中有slf4j和logback jar(该文件以前已经成功使用过)。但是,DOCX4J3.0仍然将日志记录信息打印到标准输出。我正在使用NetBeans7.4构建基于docx4j的应用程序。我想将日志级别更改为错误,并将其发送到日志文件中。不知道我错过了什么。任何帮助都是非常感谢的。

  • 我使用的是JBoss7,因为我在这个JBoss中部署的ear很少。StandalOne.xml已经使用以下日志记录配置进行了配置 然后我尝试将logging.properties文件添加到一个ear META-INF中,结果如预期的那样。再次,我想从那个logging.properties文件(我已经将其放置到ear之一的META-INF中)引用一个处理程序(在stanalone.xml中定义的M