微服务日志收集

397 阅读1分钟

微服务日志收集

常用的有两种方式

  • 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的索引已经自动创建好了

注意:每个版本的skywalking 配置都不一样,一定要去看官方文档