logback + logstash + elasticsearch 7.3.2 + kibana ELK安装部署成功,可以实时搜索日志

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功能强大,只用来查日志太可惜了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值