一、部署架构
二、服务注册
2.1 日志解析服务
服务名:日志解析服务(Logstash)
服务默认端口:9600
2.2 日志查询服务
服务名:日志查询服务(Kibana)
服务默认端口:5601
三、对接方式
- 通过TCP连接,各服务/应用直接推送日志到logstash服务。
- 各应用/服务的运行日志推送到ES后,分别以各自的appname创建索引,查询时也是在appname的索引模式下进行查找,所以需要各应用/服务推送给logstash时提供appname值。
3.1 java应用
1.引入logstash-logback-encoder包
2.写日志的配置文件中,加入logstash appender
- <destination/>节点,用于配置logstash的ip和端口,部署时各系统从配置中心中动态获取日志解析服务对应的IP和端口;
- <customFields/>节点,用于自定义的数据项内容,其value为json数据,此处配置appname项,用于在elasticsearch中创建日志索引;
- <providers/>节点,设置输出到logstash中的json格式日志:
timestamp,输出日志时间;
level,日志级别(info、warn和error);
message,具体的日志内容;
stack_trace,捕获的异常栈详情内容,代码中log.error(“{}”, e)即可输出异常栈内容;
可以直接复制该文件全部内容到自己的项目的logback文件里面,该文件里面对于的配置项的内容来源于项目的yml文件,如下图:
其中logstash.host是读取配置中心的IP,后面其他变量值都是读取配置中心,如果还没对接配置中心这里就需要改成本地的信息, 图上最下面一列改成本项目的jar包名称。
3.自定义Log Interceptor。
对每个request和response的header增加uid和traceId,同时向log4j.MDC中加入uid和traceId,即可向日志中写入该参数,该项非必须操作。
3.2 .Net应用
1. 这里以NLog组件为例:首先需要引入NLog组件;
2. 修改NLog.config配置文件,加入TCP连接方式;配置如下:
<target xsi:type="Network" name="logstashnetwork" encoding="UTF-8" newLine="true" keepConnection="true" keepAliveTimeSeconds="300" onConnectionOverflow="Block"
address ="tcp://192.168.0.79:9600">
<layout xsi:type="JsonLayout" includeAllProperties="true">
<attribute name="offset" layout="${sequenceid}" />
<attribute name="level" layout="${level}"/>
<attribute name="uid" layout="${identifier}"/>
<attribute name="traceId" layout="${customid}"/>
<attribute name="message" layout="[${longdate}.${sequenceid}] [${identifier}] [${customid}] [${typename}]${newline}${message}" escapeUnicode="false" />
<attribute name="appname" layout="${appname}" />
</layout>
</target>
【备注】:
- 黄色字体部分为需要从配置中心获取日志解析服务对应的配置项,进行动态更新;
- 粉色部分为定义的变量,${identifier} 这里用来表示一级标识;${customid}这里用来表示二级标识;${typename}这里用来表示执行的模块名称;${appname}这里用来表示应用程序的项目标识。
上述配置完毕,在对应的日志级别中进行加入logstashnetwork项即可。