上面的所有的日志输出都是同步进行的,肯定会影响性能,所以今天我们总结一下Logback异步日志的输出该如何配置?
###

###
直接贴出logback.xml配置吧
###
```
<?xml version="1.0" encoding="UTF-8"?>
<!-- 对xml的一个扫描是否更新 -->
<!-- 对xml是否进行扫描scan="true"就表示进行扫描 并且是每60s进行扫描一次 debug=false表示不记录logback本身的日志信息 胡军 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- property表示定义全局变量 胡军 -->
<!-- 表示定义日志的输出路径 这里我们设置为了/Users/leasure/project-logs目录下 胡军-->
<property name="LOG_PATH" value="/Users/goldencis/Desktop/GoldencsDev/idns3/idns3.0/idns3.0_java_project/logs"/>
<!-- 这里我们也可以这么设置日志的存放路径 就会在项目的根目录下创建logs等目录来存放日志文件 胡军 -->
<!-- <property name="LOG_PATH" value="${catalina.base}/logs/loggerDemoProject"/>-->
<!-- 设置日志的级别 开发环境一般配置debug即可 还有其他的比如info error ... -->
<property name="LOG_LEVEL" value="debug"/>
<!-- 设置日志保存的时长 这里的30表示的是30天 -->
<property name="LOG_MAX_HISTORY" value="30"/>
<!-- 设置单个日志保存的大小 -->
<property name="LOG_MAX_FILE_SIZE" value="1MB"/>
<!-- 设置整体日志保存的大小 -->
<property name="TOTAL_SIZE_CAP" value="2MB"/>
<!-- 日志所打印出来的格式 [DemoProject] 可以理解为项目名称 %d{yyyy-MM-dd HH:mm:ss.SSS}表示日期 [%-10thread]线程名称 %-5level日志的级别 %logger{50}日志长度 %msg%n日志信息和换行符 -->
<property name="LOG_PATTERN"
value="[DemoProject] %d{yyyy-MM-dd HH:mm:ss.SSS} [%-10thread] %-5level | %logger{50} : %msg%n"/>
<!-- appender可以理解为日志输出的一个机制 比如info日志的输出机制 error日志的输出机制 等等 -->
<!-- CONSOLE -->
<appender name="consoleOutput" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- DEBUG -->
<!-- debugOutput2File表示的是一个自定义的名字 class="ch.qos.logback.core.rolling.RollingFileAppender" 表示以追加的形式记录日志-->
<appender name="debugOutput2File" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 表示的是我们记录日志到什么位置 比如选择了用上面定义好的LOG_PATH目录下的debug.log文件里面来记录日志 -->
<file>${LOG_PATH}/debug.log</file>
<!-- 定义追加策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 当满足maxHistory 和 maxFileSize 这两个条件的时候 会触发文件打包机制 意思就是将在LOG_PATh目录下创建debug目录并将里面的debug.log文件打包成日志格式的.tar.gz格式的压缩包 -->
<fileNamePattern>${LOG_PATH}/debug/debug.log.%d{yyyy-MM-dd}.%i.log.tar.gz</fileNamePattern>
<!-- 表示所有的日志只保存的天数 这里我们设置的是30天 -->
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<!-- 单个文件的大小 -->
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<!-- 日志输出的格式采用上面我们定义好的LOG_PATTERN的格式 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 表示只接收debug模式的日志级别的日志信息 其他的将会被拒绝 -->
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 底下的INFO和ERROR的配置和上面DEBUG的配置是一样的 就不再多讲了 -->
<!-- INFO -->
<appender name="infoOutput2File" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/info/info.log.%d{yyyy-MM-dd}.%i.log.tar.gz</fileNamePattern>
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<!-- 比debug模式多了这个配置 稍后解释 -->
<totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- ERROR -->
<appender name="errorOutput2File" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/error/error.log.%d{yyyy-MM-dd}.%i.log.tar.gz</fileNamePattern>
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- orderInfo -->
<appender name="orderInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/orderInfo.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/orderInfo/orderInfo.log.%d{yyyy-MM-dd}.%i.log.tar.gz</fileNamePattern>
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- productInfo -->
<appender name="productInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/productInfo.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/productInfo/productInfo.log.%d{yyyy-MM-dd}.%i.log.tar.gz</fileNamePattern>
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="orderInfoLogger">
<level value="info"/>
<appender-ref ref="orderInfo"/>
</logger>
<logger name="productInfoLogger">
<level value="info"/>
<appender-ref ref="productInfo"/>
</logger>
<!--配置debug info error的异步appender-->
<appender name="debugOutput2File-ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!--默认不丢失日志,以下配置如果队列80%已满则会丢弃掉TRACT、DEBUG、INFO的日志-->
<discardingThreshold>0</discardingThreshold>
<!--队列深度,该值会影响性能,默认是256-->
<queueSize>256</queueSize>
<!--附加的appender 最多一个-->
<appender-ref ref="debugOutput2File"/>
</appender>
<appender name="infoOutput2File-ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!--默认不丢失日志,以下配置如果队列80%已满则会丢弃掉TRACT、DEBUG、INFO的日志-->
<discardingThreshold>0</discardingThreshold>
<!--队列深度,该值会影响性能,默认是256-->
<queueSize>256</queueSize>
<!--附加的appender 最多一个-->
<appender-ref ref="infoOutput2File"/>
</appender>
<appender name="errorOutput2File-ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!--默认不丢失日志,以下配置如果队列80%已满则会丢弃掉TRACT、DEBUG、INFO的日志-->
<discardingThreshold>0</discardingThreshold>
<!--队列深度,该值会影响性能,默认是256-->
<queueSize>256</queueSize>
<!--附加的appender 最多一个-->
<appender-ref ref="errorOutput2File"/>
</appender>
<!-- 这里我们设置的日志级别是debug 意味着根Logger会记录所有级别的日志消息,
包括DEBUG、INFO、WARN、ERROR等。如果没有这个配置,根Logger的默认级别可能
是INFO或者其他较高级别,那么低于该级别的日志消息将不会被记录在这个特定的配置中,
由于根Logger的级别被设置为DEBUG,所以所有级别的日志消息都会被记录,并且通过各
个appender进行输出。这样可以更灵活地控制日志输出,根据实际需要记录不同级别的日
志信息。 -->
<!-- 如果我设置了level=error 那么info级别的日志就不会被记录到info级别的日志文件当中了吧?
是的,如果你将 <root level="error">,表示根Logger的级别被设置为ERROR,那么只有ERROR级
别的日志消息及以上级别(如ERROR、WARN)才会被记录。INFO级别的日志消息将被忽略,不会被记录到
相应的INFO级别的日志文件中。这样可以控制日志的详细程度,只记录重要的错误信息,减少不必要的日
志输出。 -->
<root level="debug">
<appender-ref ref="debugOutput2File-ASYNC"/>
<appender-ref ref="infoOutput2File-ASYNC"/>
<appender-ref ref="errorOutput2File-ASYNC"/>
<appender-ref ref="consoleOutput"/>
</root>
</configuration>
```
###
其他的还是根以前一样会在指定日志路径下创建对应的日志文件
###
只不过是创建日志文件和写入日志都变成了异步的了而已