场景需求

在使用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, 1 row affected (0.00 sec) MariaDB [(none)]> grant all privileges on elk.* to elk@'192.168.20.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges;
Query OK, 0 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.5.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.45.tar.gz
[root@node1 ~]# cd mysql-connector-java-5.1.45
[root@node1 mysql-connector-java-5.1.45]# mkdir -p /usr/share/logstash/vendor/jar/jdbc
[root@node1 mysql-connector-java-5.1.45]# cp mysql-connector-java-5.1.45-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(128),client_ip varchar(128),status int(4),req_time float(8,3),AgentVersion varchar(512), 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(128) | YES | | NULL | |
| client_ip | varchar(128) | YES | | NULL | |
| status | int(4) | YES | | NULL | |
| req_time | float(8,3) | YES | | NULL | |
| AgentVersion | varchar(512) | YES | | NULL | |
| time | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------------+--------------+------+-----+-------------------+-------+
6 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 => "2" # 间隔时间为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配置文件没有对应上字段,或者数据库权限问题。

 本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/2050360


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

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

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

  2. ELK收集日志到mysql

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

  3. .net core 中使用Log4net输出日志到Mysql数据库中

    .net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...

  4. 今天搞log4net插入错误日志去mysql数据库的时候出现了点问题,已解决。记录下解决方案

    先上图 配置log4net的时候要填这项,可是这个value我不知道啊.....上图里的value是我用下面的方法获取的 MySqlConnection con = new MySqlConnecti ...

  5. spring boot使用log4j2将日志写入mysql数据库

    log4j2官方例子在spring boot中报错而且还是用的是org.apache.commons.dbcp包 我给改了一下使用org.apache.commons.dbcp2包 1.log4j2. ...

  6. Mysql数据库之Binlog日志使用总结

    binlog二进制日志对于mysql数据库的重要性有多大,在此就不多说了.下面根据本人的日常操作经历,并结合网上参考资料,对binlog日志使用做一梳理: 一.binlog日志介绍1)什么是binlo ...

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

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

  8. (转)Mysql数据库之Binlog日志使用总结

    使用mysqlbinlog提取二进制日志 原文:http://blog.csdn.net/leshami/article/details/41962243 MySQL binlog日志记录了MySQL ...

  9. 烂泥:通过binlog恢复mysql数据库

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在上一篇文章,我们讲解了有关mysql的binlog日志的基础知识.这篇文章,我们来讲解如何通过mysql的binlog日志来恢复数据库. 在使用bin ...

随机推荐

  1. 前端面试题解密:经典算法之冒泡算法(ES6版)及优化

    前言 随着前端的飞速发展,前端业务开发给前端工程师提出了更高的要求,因而算法题也越来越高频次的出现在前端面试中.有很多的小伙伴找胡哥苦诉,在前端实际开发中(除了涉及游戏开发方面),算法使用有很多吗?大 ...

  2. 【数据库】MySQL数据库(四)

    一.对数据的操作(详细版) 1.添加数据 1> insert into 表名 (字段1,字段2...) values (值1,值2...); 2> insert into 表名 (字段1, ...

  3. Docker 常用命令(.NET Core示例)

    Docker安装 CentOS Docker 安装 安装 Docker Desktop for Mac.Docker Desktop for Windows 设置docker仓库镜像加速器 迁移Doc ...

  4. String 对象-->split() 方法

    1.定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法: string.split(separator,limit) 参数: separator:可选.字符串或正则表达式,从该参 ...

  5. ln -s 软链接命令

    所有对软链接link_name的操作都是对目录或文件dir_file的操作 ln -s [dir_file] [link_name]

  6. Flex Socket与Java通信实例说明(转)

    Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...

  7. web 应用 为啥 需要用到 tomcat 之类的 部署

    首先了解C/s架构 比如我们常见的QQ,魔兽世界等 这种结构的程序是有服务器来提供服务的,客户端来使用服务 而B/S架构是这样的 它不需要安装客户端,只需要浏览器就可以了 例如QQ农场,这样对客户端的 ...

  8. HttpClient之Get请求和Post请求示例

    HttpClient之Get请求和Post请求示例 博客分类: Java综合   HttpClient的支持在HTTP/1.1规范中定义的所有的HTTP方法:GET, HEAD, POST, PUT, ...

  9. 数据结构和算法(Golang实现)(11)常见数据结构-前言

    常见数据结构及算法 数据结构主要用来组织数据,也作为数据的容器,载体. 各种各样的算法,都需要使用一定的数据结构来组织数据. 常见的典型数据结构有: 链表 栈和队列 树 图 上述可以延伸出各种各样的术 ...

  10. AJ学IOS(02)UI之按钮操作 点击变换 移动 放大缩小 旋转

    不多说,先上图片看效果,AJ分享,必须精品 这个小程序主要实现点击方向键可以让图标上下左右动还有放大缩小以及旋转的功能,点击图片会显示另一张图片. 点击变换 其实用到了按钮的两个状态,再State C ...