logback 的 ConsoleAppender要不要开启
我看到很多项目都开启了,不是说线上环境不能开启控制台打印吗
一般情况下,线上环境不应该开启控制台输出。因为线上环境的日志记录应该以文件或者其他稳定的方式进行,避免在控制台输出带来的性能影响和风险。
但是,线上出现了一些异常情况,需要通过控制台输出来定位问题,这时临时开启控制台输出也是可以的。
所以,关于ConsoleAppender 是否开启。如果项目中不需要控制台输出,那么就不要开启;如果需要临时开启,可以通过动态修改配置文件的方式实现。
输出日志信息写到控制台中去。
常用的子元素:
属性名 | 类型 | 说明 |
---|---|---|
encoder | Encoder | See OutputStreamAppender properties. |
target | String | One of the String values System.out or System.err. The default target is System.out. |
withJansi | boolean | 默认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>
针对该问题,可以通过以下几步来解决:
首先需要了解ConsoleAppender的作用,它是将日志事件附加到控制台,进一步说就是通过System.out或System.err来进行输出,而默认情况下是输出到System.out中,即控制台。
然后需要了解在线上环境中,不应该将日志输出到控制台,因为控制台输出会影响应用程序的性能。
因此,建议在线上环境中关闭控制台输出,在logback的配置文件中将consoleAppender的target属性设置为System.err,即输出到系统错误流中,因为在线上环境中,通常不会使用系统错误流。
可以按照以下方式修改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>
LoggingSystem.getReloadableLogConfigurations().reload();
来重新加载配置文件。
如果还有其他问题或者需要更详细的解决方案,可以进一步根据具体情况进行调整和优化。
有可能是你看到的项目生产环境实际上是替换过这个文件的,也有可能就是项目不规范。
我大概理解你的意思,你是想在开发的时候再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>