您的位置:首页 > 运维架构 > Docker

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

2016-06-11 11:04 603 查看

导读:上篇介绍了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

  2. 安装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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: