基于Openresty+ELKF的日志平台搭建

没有做日志记录的线上系统,绝对是给系统运维人员留下的坑。尤其是前后端分离的项目,后端的接口日志可以解决对接、测试和运维时的很多问题

基于OpenResty的日志记录

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。

1、OpenResty 安装

在安装OpenResty之前需要先安装好依赖库,OpenResty 依赖库有: perl 5.6.1+, libreadline, libpcre, libssl。我们是CentOS系统,可以直接yum来安装。

[root@VM_0_14_centos]# yum install readline-devel pcre-devel openssl-devel perl

接下来我们在当前CentOS系统上使用新的官方 yum 源

[root@VM_0_14_centos ~]# yum install yum-utils
[root@VM_0_14_centos ~]# yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

安装OpenResty

[root@VM_0_14_centos ~]# yum install openresty
[root@VM_0_14_centos ~]# yum install openresty-resty

这样OpenResty就安装完成了,默认情况下程序会被安装到 /usr/local/openresty 目录

# 可查看安装成功
[root@VM_0_14_centos ~]# cd /usr/local/openresty/bin/
[root@VM_0_14_centos bin]# ./openresty -v
nginx version: openresty/1.13.6.2

# 设置环境变量
[root@VM_0_14_centos sbin]# vi /etc/profile
# 在文件最后面加上 export PATH=${PATH}:/usr/local/openresty/nginx/sbin
[root@VM_0_14_centos sbin]# source /etc/profile

2、记录 Nginx 日志

OpenResty 安装之后就有配置文件及相关的目录的,为了工作目录与安装目录互不干扰,我们单独建一个工作目录。我在根目录下新建了 /openrestyTest/v1/ 的文件夹,并在该目录下创建 logs 和 conf 子目录分别用于存放日志和配置文件。

[root@VM_0_14_centos ~]# mkdir /openrestyTest /openrestyTest/v1 /openrestyTest/v1/conf /openrestyTest/v1/logs
[root@VM_0_14_centos ~]# cd /openrestyTest/v1/conf/
# 创建并编辑 nginx.conf
[root@VM_0_14_centos conf]# vi nginx.conf

在nginx.conf中复制以下文本作为测试

worker_processes  1;        #nginx worker 数量
error_log logs/error.log;   #指定错误日志文件路径
events {
    worker_connections 1024;
}

http {
    server {
        #监听端口,若你的6699端口已经被占用,则需要修改
        listen 6699;
        location / {
            default_type text/html;

            content_by_lua_block {
                ngx.say("HelloWorld")
            }
        }
    }
}

该语法是基于Lua,监听6699端口,输出HelloWorld。我们现在启动Openresty中的Nginx。

# 因为有原安装好的 Nginx 需要指定 openresty/nginx/sbin/nginx
[root@VM_0_14_centos conf]# /usr/local/openresty/nginx/sbin/nginx -p '/openrestyTest/v1/' -c conf/nginx.conf
[root@VM_0_14_centos conf]# curl http://localhost:6699
HelloWorld

访问该端口地址,成功的显示HelloWorld。我提前在本服务器的 Nginx 上部署了一个服务,端口是8181。我的想法是将8182反向代理成8181,将所有通过8080端口的服务的日志信息获取到,并输出到本地的log文件中。

我暂时需要记录的日志内容包括:接口地址,请求内容,请求时间,响应内容,响应时间等。代码写好了,直接替换 /openrestyTest/v1/conf/nginx.conf 的文件内容。

PS:记得防火墙放行8182端口哦

worker_processes  1;
error_log logs/error.log;

events {
    worker_connections 1024;
}

http {
log_format myformat '{"status":"$status","requestTime":"$requestTime","responseTime":"$responseTime","requestURL":"$requestURL","method":"$method","requestContent":"$request_body","responseContent":"$responseContent"}';
access_log logs/test.log myformat;

upstream laravelApi {
    server 127.0.0.1:8181; # 若为外网IP,需放行8181端口
}

server {
        server_name 122.51.159.206;
        listen 8182;
        # 默认读取 body
        lua_need_request_body on;

        location / {
                log_escape_non_ascii off;
                proxy_pass  http://laravelApi;
                set $requestURL '';
                set $method '';
                set $requestTime '';
                set $responseTime '';
                set $responseContent '';

                body_filter_by_lua '
                        ngx.var.requestTime=os.date("%Y-%m-%d %H:%M:%S")

                        ngx.var.requestURL=ngx.var.scheme.."://"..ngx.var.server_name..":"..ngx.var.server_port..ngx.var.request_uri
                        ngx.var.method=ngx.var.request_uri

                        local resp_body = string.sub(ngx.arg[1], 1, 1000)
                        ngx.ctx.buffered = (ngx.ctx.buffered or"") .. resp_body
                        if ngx.arg[2] then
                                ngx.var.responseContent = ngx.ctx.buffered
                        end

                        ngx.var.responseTime=os.date("%Y-%m-%d %H:%M:%S")
                  ';

        }

    }
}

重新启动Nginx,然后进行验证
[root@VM_0_14_centos conf]# /usr/local/openresty/nginx/sbin/nginx -p '/openrestyTest/v1/' -c /openrestyTest/v1/conf/nginx.conf -s reload

现在用POST方式调用接口 http://122.51.159.206:8182/api/v1/version, Request中输入内容:“日志平台(网关层) - 基于Openresty+ELKF+Kafka”。然后查看logs文件夹,发现多了个 test.log 文件,我们查看该文件。就可以发现,当我们每调用一次接口,就会同步的输出接口日志到该文件中。

[root@VM_0_14_centos routes]# tail -500f /openrestyTest/v1/logs/test.log
{"status":"200","requestTime":"2020-05-30 11:12:03","responseTime":"2020-05-30 11:12:03","requestURL":"http://122.51.159.206:8182/api/v1/version","method":"/api/v1/version","requestContent":"content=%E6%97%A5%E5%BF%97%E5%B9%B3%E5%8F%B0%EF%BC%88%E7%BD%91%E5%85%B3%E5%B1%82%EF%BC%89%20-%20%E5%9F%BA%E4%BA%8EOpenresty%2BELKF%2BKafka","responseContent":"Hello Laravel"}

到此为止,提取经过Nginx网关的接口信息,并将其写入日志文件就完成了,所有的接口日志都写入了 test.log 文件中。

E+L+K+F=日志数据处理

ELKF是 Elastic + Logstash + Kibana + FileBeat 四个组件的组合,它们都是Elastic公司推出的开源产品。

在这个系统中,Elastic充当一个搜索引擎,Logstash为日志分析上报系统,FileBeat为日志文件收集系统,Kibana为此系统提供可视化的Web界面。

1、Logstash安装配置

Logstash:日志处理工具,负责日志收集、转换、解析等,并将解析后的日志推送给ElasticSearch进行检索。

[root@VM_0_14_centos bin]# mkdir ~/install && cd ~/install
[root@VM_0_14_centos install]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.rpm
[root@VM_0_14_centos install]# yum localinstall -y logstash-6.2.4.rpm
#Logstash不建议用root启动
# yum安装之后会添加 group add logstash 与 useradd -g logstash logstash
[root@VM_0_14_centos install]# passwd logstash
# 设置密码
[root@VM_0_14_centos install]# mkdir -pv /data/logstash/{data,logs}
[root@VM_0_14_centos install]# chown -R logstash.logstash /data/logstash/

创建并编辑/etc/logstash/conf.d/logstash.conf 文件,配置如下:
[root@VM_0_14_centos install]# vim /etc/logstash/conf.d/logstash.conf

input {
  beats {
    port => 5044
    codec => plain {
          charset => "UTF-8"
    }
  }
}

output {
  elasticsearch {
    hosts => ["122.51.159.206:9200"]
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}
  1. input:是指Logstash的数据来源,启动后使用5044来监听。
  2. output;是Logstash输出数据的位置,我们这里定义为elasticsearch,下文中会说到,用于ELK架构中的日志分析

接下来我们修改/etc/logstash/logstash.yml
[root@VM_0_14_centos install]# vim /etc/logstash/logstash.yml

path.data: /data/logstash/data
path.logs: /data/logstash/logs

现在可以启动Logstash了

[root@VM_0_14_centos install]# su logstash
[logstash@VM_0_14_centos root]$ cd /usr/share/logstash/bin/
[logstash@VM_0_14_centos bin]$ touch admin.out
[logstash@VM_0_14_centos bin]$ nohup ./logstash -f /etc/logstash/conf.d/logstash.conf >admin.out &

2、Filebeat安装配置

Filebeat:轻量型日志采集器,负责采集文件形式的日志,并将采集来的日志推送给logstash进行处理。

[root@VM_0_14_centos ~]# cd ~/install
[root@VM_0_14_centos install]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-x86_64.rpm
[root@VM_0_14_centos install]# yum localinstall -y filebeat-6.2.4-x86_64.rpm

安装完成后,我们开始配置Filebeat来采集日志,并推送给Logstash。

[root@VM_0_14_centos filebeat]# vim /etc/filebeat/filebeat.yml

该filebeat.yml是filebeat的配置文件,里面大部分的模块都被注释了,本次配置放开的代码如下:

filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /openrestyTest/v1/logs/*.log
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 3
output.logstash:
  hosts: ["127.0.0.1:5044"]
  username: "logstash"
  password: "[你设置的logstash的密码]"

监听 /openrestyTest/v1/logs/ 目录下的log文件,采集的日志信息输出到logstash,该hosts等我们安装启动了Logstash再说,先启动Filebeat。

[root@VM_0_14_centos filebeat]# cd /usr/share/filebeat/bin/
[root@VM_0_14_centos bin]# touch admin.out
[root@VM_0_14_centos bin]# nohup ./filebeat -e -c /etc/filebeat/filebeat.yml > admin.out &
# 查看admin.out 日志,是否启动成功

3、Elasticsearch安装配置

ElasticSearch:是一个分布式的RESTful风格的搜索和数据分析引擎,同时还提供了集中存储功能,它主要负责将logstash抓取来的日志数据进行检索、查询、分析等。

[root@VM_0_14_centos ~]# cd ~/install/
[root@VM_0_14_centos install]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.rpm
[root@VM_0_14_centos install]# yum localinstall -y elasticsearch-6.2.4.rpm
#Elasticsearch不建议用root启动
[root@VM_0_14_centos install]# group add elsearch
[root@VM_0_14_centos install]# useradd -g elsearch elsearch
[root@VM_0_14_centos install]# passwd elsearch
# 设置密码
[root@VM_0_14_centos install]# su elsearch
[elsearch@VM_0_14_centos bin]$  mkdir -pv /data/elasticsearch/{data,logs}
[elsearch@VM_0_14_centos bin]$  chown -R elsearch.elsearch /data/elasticsearch/
[elsearch@VM_0_14_centos bin]$  vi /etc/elasticsearch/elasticsearch.yml
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200

如果想要外网能访问,host就必须要设成0.0.0.0。Elasticsearch的启动如下

[root@VM_0_14_centos install]# su elsearch
[elsearch@VM_0_14_centos bin]$ cd /usr/share/elasticsearch/bin/
[elsearch@VM_0_14_centos bin]$ ./elasticsearch -d
# -d 保证后台启动

4、Kibana安装配置

Kibana:Web前端,可以将ElasticSearch检索后的日志转化为各种图表,为用户提供数据可视化支持。

[root@VM_0_14_centos ~]# cd /u01/install/
[root@VM_0_14_centos install]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-x86_64.rpm
[root@VM_0_14_centos install]# yum localinstall -y kibana-6.2.4-x86_64.rpm
[root@VM_0_14_centos install]# vi /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://122.51.159.206:9200"

同样的,host为0.0.0.0,保证外网能访问。Kibana只作为前端展示,日志数据的获取还是借助于elasticsearch,所以这里配置了elasticsearch.url。接着启动Kibana,就能通过页面看到日志的报表。

[root@VM_0_14_centos ~]# cd /usr/share/kibana/bin/
[root@VM_0_14_centos bin]# touch admin.out
[root@VM_0_14_centos bin]# nohup ./kibana >admin.out &

我们在浏览器上访问 http://122.51.159.206:5601/ ,正常来说就能访问Kibana的页面。
首次访问需要 Create index pattern: 填 filebeat-*

如果 ELKF一整套配置没问题,就能在Kibana的页面上实时的看到所有日志信息。

结语

本次操作文档是记录Demo的过程,很多地方并不成熟,例如:如何在 Nginx+Lua 时获取更加全面的日志信息;在Logstash上对日志进行再加工;用好Kibana的图表等等。

参考:日志平台(网关层)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇