上面的所有的日志输出都是同步进行的,肯定会影响性能,所以今天我们总结一下Logback异步日志的输出该如何配置? ### ![](https://img.kancloud.cn/43/53/4353a508083ba4bed49996a12b1d2dd1_915x866.png) ### 直接贴出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> ``` ### 其他的还是根以前一样会在指定日志路径下创建对应的日志文件 ### 只不过是创建日志文件和写入日志都变成了异步的了而已