这里实现的是 ELK + Redis 收集 Nginx 的 access.log
我们这里是把各个组件拆开,模拟每个组件是一个集群,每个集群部署在一台机器上
1.Nginx + Logstash agent
2.Redis
3.Logstash indexer
4.ElasticSearch
5.Kibana
daemon off;
master_process off;
error_log logs/error.log;
...
http {
include mime.types;
default_type application/octet-stream;
# 设置nginx日志格式,格式的名称logstash
log_format logstash '$http_host $server_addr $remote_addr [$time_local] "$request" $request_body $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';
# 设置access_log日志输出的文件路径,以及使用的日志格式名称
access_log logs/access.log logstash;
# 以下内容省略
...
}
input {
file {
type => "nginx_access"
path => ["/usr/local/nginx/logs/access.log"]
}
}
output {
redis {
host => "10.211.55.4"
port => 6379
password => admin
data_type => "list"
key => "logstash:redis"
}
}
这里配置就是往redis队列中塞入日志就行,所以input的来源是Nginx的log文件,output的目标设置为redis,这里redis充当MQ消息队列的作用。
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的配置文件就比较麻烦了,需要配置的有三个部分
这里配置就是从redis队列中获取日志,对日志进行相应地过滤,所以input的来源是Redis的list队列,其中的redis配置当然要和logstash agent的配置一致了。output的目标设置为ES搜索引擎的索引,在通过kibana图形界面化的展示ES的查询索引。
# 这里配置Kibana访问ES集群的地址
# The Elasticsearch instance to use for all your queries.
elasticsearch_url: "http://10.211.55.4:9200"
############################################
# 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://www.openssl.org/source/openssl-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"]
# 配置文件包含目录和进程
# 第一段 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
# 构建镜像
$ 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"
############################################
# 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"]
# 配置文件包含目录和进程
# 第一段 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
# 构建镜像
$ docker build -t="birdben/logstash:v1" .
# 执行已经构件好的镜像
$ docker run -p 9999:22 -t -i -v /docker/logstash:/logstash "birdben/logstash:v1"
############################################
# 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"]
# 配置文件包含目录和进程
# 第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。
# 第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:kibana]
command=/software/kibana-4.1.2/bin/kibana
# 构建镜像
$ docker build -t="birdben/kibana:v1" .
# 执行已经构件好的镜像
$ docker run -p 9999:22 -p 5601:5601 -t -i "birdben/kibana:v1"
ES和Redis如之前的文章介绍部署即可
访问Nginx主页,查看access.log中的日志是否按照指定的日志格式输出,之后access.log会被log_agent收集到Redis中,如果log_indexer是可用状态的,就会从Redis中消费掉日志信息,如果log_indexer是不可用的,日志信息就会保存在Redis中。log_indexer从Redis中消费掉日志后,就会在ES中创建相应地索引,最后在Kibana中进行查询显示
参考文章: