output: 负责将结构化的数据存储进入elasticsearch
1.Nginx + Logstash agent
logstash indexer的配置文件logstash.conf
input {
redis {
host => "10.211.55.4"
port => 6379
password => admin
data_type => "list"
key => "logstash:redis"
}
}
filter {
grok {
match => [
"message", "%{IPORHOST:http_host} %{IPORHOST:server_ip} %{IPORHOST:client_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} (?:%{PATH:baseurl}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" (%{NOTSPACE:params})?|- %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} %{NUMBER:time_backend_response:float}"
]
}
kv {
prefix => "params."
field_split => "&"
source => "params"
}
urldecode {
all_fields => true
}
date {
locale => "en"
match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
}
}
output {
elasticsearch {
embedded => false
codec => "json"
protocol => "http"
host => "10.211.55.4"
port => 9200
index => "birdlogstash"
}
}
注意
logstash indexer的配置文件就比较麻烦了,需要配置的有三个部分
我们这里是把各个组件拆开,模拟每个组件是一个集群,每个集群部署在一台机器上Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能。
5.Kibana这里实现的是 ELK + Redis 收集 Nginx 的 access.log
这里配置就是往redis队列中塞入日志就行,所以input的来源是Nginx的log文件,output的目标设置为redis,这里redis充当MQ消息队列的作用。
input: 负责从redis中获取日志数据
3.Logstash indexerKibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因。
Logstash Indexer:做日志解析,统一成JSON输出给Elasticsearch。
kibana.yml配置文件 # 这里配置Kibana访问ES集群的地址 # The Elasticsearch instance to use for all your queries. elasticsearch_url: "http://10.211.55.4:9200" elk_log_agent的Dockerfile文件 ############################################ # version : birdben/elk_log_agent:v1 # desc : 当前版本安装的elk_log_agent ############################################ # 设置继承自我们创建的 jdk7 镜像 FROM birdben/jdk7:v1 # 下面是一些创建者的基本信息 MAINTAINER birdben (191654006@163.com) # 设置环境变量,所有操作都是非交互式的 ENV DEBIAN_FRONTEND noninteractive # 添加 supervisord 的配置文件,并复制配置文件到对应目录下面。(supervisord.conf文件和Dockerfile文件在同一路径) COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 设置 LOGSTASH 的环境变量,若读者有其他的环境变量需要设置,也可以在这里添加。 ENV LOGSTASH_HOME /software/logstash-1.5.4 # 复制 logstash-1.5.4 文件到镜像中(logstash-1.5.4 文件夹要和Dockerfile文件在同一路径) ADD logstash-1.5.4 /software/logstash-1.5.4 # 解决环境问题,否则logstash无法从log文件中采集日志。具体环境: Logstash 1.5, Ubuntu 14.04, Oracle JDK7 RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /usr/lib/x86_64-linux-gnu/libcrypt.so # 安装升级gcc RUN sudo rm -rf /var/lib/apt/lists/* RUN sudo apt-get update RUN sudo apt-get -y install \ build-essential RUN sudo mkdir -p /software/temp RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz && tar -zxvf nginx-1.8.0.tar.gz -C /software/temp RUN wget http://zlib.net/zlib-1.2.8.tar.gz && tar -zxvf zlib-1.2.8.tar.gz -C /software/temp RUN wget http://1.0.1q.tar.gz && tar -zxvf openssl-1.0.1q.tar.gz -C /software/temp RUN wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz && tar -zxvf pcre-8.37.tar.gz -C /software/temp RUN cd /software/temp/nginx-1.8.0 && sudo ./configure --sbin-path=/software/nginx-1.8.0/nginx --conf-path=/software/nginx-1.8.0/nginx.conf --pid-path=/software/nginx-1.8.0/nginx.pid --with-http_ssl_module --with-pcre=/software/temp/pcre-8.37 --with-zlib=/software/temp/zlib-1.2.8 --with-openssl=/software/temp/openssl-1.0.1q && sudo make && sudo make install # 设置nginx是非daemon启动 RUN echo 'daemon off;' >> /software/nginx-1.8.0/nginx.conf RUN echo 'master_process off;' >> /software/nginx-1.8.0/nginx.conf RUN echo 'error_log logs/error.log;' >> /software/nginx-1.8.0/nginx.conf # 设置 NGINX 的环境变量,若读者有其他的环境变量需要设置,也可以在这里添加。 ENV NGINX_HOME /software/nginx-1.8.0 # 挂载/logstash目录 VOLUME ["/logstash"] # 容器需要开放Nginx 80端口 EXPOSE 80 # 执行supervisord来同时执行多个命令,使用 supervisord 的可执行路径启动服务。 CMD ["/usr/bin/supervisord"] elk_log_agent的supervisord.conf配置文件 # 配置文件包含目录和进程 # 第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。 # 第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。 [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D [program:nginx] command=/software/nginx-1.8.0/nginx -c /software/nginx-1.8.0/nginx.conf [program:logstash] # 指定配置文件时,一定要使用绝对路径,相对路径是不好用的,这个坑已经踩过两次了。。 command=/software/logstash-1.5.4/bin/logstash -f /logstash/logstash_agent.conf elk_log_agent的控制台终端 # 构建镜像 $ docker build -t="birdben/elk_log_agent:v1" . # 执行已经构件好的镜像 $ docker run -p 9999:22 -p 8888:80 -t -i -v /docker/logstash:/logstash "birdben/elk_log_agent:v1" logstash的Dockerfile文件 ############################################ # version : birdben/logstash:v1 # desc : 当前版本安装的logstash ############################################ # 设置继承自我们创建的 jdk7 镜像 FROM birdben/jdk7:v1 # 下面是一些创建者的基本信息 MAINTAINER birdben (191654006@163.com) # 设置环境变量,所有操作都是非交互式的 ENV DEBIAN_FRONTEND noninteractive # 添加 supervisord 的配置文件,并复制配置文件到对应目录下面。(supervisord.conf文件和Dockerfile文件在同一路径) COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 设置 LOGSTASH 的环境变量,若读者有其他的环境变量需要设置,也可以在这里添加。 ENV LOGSTASH_HOME /software/logstash-1.5.4 # 复制 logstash-1.5.4 文件到镜像中(logstash-1.5.4文件夹要和Dockerfile文件在同一路径) ADD logstash-1.5.4 /software/logstash-1.5.4 # 解决环境问题,否则logstash无法从log文件中采集日志。具体环境: Logstash 1.5, Ubuntu 14.04, Oracle JDK7 RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /usr/lib/x86_64-linux-gnu/libcrypt.so # 挂载/logstash目录 VOLUME ["/logstash"] # 执行supervisord来同时执行多个命令,使用 supervisord 的可执行路径启动服务。 CMD ["/usr/bin/supervisord"] logstash的supervisord.conf配置文件 # 配置文件包含目录和进程 # 第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。 # 第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。 [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D [program:logstash] # 指定配置文件时,一定要使用绝对路径,相对路径是不好用的,这个坑已经踩过两次了。。 command=/software/logstash-1.5.4/bin/logstash -f /logstash/logstash.conf logstash的控制台终端 # 构建镜像 $ docker build -t="birdben/logstash:v1" . # 执行已经构件好的镜像 $ docker run -p 9999:22 -t -i -v /docker/logstash:/logstash "birdben/logstash:v1" kibana的Dockerfile文件 ############################################ # version : birdben/kibana:v1 # desc : 当前版本安装的kibana ############################################ # 设置继承自我们创建的 tools 镜像 FROM birdben/tools:v1 # 下面是一些创建者的基本信息 MAINTAINER birdben (191654006@163.com) # 设置环境变量,所有操作都是非交互式的 ENV DEBIAN_FRONTEND noninteractive # 添加 supervisord 的配置文件,并复制配置文件到对应目录下面。(supervisord.conf文件和Dockerfile文件在同一路径) COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 设置 KIBANA 的环境变量,若读者有其他的环境变量需要设置,也可以在这里添加。 ENV KIBANA_HOME /software/kibana-4.1.2 # 复制 kibana-4.1.2 文件到镜像中(kibana-4.1.2文件夹要和Dockerfile文件在同一路径) ADD kibana-4.1.2 /software/kibana-4.1.2 # 容器需要开放Kibana的5601端口 EXPOSE 5601 # 执行supervisord来同时执行多个命令,使用 supervisord 的可执行路径启动服务。 CMD ["/usr/bin/supervisord"] kibana的supervisord.conf配置文件 # 配置文件包含目录和进程 # 第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。 # 第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。 [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D [program:kibana] command=/software/kibana-4.1.2/bin/kibana kibana的控制台终端 # 构建镜像 $ docker build -t="birdben/kibana:v1" . # 执行已经构件好的镜像 $ docker run -p 9999:22 -p 5601:5601 -t -i "birdben/kibana:v1" 注意ES和Redis如之前的文章介绍部署即可
日志收集系统架构简介Logstash Agent/Flume:采集各个业务系统的日志,然后发送给Redis/Kafka消息队列。
4.ElasticSearch验证日志收集