SpringBoot用的是2.1.12版本,采用了Spring Cloud Alibaba架构。
网上找的开源微服务框架,但es版本是6.3,与现有版本7.3.2不兼容,没办法,升级。
先说一下以前写日志的方法,根本不规范,有的用slf4j的log.INFO方法,有的用SOPL,这个必须要统一,把所有的System.out.println用log.INFO替换,并且去掉用加号拼字符串的方法,统一用{}优化。
框架对日志的集成还是比较好的,有线程的log-spring-boot-starter工程,也写好了logback-spring.xml,所以没有logback.xml.
需要注意的是logback-spring.xml中设置的日志格式:
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="[${APP_NAME}:${ServerIP}:${ServerPort}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%X{traceId}]){yellow} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
<property name="CONSOLE_LOG_PATTERN_NO_COLOR" value="[${APP_NAME}:${ServerIP}:${ServerPort}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%X{traceId}] [%thread] %logger %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
这个要与后面的logstash一一对应,所以必须要规范!
通常微服务框架中会有多个服务,所以APP_NAME是必须要设置的:
<contextName>${APP_NAME}</contextName>
<springProperty name="APP_NAME" scope="context" source="spring.application.name"/>
<springProperty name="LOG_FILE" scope="context" source="logging.file" defaultValue="../logs/application/${APP_NAME}"/>
LOG_FILE也要与后面的logstash设置对应!
工程的pom.xml就不用说了,都是框架自带的,只是修改了es版本,
<spring-data-elasticsearch.version>3.2.7.RELEASE</spring-data-elasticsearch.version>
<elasticsearch.version>7.3.2</elasticsearch.version>
改完可好,祖国山河一片红,一堆的惊叹号!总共15个错误!
百度了一圈,也没找到太好的解决办法,只好手动改!
利用eclipse的自动修复功能,重新导入Cardinality:
import org.elasticsearch.search.aggregations.metrics.cardinality.Cardinality;
所有的getTotalHits()在7.3.2版中返回的是TotalHits,不再是long,改成long totalCnt = searchHits.getTotalHits().value;
聚合查询中AggregationBuilders获取时区的方法timeZone(DateTimeZone.forOffsetHours(8))修改为timeZone( ZoneId.systemDefault())
解决所有编译错误,可以打包了!
spring boot工程所有内容修改完成,然后配置logstash7.3.2.
直接修改logstash.conf:
input {
file {
path => [ "/home/appuser/logs/application/business-service/*.log",
"/home/appuser/logs/application/user-center/*.log" ]
}
}
filter{
grok {
patterns_dir => "./patterns/logstash.patterns"
match => {"message" => "\[%{NOTSPACE:appName}:%{NOTSPACE:serverIp}:%{NOTSPACE:serverPort}\] %{TIMESTAMP_ISO8601:logTime} %{LOGLEVEL:logLevel} %{WORD:pid} \[%{GREEDYDATA:traceId}\] \[%{NOTSPACE:threadName}\] %{NOTSPACE:classname} %{GREEDYDATA:message}"}
# match => {"message" => "%{TIMESTAMP_ISO8601:logTime} \[%{NOTSPACE:threadName}\] %{LOGLEVEL:logLevel} %{NOTSPACE:classname} - %{GREEDYDATA:message}"}
overwrite => ["message"]
}
}
output {
elasticsearch {
hosts => ["http://192.168.1.241:9200"]
index => "sys-log-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
其中,input对应log文件的位置,filter对应log文件的格式,这个正则可以调了半天才调通的,且调且珍惜。
调试工具在kibana的DevTools中,如果对正则不熟悉,可以参考:https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
output对应es的索引位置,这里没有细分索引,只用了一个,如果要细分,需要与input中的log文件一一对应。
logstash启动:
nohup ./bin/logstash -f config/logstash.conf --http.port 9601 &
然后到kibana中的Discover --- index management中查看索引,如果前端执行了操作,写了日志,马上就会生成索引:
状态正常,可以点进去看看Summary或Mapping。
再到前端查看是否正常返回日志:
第一次看到的时候,感觉还是挺爽的。
如果日志都堆在Message里,一定是写日志时格式没写对,调好logstash.conf里的正则非常重要。
总结一下:
1. logstash服务负责数据采集,格式定义非常重要,调试成功后不要轻易改动,而且要统一,避免多个日志多种格式。可以直接file输入,不是必须使用filebeat。
2. logstash本身也很耗资源,只启动一个即可。
3. es升级后,接口怎么老变啊?更新太快也不是好事,所以前期尽量选用6.8.3以后的版本,采用spring-data访问也是个好办法。
4. logstash+es功能强大,只用来查日志太可惜了。。。