如何为每个文件写入和控制台写入指定特定的记录器级别

how to specify specific logger level for each of file writing and console writing

我想在我的 logfile.log 中维护一个只有 WARN、ERROR 和 FATAL 的日志,而希望将以上所有信息写入我的 spring 启动应用程序的控制台。我看到当我执行 log.level.root=WARN 时,在 application.properties 文件中它为整个应用程序设置了 WARN 日志级别。我该怎么做才能在控制台中显示所有日志消息,但只在文件中写入高于 WARN 的日志消息?

还有!!!! 有没有办法将级别设置为 INFO 并只在文件中写入某些指定的日志。例如。我想用 INFO 级别跟踪日志中的每个 logins/logouts/filechanges(比如业务逻辑相关),但不想看到在应用程序启动期间弹出的默认 INFO 消息,例如

2018-07-11 10:19:00.554 INFO 11190 --- [ main] c.v.guruji.GurujiApplication : Started GurujiApplication in 10.307 seconds (JVM running for 11.029) .

答案取决于您打算使用哪个实际的日志记录框架, spring boot 与其中大部分集成。

一般来说,如果您选择 "zero configuration",请在 spring 引导配置文件 (application.properties / yaml) 中指定事件级别,并使用以下行:

logging.level.com.myorg=DEBUG
logging.level.root=INFO

如果你想写入文件,或者通常提供更灵活的配置,你需要配置一个叫做 appender 的东西,但这不是一个 spring 引导概念,而是一个日志框架术语。

因此实际配置将取决于特定的日志记录框架,通常,人们将 XML 配置文件(如 logback.xml 如果您使用 logback)放入 src/main/resources 文件夹中,然后它作品。另一个现代选择是 log4j2 框架。

从这个问题看来,您最好先了解如何使用这些框架,然后尝试将它们集成到 spring 引导中,它们中的每一个都非常灵活,并且会提供您正在寻找的解决方案

  • Here 是一个 link 教程,介绍如何通过 spring boot

  • 使用每个框架
  • Here是springboot

  • 官方文档的一个logging章节

好吧,我浏览了一些 logback 文档并且几乎知道该怎么做。

我将此代码发布给像我一样遇到此类问题的其他人,以供快速参考。

但我建议首先阅读适当的文档以清楚地理解它。

logback.xml(用于在单独的文件中记录每个级别的日志并在控制台显示所有内容)

<?xml version="1.0" encoding="UTF-8"?>

<property name="DEV_HOME" value="logs" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </layout>
</appender>



<appender name="FILE-ERROR"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/error.log</file>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/error.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

</appender>



<appender name="FILE-INFO"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/info.log</file>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/info.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

</appender>



<appender name="FILE-FATAL"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/fatal.log</file>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>FATAL</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/fatal.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

</appender>


<appender name="FILE-WARN"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/warn.log</file>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>WARN</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/warn.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

</appender>


<!-- Send logs to both console and file audit -->

<logger name="com.vaidiksanatansewa.guruji" level="fatal"
        additivity="false">

    <appender-ref ref="FILE-FATAL" />
</logger>


<logger name="com.vaidiksanatansewa.guruji" level="error"
        additivity="false">

    <appender-ref ref="FILE-ERROR" />
</logger>


<logger name="com.vaidiksanatansewa.guruji" level="warn"
        additivity="false">

    <appender-ref ref="FILE-WARN" />
</logger>


<logger name="com.vaidiksanatansewa.guruji" level="info"
        additivity="false">

    <appender-ref ref="FILE-INFO" />
</logger>

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