场景需求

在使用ELK对日志进行收集的时候,如果需要对数据进行存档,可以考虑使用数据库的方式。为了便于查询,可以同时写一份数据到Elasticsearch 中。

环境准备

CentOS7系统:

  • 192.168.20.60 node1 Kibana ES Logstash Nginx
  • 192.168.20.61 node2 ES MariaDB
    这里使用收集Nginx日志到数据库和ES中作为示例。

配置数据库

安装好数据库后,配置,并授权:

MariaDB [(none)]> create database elk character set utf8 collate utf8_bin;
Query OK, row affected (0.00 sec) MariaDB [(none)]> grant all privileges on elk.* to elk@'192.168.20.%' identified by '';
Query OK, rows affected (0.00 sec) MariaDB [(none)]> flush privileges;
Query OK, rows affected (0.00 sec)

在node1上测试数据库的连接:

[root@node1 ~]# yum install mariadb -y
[root@node1 ~]# mysql -uelk -p123456 -h 192.168.20.61

在node1上安装Logstash, 可以直接从官方下载rpm包安装,Elasticsearch和Kibana的安装跳过,可参考Kibana使用Nginx代理验证和ELK日志管理平台部署简介的前半部分,这里不再赘述。

[root@node1 ~]# yum install logstash-5.6..rpm -y
[root@node1 ~]# systemctl start logstash

配置JDBC数据库驱动

按装logstash的数据库驱动需要先安装gem源:

[root@node1 ~]# yum install gem -y
[root@node1 ~]# gem -v
2.0.14.1
[root@node1 ~]# gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
https://gems.ruby-china.org/ added to sources
https://rubygems.org/ removed from sources
[root@node1 ~]# gem source list
*** CURRENT SOURCES *** https://gems.ruby-china.org/

查看当前已经安装的插件:

[root@node1 ~]# /usr/share/logstash/bin/logstash-plugin list

安装JDBC驱动:

[root@node1 ~]# /usr/share/logstash/bin/logstash-plugin install logstash-output-jdbc
Validating logstash-output-jdbc
Installing logstash-output-jdbc
Installation successful
安装需要等待一段时间,查看是否安装成功: [root@node1 ~]# /usr/share/logstash/bin/logstash-plugin list|grep jdbc
logstash-input-jdbc
logstash-output-jdbc

下载数据库的JDBC驱动:https://dev.mysql.com/downloads/connector/j/ 上传到服务器。驱动的路径必须严格一致,否则连接数据库会报错。

[root@node1 ~]# tar xf mysql-connector-java-5.1..tar.gz
[root@node1 ~]# cd mysql-connector-java-5.1.
[root@node1 mysql-connector-java-5.1.]# mkdir -p /usr/share/logstash/vendor/jar/jdbc
[root@node1 mysql-connector-java-5.1.]# cp mysql-connector-java-5.1.-bin.jar /usr/share/logstash/vendor/jar/jdbc/
[root@node1 ~]# chown -R logstash.logstash /usr/share/logstash/vendor/jar/jdbc/

配置Nginx日志格式

要使日志以指定的表中字段的方式存储,需要将Nginx的日志格式改写为json格式,修改nginx.conf问,将日志格式配置部分替换为:

log_format   access_log_json '{"host":"$http_x_real_ip","client_ip":"$remote_addr","log_time":"$time_iso8601","request":"$request","status":"$status","body_bytes_sent":"$body_bytes_sent","req_time":"$request_time","AgentVersion":"$http_user_agent"}';

access_log  /var/log/nginx/access.log  access_log_json;

检查语法,并重新加载nginx:

nginx -t
nginx -s reload

查看日志中新日志的格式是否是json格式。

创建数据表

我们在数据库中存储数据的时候,没有必要存储日志的所有内容,只需存储我们需要的重要信息即可,可以根据自身的需求进行取舍。

  注意:数据表中需要创建time字段,time的默认值设置为CURRENT_TIMESTAMP.

创建数据表语句(只获取部分数据):

MariaDB [elk]> create table nginx_log(host varchar(),client_ip varchar(),status int(),req_time float(,),AgentVersion varchar(), time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

查看表结构:

MariaDB [elk]> desc nginx_log;
+-------------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+-------+
| host | varchar() | YES | | NULL | |
| client_ip | varchar() | YES | | NULL | |
| status | int() | YES | | NULL | |
| req_time | float(,) | YES | | NULL | |
| AgentVersion | varchar() | YES | | NULL | |
| time | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------------+--------------+------+-----+-------------------+-------+
rows in set (0.00 sec)

配置Logstash将日志写入数据库

创建Logstash的配置文件:
[root@node1 ~]# vim /etc/logstash/conf.d/nginx_log.conf

[root@node1 ~]# cat /etc/logstash/conf.d/nginx_log.conf
input{
file{
path => "/var/log/nginx/access.log" # 指定文件
start_position => "beginning" # 从开始收集
stat_interval => "" # 间隔时间为2s
codec => "json" # 使用json格式
} } output{
elasticsearch {
hosts => ["192.168.20.60:9200"]
index => "nginx-log-%{+YYYY.MM.dd}"
} jdbc{
connection_string => "jdbc:mysql://192.168.20.61/elk?user=elk&password=123456&useUnicode=true&characterEncoding=UTF8"
statement => ["insert into nginx_log(host,client_ip,status,req_time,AgentVersion) VALUES(?,?,?,?,?)", "host","client_ip","status","req_time","AgentVersion"]
}
}

测试文件,查看是否正确:

[root@node1 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_log.conf -t
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
Configuration OK

如果发现配置文件正确,但是日志无法收集,可以使用前台启动的方式,查看日志信息:

[root@node1 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_log.conf 

提示: 如果是使用root操作,使用前台启动的方式也就是以root用户启动,使用系统systemd启动使用的是logstash用户,如果前台启动正常,而后台启动无法收集日志,一般是目录或者文件权限问题。

重启logstash,访问nginx生成日志,并查看Elasticsearch是否已经收集日志:

[root@node1 ~]# systemctl restart logstash

ES中已经自动创建的数据信息:

在Kibana中添加日志信息,用于展示,在输入名称之后,选择使用时间戳的方式,会自动检索出对应的信息:

当Kibana上有数据展示后,我们可以查看数据库,发现数据库中已经存储了日志信息:

[root@node2 elasticsearch-head]# mysql -uroot -p123456 -e "select * from elk.nginx_log;"|head -10
host client_ip status req_time AgentVersion time
- 192.168.20.191 304 0.023 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:33:39
- 192.168.20.191 200 0.042 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:33:39
- 192.168.20.191 200 0.030 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:33:39
- 192.168.20.191 200 0.042 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:34:33
- 192.168.20.191 200 0.380 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:34:33
- 192.168.20.191 200 0.195 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:34:37
- 192.168.20.191 200 0.034 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:34:45
- 192.168.20.191 200 0.016 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:34:59
- 192.168.20.191 200 0.570 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 2017-12-18 11:35:00

将Nginx 日志收集到数据库中就完成了。
如果在收集日志的时候,出现数据库中没有数据,或者有些字段的数据无法获取,故障排除的思路是:
1、查看nginx的日志文件格式是否为json格式,日志输出是否正常。
2、查看es 或者kibana上的日志是否完整,展示是否正常。
3、查看logstash的conf配置文件是否正常,字段标注的个数,名称有无对应上。
4、测试配置文件,刷新日志,如果kibana上展示正常,一般是logstash配置文件没有对应上字段,或者数据库权限问题。

ELK收集日志到mysql的更多相关文章

  1. ELK收集日志到mysql数据库

    场景需求 在使用ELK对日志进行收集的时候,如果需要对数据进行存档,可以考虑使用数据库的方式.为了便于查询,可以同时写一份数据到Elasticsearch 中. 环境准备 CentOS7系统: 192 ...

  2. ELK之收集日志到mysql数据库

    写入数据库的目的是持久化保存重要数据,比如状态码.客户端浏览器版本等,用于后期按月做数据统计等. 环境准备 linux-elk1:10.0.0.22,Kibana ES Logstash Nginx ...

  3. ELK收集Nginx自定义日志格式输出

    1.ELK收集日志的有两种常用的方式: 1.1:不修改源日志格式,简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式) ...

  4. ELK 经典用法—企业自定义日志收集切割和mysql模块

    本文收录在Linux运维企业架构实战系列 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-02-24 11: ...

  5. Kafka+Zookeeper+Filebeat+ELK 搭建日志收集系统

    ELK ELK目前主流的一种日志系统,过多的就不多介绍了 Filebeat收集日志,将收集的日志输出到kafka,避免网络问题丢失信息 kafka接收到日志消息后直接消费到Logstash Logst ...

  6. 14.2-ELK 经典用法—企业自定义日志收集切割和mysql模块

    本文收录在Linux运维企业架构实战系列 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-02-24 11: ...

  7. ELK快速入门(二)通过logstash收集日志

    ELK快速入门二-通过logstash收集日志 说明 这里的环境接着上面的ELK快速入门-基本部署文章继续下面的操作. 收集多个日志文件 1)logstash配置文件编写 [root@linux-el ...

  8. StringBoot整合ELK实现日志收集和搜索自动补全功能(详细图文教程)

    @ 目录 StringBoot整合ELK实现日志收集和搜索自动补全功能(详细图文教程) 一.下载ELK的安装包上传并解压 1.Elasticsearch下载 2.Logstash下载 3.Kibana ...

  9. elk收集分析nginx access日志

    elk收集分析nginx access日志 首先elk的搭建按照这篇文章使用elk+redis搭建nginx日志分析平台说的,使用redis的push和pop做队列,然后有个logstash_inde ...

随机推荐

  1. IDEA注册码分享

    IntelliJ IDEA IDEA 2018 激活注册码分享鼠标连续 三下左键点击 选中,再Ctrl+C 即可复制. CSDN在末尾会带上博客的说明,请删除后,复制到 IDEA中激活. 注册码激活: ...

  2. sas 9.4 sid 64bit 到期时间210804 带有EM

    PROC SETINIT RELEASE='9.4';SITEINFO NAME='NATIONAL PINGTUNG UNI OF SCIENCE&TECH'SITE=12001462 OS ...

  3. Linux基础之常用命令整理(二)

    Linux系统启动流程 bios(找到启动介质) --> mbr(找到boot loader  512B 446引导信息 64分区信息 2 标志位 ) -->grub(选择操作系统或者内核 ...

  4. How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)

    How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)

  5. mongoexport 导出需要授权数据库中的集合 报错 Authentication failed.

    当 mongo数据库启动服务时,使用了 认证机制,在使用mongoexport导出集合文件时,需要用户权限认证. 开启数据库认证服务: mongod --auth 导出mongo中集合文件: mong ...

  6. mysql 表

    关系 create table scores( id int primary key auto_increment, stuid int, subid int, score decimal(5,2) ...

  7. 【MySQL】5.7 复制

    参考:http://www.cnblogs.com/zhoujinyi/p/5704567.html 参考:http://www.innomysql.com/article/25656.html 参考 ...

  8. LeetCode 102. Binary Tree Level Order Traversal 二叉树的层次遍历 C++

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  9. springboot学习随笔(三):Controller参数映射

    接上章内容,我们看看浏览器参数如何映射到我们的Controller层 我们新建UserController和User实 User.java package com.example.main; impo ...

  10. 树莓派3使用openSUSE Ports 42.3 驱动GPIO注意事项

    安装好opensuse 42.3以后,安装wiringPi库. 由于/proc/cpuinfo文件缺少“Hardware”信息,导致出现如下错误: Oops: Unable to determine ...