关于logback ConsoleAppender的疑问

logback 的 ConsoleAppender要不要开启
我看到很多项目都开启了,不是说线上环境不能开启控制台打印吗

一般情况下,线上环境不应该开启控制台输出。因为线上环境的日志记录应该以文件或者其他稳定的方式进行,避免在控制台输出带来的性能影响和风险。

但是,线上出现了一些异常情况,需要通过控制台输出来定位问题,这时临时开启控制台输出也是可以的。

所以,关于ConsoleAppender 是否开启。如果项目中不需要控制台输出,那么就不要开启;如果需要临时开启,可以通过动态修改配置文件的方式实现。

  • 这篇博客: 配置logback 日志中的 ConsoleAppender 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 输出日志信息写到控制台中去。

    常用的子元素:

    属性名类型说明
    encoderEncoderSee OutputStreamAppender properties.
    targetStringOne of the String values System.out or System.err. The default target is System.out.
    withJansiboolean默认withJansi 属性设置为false。将Jansi设置为true将激活Jansi库(org.fusesource.jansi),该库支持Windows机器上的ANSI颜色代码 。
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    
  • 以下回答由chatgpt基于相关博客总结生成:

    针对该问题,可以通过以下几步来解决:

    1. 首先需要了解ConsoleAppender的作用,它是将日志事件附加到控制台,进一步说就是通过System.out或System.err来进行输出,而默认情况下是输出到System.out中,即控制台。

    2. 然后需要了解在线上环境中,不应该将日志输出到控制台,因为控制台输出会影响应用程序的性能。

    3. 因此,建议在线上环境中关闭控制台输出,在logback的配置文件中将consoleAppender的target属性设置为System.err,即输出到系统错误流中,因为在线上环境中,通常不会使用系统错误流。

    4. 可以按照以下方式修改logback的配置文件:

    <configuration>
        <!--日志输出器:输出到控制台-->
        <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
            <!--控制输出流对象, 默认为 System.out 是黑色字体, System.err 是红色字体 -->
            <target>System.err</target> <!-- 修改为System.err -->
            <!-- 输出的日志消息格式配置, encoder 默认使用 ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
            <encoder>
                <pattern>%d [%t] [%-5level] %c %M %L %m %n</pattern>
                <!-- 设置字符集 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
        <!-- 根记录器 -->
        <root level="INFO">
            <!--输出记录的日志-->
            <appender-ref ref="consoleAppender"/>
        </root>
    </configuration>
    
    1. 修改完配置文件后,需要重新加载logback配置,具体可根据不同的项目和框架进行操作,例如在Spring Boot项目中,在修改完配置文件后,可以使用
    LoggingSystem.getReloadableLogConfigurations().reload();
    

    来重新加载配置文件。

    1. 执行测试,确保日志不再输出到控制台,而是输出到系统错误流中。

    如果还有其他问题或者需要更详细的解决方案,可以进一步根据具体情况进行调整和优化。

有可能是你看到的项目生产环境实际上是替换过这个文件的,也有可能就是项目不规范。

我大概理解你的意思,你是想在开发的时候再idea 或eclipse 的控制台输出日志。发布到生产或测试的时候不需要打印console。我们公司是通过配置文件区分的。不同的环境的配置文件指定了使用哪种appender 通过配置文件控制一下就OK了。我大概写一个示例你可以理解一下。假设我是以window 操作作为本地开发环境。我肯定是需要打印console。不需要输出日志到file。所以我只需要在logback 配置文件里加个判断就ok

<configuration>

  <if condition='property("os.name").contains("Windows")'>
    <!-- Windows系统 -->
    <then>
      <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>
    </then>
  </if>

  <if condition='!property("os.name").contains("Windows")'>
    <!-- 非Windows系统 -->
    <then>
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/myapp.log</file>
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>logs/myapp-%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
      </appender>
      <root level="INFO">
        <appender-ref ref="FILE" />
      </root>
    </then>
  </if>

</configuration>