title: 统一日志框架设计
date: 2018-07-16 14:28:36
tags:
- 微服务改造
- SpringBoot
- SpringCloud
- 日志
- log
categories: - 微服务
日志的目的
微服务系统中日志是一个重要的模块,日志可以用于排查问题、查询历史、统计分析、监控报警
统一的日志规范
因为微服务是有大量的运行实例的, 虽然可以指定统一的日志规范和目录,然后由开发人员各自去配置和部署,难免容易出错,造成日志的丢失和日志的错乱,所以可以在统一的框架层面来确定好日志配置,这样业务方也不需要去进行修改。
统一日志的核心元素要点
- 日志内容,包括时间、线程号、级别、所在类、具体内容、所在行数、traceid等
- 保存格式,一般来说都要按时间进行切割,最好按日期和小时进行切割,每一天创建一个目录,一个目录下面有24个文件,分别保存24个小时的内容
- 日志保存地址,最好放在linux系统的
/data
目录,因为日志量可能会很大,所以也要时刻关注机器的磁盘空间 - 日志级别,如果有需要,可以根据日志的级别再一次的进行切割,比如把
error
日志独立出来,方便排查问题 - �日志聚合,可以通过elk来把日志进行统一,为了方便后续的统计,同时也可以通过rsyslog把日志集中归属到dfs中,方便统一在终端进行查看
- 然后可以通过不同的环境参数来调整一些参数来满足不同环境的需求
配置方式
- 可以在框架层面增加配置文件
logback-spring.xml
,进行配置的统一,如果有特殊需求,可以业务方自己定义自己的logback-spring.xml
来进行替换
具体内容参考实例(仅供参考)
<?xml version="1.0" encoding="UTF-8"?>
<included>
<springProperty scope="context" name="applicationName" source="spring.application.name"
defaultValue="NONE"/>
<springProperty scope="context" name="syslogHost" source="syslog.host" defaultValue="10.20.210.249"/>
<!-- 开发环境 -->
<springProfile name="local">
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] [%X{traceId}] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
</springProfile>
<!-- 测试环境 ,生产环境 -->
<springProfile name="dev,test,pro">
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] [%X{traceId}] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/logs/${LOG_FILE}/${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>/opt/logs/${LOG_FILE}/%d{yyyy-MM-dd, aux}/${LOG_FILE}_%d{HH}.log</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>1440</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] [%X{traceId}] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/logs/${LOG_FILE}/${LOG_FILE}_err.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/opt/logs/${LOG_FILE}/%d{yyyy-MM-dd, aux}/${LOG_FILE}_%d{HH}_err.log</fileNamePattern>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] [%X{traceId}] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志输出级别 -->
<!--默认只支持udp方式,如需其它方式参考 https://github.com/papertrail/logback-syslog4j-->
<appender name="DEV_SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>${syslogHost}</syslogHost>
<port>514</port>
<throwableExcluded>true</throwableExcluded>
<facility>local4</facility>
<suffixPattern>${applicationName}: [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] [%X{traceId}] %-5level %logger{50} - %msg%n %throwable</suffixPattern>
</appender>
<appender name="TEST_SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>${syslogHost}</syslogHost>
<throwableExcluded>true</throwableExcluded>
<port>514</port>
<facility>local5</facility>
<suffixPattern>${applicationName}: [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] [%X{traceId}] %-5level %logger{50} - %msg%n %throwable</suffixPattern>
</appender>
</springProfile>
</included>