• 使用Docker搭建ELK日志搜集系统(二)


    导读:上篇介绍了ELF/EFK中Elasticsearch、Kibana的配置安装,这篇开始介绍Fluentd做为日志搜集工具的配置安装

    Fluentd是什么?

    • Fluented 是一个开源免费的日志搜集工具,经常代替Logstash(EFK),支持的插件非常多,对docker支持较好
    • Fluentd尽量将数据结构化为JSON:这允许Fluentd统一处理日志数据的所有方面:收集、过滤、缓冲和跨多个源和目的地输出日志(统一日志层)
    • 使用JSON进行下游数据处理要容易得多,因为它有足够的结构,可以在保持灵活模式的同时进行访问

    Fluentd可以搜集那些日志

    使用Fluentd搜集Docker日志配置

    系统安装运行需求和建议:

    • 至少一台独立的linux host centos 7.4,docker 18.06.1-ce+以上版本,建议两台做高可用
    • 生产环境推荐2核4G内存

    安装步骤

    1. 安装docker环境

    https://www.cnblogs.com/yjb007/p/9551878.html

    1. 安装fluentd
    mkdir -p /srv/volume/fluentd/
    cd /srv/volume/fluentd/
    mkdir -p plugins/
    
    #Fluentd的Dockerfile文件
    cat > Dockerfile << 'EOF'
    FROM fluent/fluentd:v1.2.5-debian-onbuild
    
    ENV TZ=Asia/Shanghai
    RUN apt-get update 
            && apt-get -y install tzdata 
            && apt-get -y install curl 
            && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime 
            && echo $TZ > /etc/timezone
    
    RUN buildDeps="sudo make gcc g++ libc-dev ruby-dev" 
     && apt-get update 
     && apt-get install -y --no-install-recommends $buildDeps 
     && sudo gem install 
            fluent-plugin-elasticsearch 
     && SUDO_FORCE_REMOVE=yes 
        apt-get purge -y --auto-remove 
                      -o APT::AutoRemove::RecommendsImportant=false 
                      $buildDeps 
     && rm -rf /var/lib/apt/lists/* 
               /home/fluent/.gem/ruby/2.3.0/cache/*.gem
    
    COPY fluent.conf /fluentd/etc/fluent.conf
    EOF
    
    #Fluentd的配置文件
    cat > fluent.conf << 'EOF'
    <source>
      @type forward
      port 24224
      bind 0.0.0.0
    </source>
    #监听TCP24224端口,转发从这个端口进来的数据,要求进来的数据格式是json格式;数据流走向<filter></filter>
    
    <filter docker.**>
      @type parser
      format json
    # time_format %Y-%m-%dT%H:%M:%S.%L%Z
      key_name log
      reserve_data false
      suppress_parse_error_log true
      ignore_key_not_exist true
      replace_invalid_sequence true
    </filter>
    #如果进来的数据的tag是以dockerk开头的字段,则进行这个对应的数据处理,tag是docker daemon中配置的
    
    <filter docker.nginx.**>
      @type record_transformer
      enable_ruby true
      <record>
        "@timestamp" ${Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L%z")}
      </record>
    </filter>
    #如果进来的数据tag匹配docker.nginx.**,则给这段数据添加一堆key,value值,这里是增加了一个@timestamp字段;原因是nginx自身的access.log日志时间格式不是%Y-%m-%dT%H:%M:%S.%L%z
    #只有%Y-%m-%dT%H:%M:%S.%L%z这样的事件格式kibana才能正确识别
    
    <match docker.**>
      @type elasticsearch
      hosts 10.1.1.225:9200
      user elastic
      password changeme
    
      target_index_key @target_index
      index_name default_index
      type_name fluentd
    
      include_tag_key true
      tag_key DockerName
    
      flush_interval 1s
      request_timeout 15s
      reload_connections false
      reconnect_on_error true
      resurrect_after 5s
    
      buffer_type memory
      num_threads 2
    </match>
    #如果进来的数据tag匹配docker.**,则将数据存储到elasticsearch中,存储到elasticsearch的index以进来的json格式日志中的@target_index的key值作为索引
    #如果没有名称叫@target_index的key,则将数据存储到名称叫default_index的默认索引中
    
    
    <match **>
      @type elasticsearch
      hosts 10.1.1.225:9200
      user elastic
      password changeme
      
      logstash_format true
      logstash_prefix unknown
      logstash_dateformat %Y.%m.%d
      
      time_key_format %Y-%m-%dT%H:%M:%S.%N%z
      
      target_index_key @target_index
      index_name default_index
      type_name fluentd
    
      include_tag_key true
      tag_key DockerName
    
      flush_interval 1s
      request_timeout 15s
      reload_connections false
      reconnect_on_error true
      resurrect_after 5s
    
      buffer_type memory
      num_threads 2
    </match>
    #如果之前的tag都没匹配到,则数据按照这个规则进行存储
    EOF
    
    docker build --no-cache --pull -t fluentd/yujianbo:20180829 ./
    
    docker rm -f pilipa-inside-fluentd
    docker run -d 
            --name pilipa-inside-fluentd 
            --env FLUENTD_CONF=fluent.conf 
            -v /srv/fluentd/fluent.conf:/fluentd/etc/fluent.conf 
            -p 8888:8888 
            -p 24224:24224 
    fluentd/yujianbo:20180829
    

    3.修改docker的配置文件让容器启动后自动把日志转发到我们新建的fluentd服务器

    cat /etc/docker/daemon.json 
    {
        "dns": [
            "114.114.114.114",
            "8.8.8.8"
        ],
        "data-root": "/srv/docker/",
        "hosts": [
            "unix:///var/run/docker.sock"
        ],
        "registry-mirrors": [
            "https://0sr73mco.mirror.aliyuncs.com"
        ],
        "log-driver": "fluentd",
        "log-opts": {"fluentd-address":"10.1.1.229:24224","tag":"docker.{{.Name}}"}
    }
    
    systemctl daemon-reload
    systemctl restart docker
    

    4.新建一个nginx容器测试一下

    cat /root/nginx.conf
    ...
    log_format json 
                    '{"times":"$time_local",'
                    '"@target_index":"nginx",'
                    '"remoteuser":"$remote_user",'
                    '"remoteip":"$remote_addr",'
                    '"bodysize":$body_bytes_sent,'
                    '"requesttime":$request_time,'
                    '"upstreamtime":$upstream_response_time,'
                    '"upstreamhost":"$upstream_addr",'
                    '"http_host":"$host",'
                    '"request":"$request",'
                    '"url":"$uri",'
                    '"xff":"$http_x_forwarded_for",'
                    '"referer":"$http_referer",'
                    '"http_user_agent":"$http_user_agent",'
                    '"status":$status}';
    
    
        access_log  /var/log/nginx/access.log  json;
    ...
    docker run -d --name nginx -p 80:80 -v /root/nginx.conf:/etc/nginx/nginx.conf nginx
    #访问一下curl http://127.0.0.1/就能在kibana上看到我们服务器新产生的日志了
    

    参考资料:

    https://docs.fluentd.org/v1.0/articles/quickstart
    https://docs.fluentd.org/v0.12/articles/install-by-docker

    大漠孤烟直 长河落日圆
  • 相关阅读:
    java前三章总结
    Java入门第二章
    MYSQL 3306设置允许外网访问
    Lnmp Laravel搭建网站需要注意的几点:
    Linux 如何删除网站目录下的user.ini
    Linux Composer的安装
    lnmp切换PHP版本
    解决GitHub的raw.githubusercontent.com无法连接问题
    Linux 7系列默认不能连网的解决办法
    lnmp安装
  • 原文地址:https://www.cnblogs.com/yjb007/p/9553137.html
Copyright © 2020-2023  润新知