简介
我们终于准备好为我们的生产应用程序设置设置集中日志记录了。集中式日志记录是收集和可视化服务器日志的一种很好的方法。通常,设置一个复杂的日志记录系统不如设置可靠的备份和监视那么重要,但在尝试确定应用程序的趋势或问题时,它可能非常有用。
在本教程中,我们将设置ELK堆栈(Elasticearch、Logstash和Kibana),并配置组成我们的应用程序的服务器以将它们的相关日志发送到日志服务器。我们还将设置Logstash filters,它将解析和组织我们的日志,这将使我们能够轻松地搜索和过滤它们,并在Kibana可视化中使用它们。
前提条件
如果您想通过域名访问日志仪表板,请在您的域名下创建一条A记录 ,如logging.example.com
,指向您的** 日志** 服务器的公有IP地址。或者,您也可以通过公共IP地址访问监控仪表板。建议您将日志记录Web服务器设置为使用HTTPS,并通过将其放置在VPN后面来限制对它的访问。
在日志服务器上安装ELK
按照以下教程在您的日志 服务器上设置ELK:如何在Ubuntu 14.04.上安装Elasticearch、Logstash和Kibana4
如果您使用私有域名进行名称解析,请务必遵循生成SSL证书section.]中的选项2
当您到达设置Logstash Forwarder 部分时停止。
在客户端上设置日志堆叠转发
按照ELK教程的Set up Logstash Forwarder section,]在您的客户端服务器(即DB1、App1、App2和Lb1)上设置Logstash Forwarder,一个日志发送器。
完成后,您应该可以通过日志 服务器的公网地址登录Kibana,并查看您每台服务器的syslog。
确定要收集的日志
根据您的具体应用程序和设置,可以将不同的日志收集到ELK堆栈中。在我们的情况下,我们将收集以下日志:
- MySQL慢查询日志(DB1)
- APACHE访问和错误日志(App1和App2)
- HAProxy日志(磅1)
我们之所以选择这些日志,是因为在排除故障或尝试确定趋势时,它们可以提供一些有用的信息。您的服务器可能有您想要收集的其他日志,但这将帮助您开始。
设置MySQL日志
MySQL的慢查询日志通常位于/var/log/mysql/mysql-slow
。它由运行时间足够长的日志组成,因此识别这些查询可以帮助您优化应用程序或对其进行故障排除。
开启MySQL慢查询日志
默认情况下没有启用慢查询日志,所以让我们配置MySQL来记录这些类型的查询。
打开您的MySQL配置文件:
1sudo vi /etc/mysql/my.cnf
找到已注释的LOG_SLOW_QUERIONS
行,并取消其注释,如下所示:
1[label /etc/mysql/my.cnf]
2log_slow_queries = /var/log/mysql/mysql-slow.log
保存并退出。
我们需要重启MySQL才能使更改生效:
1sudo service mysql restart
现在,MySQL会将其长期运行的查询记录到配置中指定的日志文件中。
投递MySQL日志文件
我们必须配置Logstash Forwarder将MySQL慢查询日志发送到我们的日志服务器。
在数据库服务器DB1上,打开Logstash Forwarder配置文件:
1sudo vi /etc/logstash-forwarder.conf
在现有条目下的FILES
部分添加以下内容,以将MySQL慢查询日志作为MySQL-Slow
类型发送到您的Logstash服务器:
1[label logstash-forwarder.conf — MySQL slow query]
2,
3 {
4 "paths": [
5 "/var/log/mysql/mysql-slow.log"
6 ],
7 "fields": { "type": "mysql-slow" }
8 }
保存并退出。这将配置Logstash Forwarder投递MySQL慢查询日志,并将其标记为MySQL-Slow类型日志,稍后将用于过滤。
重新启动Logstash Forwarder以开始传送日志:
1sudo service logstash-forwarder restart
多行输入编解码器
MySQL慢查询日志是多行格式的(即每个条目跨多行),因此必须启用Logstash的多行编解码器才能处理这种类型的日志。
在ELK服务器日志记录 上,打开定义您的Lumberjack输入的配置文件:
1sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
在Lumberjack
输入定义中,添加以下行:
1codec => multiline {
2 pattern => "^# User@Host:"
3 negate => true
4 what => previous
5 }
保存并退出。这会将Logstash配置为在遇到包含指定模式的日志时使用多行日志处理器(即,以)。
接下来,我们将为MySQL日志设置Logstash过滤器。
MySQL日志过滤
在ELK服务器日志记录 上,打开一个新文件,将我们的MySQL日志过滤器添加到Logstash。我们将其命名为11-mysql.con
,因此它将在Logstash输入配置之后读取(在01-lumberjack-input.conf
文件中):
1sudo vi /etc/logstash/conf.d/11-mysql.conf
添加以下筛选器定义:
1[label 11-mysql.conf]
2filter {
3 # Capture user, optional host and optional ip fields
4 # sample log file lines:
5 if [type] == "mysql-slow" {
6 grok {
7 match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ]
8 }
9 # Capture query time, lock time, rows returned and rows examined
10 grok {
11 match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"]
12 }
13 # Capture the time the query happened
14 grok {
15 match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ]
16 }
17 # Extract the time based on the time of the query and not the time the item got logged
18 date {
19 match => [ "timestamp", "UNIX" ]
20 }
21 # Drop the captured timestamp field since it has been moved to the time of the event
22 mutate {
23 remove_field => "timestamp"
24 }
25 }
26}
保存并退出。这将配置Logstash使用match
指令中指定的Grok模式过滤mysql-slow
类型的日志。apache-acces
类型的日志由Logstash提供的Grok模式解析,该模式与默认的Apache日志消息格式匹配,而`apache-error‘类型的日志由编写的Grok过滤器解析,该过滤器与默认的错误日志格式匹配。
要使这些筛选器工作,让我们重新启动Logstash:
1sudo service logstash restart
此时,您需要确保Logstash运行正常,因为配置错误将导致其失败。
您还需要确认Kibana能够查看过滤后的阿帕奇日志。
阿帕奇日志
APACHE的日志通常位于/var/log/apache2
中,分别命名为acces.log
和error.log
。收集这些日志将允许您查看正在访问您的服务器的人员的IP地址、他们请求的内容以及他们正在使用的操作系统和Web浏览器,以及Apache所报告的任何错误消息。
发送阿帕奇日志文件
我们必须配置Logstash Forwarder才能将Apache访问和错误日志发送到我们的日志服务器。
在应用程序服务器App1和App2上,打开Logstash Forwarder配置文件:
1sudo vi /etc/logstash-forwarder.conf
在现有条目下的FILES
部分添加以下内容,以将相应类型的Apache日志发送到您的Logstash服务器:
1[label logstash-forwarder.conf — Apache access and error logs]
2,
3 {
4 "paths": [
5 "/var/log/apache2/access.log"
6 ],
7 "fields": { "type": "apache-access" }
8 },
9 {
10 "paths": [
11 "/var/log/apache2/error.log"
12 ],
13 "fields": { "type": "apache-error" }
14 }
保存并退出。这将配置Logstash Forwarder来发送Apache访问和错误日志,并将它们标记为各自的类型,这将用于过滤日志。
重新启动Logstash Forwarder以开始发送日志:
1sudo service logstash-forwarder restart
现在,所有Apache日志都将具有与HAProxy服务器的私有IP地址匹配的客户端源IP地址,因为HAProxy反向代理是从Internet访问应用程序服务器的唯一方法。要将其更改为显示访问您站点的实际用户的源IP,我们可以修改默认的Apache日志格式,以使用HAProxy发送的X-Forwarded-For
头。
打开您的Apache配置文件(apache2.conf):
1sudo vi /etc/apache2/apache2.conf
找到如下所示的行:
1[Label apache2.conf — Original "combined" LogFormat]
2LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
将**%h** 替换为** %{X-Forwarded-For}i** ,如下所示:
1[Label apache2.conf — Updated "combined" LogFormat]
2LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
保存并退出。这会将Apache访问日志配置为包括实际用户的源IP地址,而不是HAProxy服务器的专用IP地址。
重新启动Apache以使日志更改生效:
1sudo service apache2 restart
现在,我们准备向Logstash添加Apache日志筛选器。
阿帕奇日志过滤器
在ELK服务器Logging 上,打开一个新文件,将我们的Apache日志过滤器添加到Logstash。我们将其命名为12-apache.con
,因此它将在Logstash输入配置之后读取(在01-lumberjack-input.conf
文件中):
1sudo vi /etc/logstash/conf.d/12-apache.conf
添加以下筛选器定义:
1[label 12-apache.conf]
2filter {
3 if [type] == "apache-access" {
4 grok {
5 match => { "message" => "%{COMBINEDAPACHELOG}" }
6 }
7 }
8}
9filter {
10 if [type] == "apache-error" {
11 grok {
12 match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" }
13 }
14 }
15}
保存并退出。这将配置Logstash以过滤apache-access
和apache-error
类型的日志,并使用相应的match
指令中指定的Grok模式。apache-access
类型的日志由Logstash提供的Grok模式解析,该模式与默认的Apache日志消息格式匹配,而apache-error
类型的日志由Grok过滤器解析,该过滤器被编写为与默认的错误日志格式匹配。
要使这些筛选器工作,让我们重新启动Logstash:
1sudo service logstash restart
此时,您需要确保Logstash运行正常,因为配置错误将导致其失败。您还需要确认Kibana能够查看过滤后的阿帕奇日志。
HA代理日志
HAProxy的日志通常位于/var/log/haproxy.log
中。收集这些日志将允许您查看正在访问您的负载均衡器的用户的IP地址、他们正在请求什么、哪个应用程序服务器正在为他们的请求提供服务,以及有关连接的各种其他详细信息。
发送HAProxy日志文件
我们必须配置Logstash Forwarder以发送HAProxy日志。
在您的HAProxy服务器lb1 上,打开Logstash Forwarder配置文件:
1sudo vi /etc/logstash-forwarder.conf
在现有条目下的FILES
部分添加以下内容,以将HAProxy日志作为haproxy-log
类型发送到您的Logstash服务器:
1[label logstash-forwarder.conf — HAProxy logs]
2,
3 {
4 "paths": [
5 "/var/log/haproxy.log"
6 ],
7 "fields": { "type": "haproxy-log" }
8 }
保存并退出。这将配置Logstash Forwarder投递HAProxy日志,并将其标记为haproxy-log
,用于过滤日志。
重新启动Logstash Forwarder以开始传送日志:
1sudo service logstash-forwarder restart
HAProxy日志过滤
在ELK服务器Logging 上,打开一个新文件,将我们的HAProxy日志过滤器添加到Logstash。我们将其命名为13-haproxy.con
,因此它将在Logstash输入配置之后读取(在01-lumberjack-input.conf
文件中):
1sudo vi /etc/logstash/conf.d/13-haproxy.conf
添加以下筛选器定义:
1filter {
2 if [type] == "haproxy-log" {
3 grok {
4 match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))" }
5 }
6 }
7}
保存并退出。这将配置Logstash使用相应的match
指令中指定的Grok模式过滤haproxy-log
类型的日志。与默认HAProxy日志消息格式匹配的Logstash提供的Grok模式正在解析haproxy-log
类型的日志。
要使这些筛选器工作,让我们重新启动Logstash:
1sudo service logstash restart
此时,您需要确保Logstash正常运行,因为配置错误会导致它失败。
设置Kibana可视化
现在您正在一个中心位置收集日志,您可以开始使用Kibana来可视化它们。本教程可以帮助您入门:如何使用Kibana仪表板和Visualizations.
一旦您对Kibana感到满意,请尝试使用本教程以有趣的方式可视化您的用户:How to Map User Location with GeoIP and ELK.
结论
恭喜!您已经完成了生产Web应用程序安装教程系列。如果您遵循了所有教程,您应该有一个类似于我们在概述教程中描述的设置(使用私有DNS和远程备份):
也就是说,您应该拥有一个具有分离组件的工作应用程序,该应用程序受备份、监视和集中日志记录组件的支持。一定要测试您的应用程序,并确保所有组件都能按预期工作。