良好的日志记录可以及时的发现系统中存在的问题,在分布式架构中由于有众多的服务模块,每个模块都有自己的日志管理机制,查询追踪的时候非常麻烦,为此可以结合spring boot的日志管理系统,并引入ELK统一手机日志信息,使整个日志分析工作变得简单。
spring boot 日志
spring boot 使用commons-logging 和slf4j 提供通用接口,日志具体实现则可由开发者自由选择log4j或者logback方案。两种日志方案都可以通过配置使用控制台或者文件输出日志内容。
log back是由log4j 的创始人开发的新一代的日志框架,用于替代log4j。它效率更高,能够适应诸多的运行环境,也是springboot 推荐的日志实现方案。
%d |
时间日期,精确到毫秒 |
%p |
日志级别,error,warn,info,budug或trace |
${PID} |
进程ID |
--- |
分隔符,标识实际日志开始 |
%t |
线程名,方括号括起来(可能会截断控制台输出) |
%c |
Logger名,通常使用源代码的类名 |
%msg |
日志内容 |
%n |
换行 |
在application.properties中通过logging.pattern.console 参数设置控制台输出日志的格式,并通过logging.pattern.file参数设置输出到日志文件的格式。
输出到文件:
默认情况下,spring boot 仅仅将日志输出在控制台。如果需要将日志输出到文件,需要在application.properties 中配置logging.file或者logging.path
logging.file:输出到指定的路径及文件名,可以为相对路径或者绝对路径。
logging.path:输出到指定的路径,默认的文件名为spring.log
日志文件达到10Mb 时,将会新开启一个文件输出,默认的日志输出级别为error,warn和info,可以通过logging.level.*参数修改输出级别。
logging.level.root=WARN
logging.level.org.springframework=DEBUG
logging.level.org.hibernate=EEROR
Logging.level.root |
控制root logger的日志级别为warn以上 |
Logging.level.org.springframework |
控制org.springframework包下的日志级别 |
Logging.level.org.hibernate |
控制org.hibernate包下的日志级别 |
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
日志等级时依次包含关系,设定了等级为warn,则会输出warn,error,fatal 级别的信息。
debug 级别信息可以通过debug=true 参数或在spring boot应用启动时,使用java -jar target/appName.jar --debug 命令开启。
扩展配置:
spring boot 约定了许多参数以减少开发中过多的配置量,对于日志系统也是如此,根据日志实现方案只需创建不同的配置文件便可实现对日志的扩展。
Log back |
Log back-spring.xml,logback-spring.groovy,logback.xml,logback.groovy |
Log4j |
Log4j-spring.properties,log4j-spring.xml,log4j.properties,log4j.xml |
Log4j2 |
Log4j2-spring.xml,log4j2.xml |
JDK(java util logging) |
Logging.properties |
spring boot 官方推荐优先使用带有-spring 的文件名作扩展的日志配置(如使用logback-spring.xml,而不是logback.xml)
configuration: 配置文件树结构中的顶层标签。
scan |
当此属性设置为true时,配置文件如果发生改变,将会被重新加载加载 |
ScanPeriod |
设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,则默认间隔为1分钟 |
Debug |
当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态 |
property:自定义参数
include:引入其他配置文件。
jmxConfigurator:开启logback的JMX支持。
通过命令jconsole打开GUI界面。
logger :控制org.springframework 包下的日志级别,与logging.level.*参数一致。
appender 配置输出日志的方案,可以有多个。
RollingFileAppender |
输出到文件 |
rollingPolicy |
定义日志切分规则,通过TimeBasedRollingPolicy指定每天产生一个日志文件,并且通过maxHistory限定只保留最近30天的日志 |
Filter |
定义输出到日志的级别 |
Encoder |
定义日志格式 |
Consoleappender |
输出到控制台 |
root 必要节点,同故宫appender-ref使配置的appender生效。
分布式日志管理:
分布式架构下的各个应用模块都记录着自身的日志,当这些应用部署在不同的机器上时,想要排查程序的运行日志就变得极为麻烦。ELK(elasticSearch logstash kibana) 提供了统一的日志管理方案来解决这个问题。并且能够很好的支持log4j和log back等日志框架。
elasticSerach:负责存储日志信息,并提供检索服务。
logstash:负责收集应用发送的日志,并存入elastic Search中。
kibana:提供一个可视化界面更为方便的分析日志。
ELK搭建:
elk之间存在一定的版本依赖关系,并且也建议将服务于业务及日志的ElasticSearch区分开来。
安装elasticSerach:
下载地址:https://www.elastic.co/downloads/elasticsearch ,双击C:\tools\elasticSearch\elasticsearch-6.3.2\bin下的elasticsearch.bat,在浏览器通过:http://localhost:9200/进行访问。
{
"name" : "uJtVooK",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "pf0NxHaVRhKXoXZ2wQRwbA",
"version" : {
"number" : "6.3.2",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "053779d",
"build_date" : "2018-07-20T05:20:23.451332Z",
"build_snapshot" : false,
"lucene_version" : "7.3.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
安装Logstash。
下载地址:https://www.elastic.co/cn/downloads/logstash
解压,在C:\tools\logstash\logstash-6.3.2\config新建:log_to_es.conf
input{
tcp{
port => 8082
ssl_enable => false
codec => json{
charset => "UTF-8"
}
}
}
output{
elasticsearch{
index => "logstash-log"
hosts => "127.0.0.1:9200"
}
}
配置完成后在C:\tools\logstash\logstash-6.3.2\bin目录下,cmd运行: .\logstash -f ..\config\log_to_es.conf 启动logstash,
并且通过-f命令指定刚才编写的配置文件。
Input |
开启一个用于收集日志信息的tcp服务 |
Port |
自定义一个用于接受日志的端口号 |
Ssl_enable |
关闭ssl |
Codec |
基于json格式化日志信息,并指定编码格式为utf-8 |
Output |
将收集的tcp服务发送到elasticsearch中 |
Index |
同于存储日志的索引名称 |
Hosts |
Elaticsearch 所在地址 |
安装kibana。
下载地址:https://www.elastic.co/cn/downloads/kibana
解压,进入C:\tools\kibana\kibana-6.3.2-windows-x86_64\config下,修改kibana.yml:
elasticsearch.url:"http://localhost:9200"
进入:C:\tools\kibana\kibana-6.3.2-windows-x86_64\bin,cmd 运行:.\kibana
在浏览器访问:http://localhost:5601
通过index pattern 指定的logstash-* 表示,kibana 将从elasticsearch 中获取以logstash 开头的所有索引。
logback-spring.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false" > <property name="APP_NAME" value="LogDemo"/> <contextName>${APP_NAME}</contextName> <include resource="org/springframework/boot/logging/logback/base.xml"/> <jmxConfigurator/> <logger name="org.springframework" level="INFO" /> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${user.home}/logs/${APP_NAME}.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <Pattern>%d %p ${PID} --- [%t] %c %msg %n</Pattern> </encoder> </appender> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>%d %p ${PID} --- [%t] %c %msg %n</Pattern> <charset>utf8</charset> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> </configuration>
<configuration debug="false"> <include resource="org/springframework/boot/logging/logback/base.xml"/> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashSocketAppender"> <destination>localhost:8082</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <root> <appender-ref ref="LOGSTASH"/> <appender-ref ref="CONSOLE"/> </root> </configuration>
配置中使用LogstashSocketAppender以TCP方式向logstash发送日志信息。
destination:logstash中用于接受日志的地址及端口号
encoder:指定日志编码格式。