Skip to content

集群日志集成

使用EFK采集日志

EFK是Elasticsearch + Filebeat + Kafka构建的实时日志采集框架,用于采集微服务架构下各个服务日志,经过kafka后汇总到Elasticsearch,优点是和应用解耦,在k8s环境里面通过filebeat sidecar采集日志。

image

在气泡鱼平台可以通过添加从容器filebeat来完成日志采集

使用kibana

kibana是Elastic提供的一个分析与可视化平台,可以配合elasticsearch查看实时日志等,

使用longhorn分布式存储采集日志

longhorn是k8s下的分布式存储组件,用于集群中的应用共享存储。

使用longhorn后,需要创建一个多主机读写的PVC, , 所有应用都挂载同一个PVC。 image

使用共享存储后需要注意,pod里面的日志文件格式最好是按照Pod Name来生成,以便适配多实例下日志存储。

  • Java 类扩展日志输出格式
package gauss.boot.based.config;

import ch.qos.logback.core.PropertyDefinerBase;
import lombok.extern.slf4j.Slf4j;

import java.net.InetAddress;
import java.net.UnknownHostException;

@Slf4j
public class LogbackPropertyDefiner extends PropertyDefinerBase {
    @Override
    public String getPropertyValue() {
        InetAddress inetAddress;
        try {
            inetAddress = InetAddress.getLocalHost();
            return inetAddress.getHostName();
        } catch (UnknownHostException e) {
            log.error("LogbackPropertyDefiner#getPropertyValue error:{}", e.getMessage(), e);
        }
        return null;
    }
}
  • 配置日志输出Pod Name/Hostname
xml
    <define class="gauss.boot.based.config.LogbackPropertyDefiner" name="hostname"/>
    <!-- ff文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份) -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/log.${hostname}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
            <!--日志文件最大的大小-->
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>5GB</totalSizeCap>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            </layout>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

使用weblog

Weblog是用于下载和查看日志文件的一个应用,可以和longhorn配合使用 image

此方案弊端

  • 此方案的写入速度远不如本地磁盘,故在大量微服务场景下写入可能会带来性能问题
  • Longhorns的share-manager不是高可用的,当share manager发生宕机时,会导致挂载pv的所有POD重启,故该方案存在一定风险。

使用logd集成

logd是k8s上监控主机目录文件变化,然后同步到log collector中,最终集成到气泡鱼。

Logd采用K8S的daemon-set方式部署在每个工作节点,POD通过host path方式挂载的主机目录,一方面可以保证POD的高可用,另外一方面可以通过Logd对容器的日志进行压缩归档,并且将日志的元数据文件上传至气泡鱼平台,从而实现微服务的日志管理。 image