Java 环境部署
java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)Elasticsearch 搭建
curl -O https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.5.1.tar.gz
tar zxvf elasticsearch-1.5.1.tar.gz
cd elasticsearch-1.5.1/
./bin/elasticsearchLogstash 搭建
初步搭建
curl -O http://download.elastic.co/logstash/logstash/logstash-1.5.1.tar.gz
tar zxvf logstash-1.4.2.tar.gzcd logstash-1.5.1现在我们来运行一下:
bin/logstash -e 'input { stdin { } } output { stdout {} }'我们现在可以在命令行下输入一些字符,然后我们将看到logstash的输出内容:
hello world
2015-06-17T01:22:14.405+1000 0.0.0.0 hello world
让我们再试个更有意思的例子。首先我们在命令行下使用CTRL-C命令退出之前运行的Logstash。现在我们重新运行Logstash使用下面的命令:
bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'我们再输入一些字符,这次我们输入"goodnight moon" 将出现:
goodnight moon
{
"message" => "goodnight moon",
"@timestamp" => "2013-11-20T23:48:05.335Z",
"@version" => "1",
"host" => "my-laptop"
}集成Elasticsearch插入数据
input{
file{
type => "all"
path => "/root/tomcat7/logs/catalina.out"
}
file{
type => "access"
path => "/root/tomcat7/logs/access.log"
}
}filter {
multiline {
pattern => "^[^\[]"
what => "previous"
}
if [type] == "access" {
grok {
pattern => "(?<request_info>{.*}$)"
}
json {
source => request_info
}
geoip {
source => "client_ip"
fields => ["country_name", "region_name", "city_name", "real_region_name", "latitude", "longitude"]
remove_field => [ "[geoip][longitude]", "[geoip][latitude]","location","region_name" ]
}
useragent {
source => "user_agent"
prefix => "useragent_"
remove_field => [ "useragent_device", "useragent_major", "useragent_minor" ,"useragent_patch","useragent_os","useragent_o
s_major","useragent_os_minor"]
}
} else if [type] == 'all' {
grok {
pattern => "\[(?<level>\w*).*\] (?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})\s"
}
}
mutate {
remove_field => [ "request_info", "@version", "tags" ]
remove_tag => [ "_grokparsefailure" ]
replace => [ "host", "gd1_prd_yowoo_tomcat4" ]
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
host => "localhost"
index => "logstash-%{type}-%{+YYYY.MM.dd}"
index_type => "%{type}"
}
}
sh logstash -f /root/config/logs.conf
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- all log for console -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %l %M - %m%n" />
</layout>
</appender>
<!-- access log -->
<appender name="access" class="org.apache.log4j.DailyRollingFileAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} - %m%n" />
</layout>
<param name="Append" value="true" />
<param name="File" value="/root/tomcat7/logs/access.log"<span style="font-family: Arial, Helvetica, sans-serif;"> /></span>
<param name="DatePattern" value="'.'yyyy-MM-dd'.'" />
<filter class="com.lives.platform.common.log.AccessLogFilter" />
</appender>
<root>
<priority value="debug" />
<appender-ref ref="console" />
<appender-ref ref="access" />
</root>
</log4j:configuration>在log4j.xml中配置的是日滚的日志文件,logstash指向了生成日志文件的地址,进行监听,日志不会的,我在博客中有一个分类叫日志,进去看哇...
Kibana 搭建
下载Kibana
wget https://download.elastic.co/kibana/kibana/kibana-4.1.0-linux-x64.tar.gz
配置使其读取ES的数据展示
# Kibana is served by a back end server. This controls which port to use.
port: 5601
# The host to bind the server to.
host: "0.0.0.0"
# The Elasticsearch instance to use for all your queries.
elasticsearch_url: "http://localhost:9200"最后进入web页面中查看
下面我们讲解一下logstash中config配置参数
首先我们能看到的是三个input,filter和output,分别是读取日志,过滤分割和输出日志,重点在filter上:
|
1
2
3
4
5
6
7
8
9
10
11
|
[03-Jun-2013
13:15:29] PHP Fatal error: Uncaught exception 'Leb_Exception' in /data1/www/bbs.xman.com/htdocs/framework/xbox/ufo.php:68Stack
trace:#0
/data/www/bbs.xman.com/htdocs/framework/dao/abstract.php(299): Leb_Dao_Pdo->connect(Array, 'read')#1
/data/www/bbs.xman.com/htdocs/framework/dao/pdo.php(108): Leb_Dao_Abstract->initConnect(false)#2
/data/www/bbs.xman.com/htdocs/framework/dao/abstract.php(1123): Leb_Dao_Pdo->query('SELECT * FROM `...')#3
/data/www/bbs.xman.com/htdocs/framework/dao/abstract.php(1217): Leb_Dao_Abstract->select(Array)#4
/data/www/bbs.xman.com/htdocs/framework/model.php(735): Leb_Dao_Abstract->daoSelect(Array, false)#5
/data/www/bbs.xman.com/htdocs/app/configure/model/configure.php(40): Leb_Model->find()#6
/data/www/bbs.xman.com/htdocs/app/search/default.php(131): Configure->get_configure_by_type('news')#7
/data/www/bbs.xman.com/htdocs/framework/dispatcher.php(291): defaultController->indexAction()#8
/data/www/bbs.xman.com/htdocs/framework/dispatcher.php(222): Leb_Di in /data1/www/bbs.xman.com/htdocs/framework/dao/pdo.php on line 68 |
|
1
2
3
4
5
6
7
8
|
filter
{ multiline
{ type
=> "type" #类型,不多说 pattern
=> "pattern,
a regexp" #参数,也可以认为是字符,有点像grep
,如果符合什么字符就交给下面的 what 去处理 negate
=> boolean what
=> "previous" or "next" #这个是符合上面
pattern 的要求后具体怎么处理,处理方法有两种,合并到上面一条日志或者下面的日志 }} |
|
1
2
3
4
5
6
|
filter
{ multiline
{ pattern
=> "^[^\[]" what
=> "previous" } } |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
output
{email
{ match
=> [ "@message", "aaaaa" ] to
=> "storyskya@gmail.com" from
=> "monitor@mib.com.cn" options
=> [ "smtpIporHost", "smtp.mibnet.com", "port", "25", "userName", "monitor@mib.com.cn", "starttls", "true", "password", "opmonitor", "authenticationType", "login" ] subject
=> "123" body
=> '123' via
=> smtp}} |
下面我们介绍grop插件,对日志文件的解析,
grok {
pattern => "\[(?<level>\w*).*\] (?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})\s"
}上面的这个配置,就是将日志文件进行了解析,其中的level/datetime等字段会被抽取出来作为es的搜索键存在,但是整个日志信息是存在于message这个字段中的,其余的键都是为了找寻这条message,但是如果我们想要改变这个message的信息,怎么办呢?这时候就需要用到match这个参数,他可以对匹配成功的正则日志,进行相应的处理,例如
日志文件信息: 55.3.244.1 GET /index.html 15824 0.043
grok {
match => [ "message", "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" ]
}
对其日志进行匹配成功后呢,message信息就变成了这样的,也就是说,对其日志进行了match后呢,只要是满足正则的,那么都会被存在于message中
client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043
在上面的正则中我们看到了有IP,WORD这样的字段,这些是logstash内置的正则表达式,在 https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns 这里都是可以找到的,
我给出一个grop的正则在线测试的网址 http://grokdebug.herokuapp.com/

本文详细介绍了如何利用ELK堆栈(Elasticsearch、Logstash、Kibana)搭建高效日志系统,包括Java环境部署、Elasticsearch与Logstash的搭建、配置文件使用及Kibana配置使其读取ES数据展示,同时解释了logstash中config配置参数、多行日志处理、@message触发命令等功能,并提供了实例演示。
1万+

被折叠的 条评论
为什么被折叠?



