断断续续的看了一周logstash的文档,总算在线上ubuntu搭建起来一个logstash环境了。现在分享一下自己的经验
关于logstash
这玩意现在还算是火爆,依托于elasticsearch这棵大树下,logstash的关注度是非常高的,项目目前来说算是活跃。logstash是一个用于日志收集、分析的系统,架构设计非常灵活,几乎可以满足各种规模的需求。
logstash的逻辑架构
logstash的逻辑架构其实一点都不复杂,经历收集->过滤->输出三个步骤即可简简单单的筛选与管理日志,这简简单单的三个步骤经过符合业务规模的设计之后,就可以满足各种规模的需求了。
logstash的配置文件也很简单
input { }
filter { }
output { }
经过这三个基本配置段,就可以筛选出符合自己要求的日志了。
一些参考资料
说实话,logstash的官方文档实在是太过于简略了,我第一次看完之后完全一抹黑,根本不会写,后来是看了官方推荐的《logstash book》这本书之后才慢慢了解清楚logstash到底怎么回事。因此这本书也是强烈推荐的。不过新版本的书目前还没找到免费的,我当时看的是1.3.4版本的,虽然版本低了些,和现在的logstash有些不太一样(不再使用fatjar打包了,而是直接用bash脚本传参给ruby脚本启动),不过主体功能没多大变化,配合官方文档的一些说明还是可以学习的。
其他可以google一些别人写的配置做参考
我用的业务模型
我的规模其实很小,就收集几个服务器的java程序的日志(log4j输出),推送到中央服务器进行查看而已,必要的时候进行报警。
因此我采用的规模是这样的, 在线上服务器上(input => file, filter => grok, output => tcp),从日志文件中接受输入,使用grok正则过滤器进行提取日志,使用tcp协议直接发送到中央日志服务器上进行收集和展示。
在日志服务器上(input => tcp, output => elasticsearch and email),不增加中央服务器太高的负载,将正则过滤部分放在产品服务器上,中央服务器只是收集过滤过的日志之后做一下索引展示而已,整套架构没有用到redis,因为我的规模量比较少,日志也很少,没必要用redis存储日志,只索引日志用于查询就够了。
我的配置
理清了使用的架构之后,那么写配置就非常容易了。
在产品服务器上配置如下:
input {
file {
type => "my_app"
path => "/var/log/tomcat7/my_app.log"
tags => [ "my_app", "log4j" ]
codec => multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => "previous"
}
}
}
filter {
if [type] == "my_app" {
grok {
match => { "message" =>
"%{TIMESTAMP_ISO8601:date} \[(?<thread_name>.+?)\] (?<log_level>\w+)\s*(?<content>.*)"
}
}
if [log_level] == "ERROR" and "Invalid password for user" not in [content] {
throttle {
after_count => 2
key => "%{content}"
add_tag => "throttled"
}
}
}
}
output {
tcp {
codec => json_lines
host => "center.com"
mode => "client"
port => "tcp_port"
}
}
过滤这样的日志:
date thread_name log_level content
| | | |
2015-01-27 10:37:32,131 [ajp-apr-127.0.0.1-8009-exec-2] INFO mobile.ShortMessageService - {success=true}
2015-01-27 10:41:18,447 [ajp-apr-127.0.0.1-8009-exec-1] ERROR security.UserService - grails.validation.ValidationException: Validation Error(s) occurred during save():
在日志服务器配置如下
input {
tcp {
codec => json_lines
host => "0.0.0.0"
mode => "server"
port => "tcp_port"
}
}
filter {
if ! [tags] or ! [type] {
drop { }
}
}
output {
elasticsearch_http {
host => "localhost"
}
if "throttled" not in [tags] and [type] == "my_app" and [log_level] == "ERROR" and "Invalid password for user" not in [content] ) {
email {
body => "%{message}"
from => "[email protected]"
contenttype => "text/plain; charset=UTF-8"
options => [
"smtpIporHost", "smtp.email.com",
"userName", "login_name",
"password", "password",
"authenticationType", "login"
]
subject => "服务器%{host} %{type}日志发现异常: %{content}"
to => "[email protected]"
}
}
}
这样,一个初步可用的logstash就搭建好了,也能适应我目前的规模了。展示到页面上用的是kibana这个项目,也是elasticsearch旗下的项目,使用和配置都很简单,就不再细说了。
批量部署
配置都测试完毕,就剩下批量部署了,使用的(saltstack)(http://docs.saltstack.com/en/latest/),给logstash添加一个state,也很简单:
cat /srv/salt/logstash.sls
#logstash_repo:
# pkgrepo.managed:
# - name: deb http://packages.elasticsearch.org/logstash/1.4/debian stable main
# - file: /etc/apt/sources.list.d/logstash.list
# - key_url: http://packages.elasticsearch.org/GPG-KEY-elasticsearch
#
#logstash:
# pkg.latest:
# - refresh: True
logstash:
pkg.installed:
- sources:
- logstash: http://myserver/downloads/logstash_1.4.2-1-2c0f5a1_all.deb
logstash-config:
file.recurse:
- name: /etc/logstash/conf.d
- source: salt://servers/logstash/conf.d/
- makedirs: True
logstash-service:
service.running:
- name: logstash
- enable: True
- watch:
- pkg: logstash
- file: logstash-config
注释部分是logstash的官方源,参考这里,不过我这边使用实在是太慢了,不利于批量部署。不得已,只好自己下载deb包放在自己的服务器上,使用pkg.install
中的sources
指令从自己的服务器下载deb包安装了。
最后,使用salt ‘*‘ state.sls logstash
搞定,批量部署完毕,日志都上来了