微服务日志收集
常用的有两种方式
-
spring cloud sleuth + logstash + es
-
skywalking-apm + es
logstash 配置方案
- 第一步 maven 依赖
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
- 第二步 logstash 配置
logstash 配置有两种方式,一种是直接将logstash 启动为一个tcp服务,通过客户端直接上送到logstash 服务,另外一种是logstash直接去收集日志。从配置上来讲第一种足够简单我们选用第一种,第二种也不难,只需要记住logstash 是一个读取和输出的组件就好了 在logstash 的配置目录下创建如下配置文件 logback.conf
input {
tcp {
mode => "server"
host => "127.0.0.1"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["192.168.0.12:9200"]
index => "logstash-%{+YYYY.MM.dd}"
user => ********
password => **********
}
}
然后切换到bin 目录 执行 ./logstash -f ../config/logback.conf
服务启动即可
- 第三步 logback配置
<springProperty scop="context" name="springAppName" source="spring.application.name"
defaultValue=""/>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:4560</destination>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"service": "${springAppName:-}",
"trace": "%X{traceId:-}",
"span": "%X{spanId:-}",
"pid": "%X{PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"file":"%file",
"line":"%line",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
注意destination 节点中的地址改成logstash 的地址,logstash 可以挂载到nginx 下,配置upstream 做集群部署
- 第四步 多环境中启用
<springProfile name="!dev">
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="async"/>
<appender-ref ref="error"/>
<appender-ref ref="logstash"/>
</root>
</springProfile>
<springProfile name="dev">
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="async"/>
<appender-ref ref="error"/>
<!-- <appender-ref ref="logstash"/>-->
</root>
</springProfile>
skywalking 配置方案(本文使用版本 skywalking v9.0.0,agent v8.10.0)
apm 用新不用旧
- 第一步引入maven 依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.10.0</version>
</dependency>
- 第二步 logback 配置grpc
<!-- skywalking log -->
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
- 第三步 挂载agent
在springboot 启动命令中配置agent
java -javaagent:/home/skywalking-agent/skywalking-agent.jar xxx.jar
- 第四步 更改agent 配置文件
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
- 第五步 skywalking oap 服务配置 /conf/application.yml
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:"skywalking"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:这里改成es地址}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000}
socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000}
numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
user: ${SW_ES_USER:"用户名"}
password: ${SW_ES_PASSWORD:"密码"}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""}
- 第六步 启动skywalking
先执行 oapServiceInit.sh 再执行 oapService.sh 去log目录下查看日志,启动没有问题再执行ui
- 第七步 启动ui webappService.sh
如果要改端口要去webapp 下面更改webapp.yml
结论
复杂性 skywalking > logstash, 易用性和效果推荐skywalking 方案 skywalking 还有链路追踪,其他各种agent,更加通用,并且es的索引已经自动创建好了