前言
最近在项目中对服务器磁盘读写性能做了一个测试,发现服务器性能实在太差了,写入速度一般在13-15M/s的范围,速度太小了
因为这个是新项目来的,想着提高服务性能,减少磁盘io,因此,准备对项目日志进行改造,改为异步写入磁盘
项目框架
基于springcloudalibaba,版本如下:
<spring-boot.version>2.2.10.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
项目中使用logback来打印日志
改造
logback打印日志是同步写入磁盘的,改成异步,直接修改logback.xml配置就可以了。
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration debug="false" scan="true"
scanPeriod="10 seconds">
<property name="LOG_PATH" value="logs"></property>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
</appender>
<appender name="INFO_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/info.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/info-%d{yyyy-MM-dd}.log.%i
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
<totalSizeCap>900MB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<appender name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<File>${LOG_PATH}/error.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/error-%d{yyyy-MM-dd}.log.%i
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
<totalSizeCap>900MB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<!-- logstash设置 -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<param name="Encoding" value="UTF-8"/>
<!-- logstash服务器ip -->
<remoteHost>10.196.201.80</remoteHost>
<!-- logstash tcp 端口-->
<port>4569</port>
<!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类
<!-- encoder is required -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"appname":"rocketcenter"}</customFields> // 索引名
</encoder>
</appender>
<appender name="ASYNC_INFO_LOG" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志,默认值80,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值256 -->
<queueSize>1000</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="INFO_FILE"/>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="ASYNC_INFO_LOG" />
<appender-ref ref="logstash"/>
</root>
<logger name="com.alibaba.nacos.client" level="WARN" />
<logger name="RocketmqClient" level="WARN"/>
<logger name="RocketmqRemoting" level="WARN"/>
</configuration>
只需要增加一个异步的appender就可以了,就不详细说明了,相信通过看注释就可以明白了。