这三样东西分别作用是:日志收集、索引与搜索、可视化展现

l  logstash

这张架构图可以看出logstash只是collect和index的地方,运行时传入一个.conf文件,配置分三部分:input ,filter,output。

l  redis

redis在这里是作为日志收集与索引之间解耦作用

l  elasticsearch

核心组件,用来搜索。主要特点:real-time,distributed,Highly Available,document oriented,schema free,RESTful

kibana

可视化日志组件,让数据交互变得更容易

部署

需要的组件

Logstash

logstash 10 分钟教程 :http://logstash.net/docs/1.4.2/tutorials/10-minute-walkthrough/

下载最新logstash版本并解压

编辑logstash.conf配置文件

logstash用户说明文档:http://logstash.net/docs/1.4.2/

log4j server配置实例:log4j.conf

input {

log4j {

data_timeout => 5

# mode => "server"

# port => 4560

}

}

filter {

json {

source => "message"

remove_field => ["message","class","file","host","method","path","priority","thread","type","logger_name"]

}

}

output{

#stdout {     codec => json   }

redis {

host => "redis.internal.173"

port => 6379

data_type => "list"

key => "soalog"

}

}

logstash输出elasticsearch配置实例:soalog-es.conf

input {

redis {

host => "redis.internal.173"

port => "6379"

key => "soalog"

data_type => "list"

}

}

filter {

json {

source => "message"

remove_field => ["message","type"]

}

}

output {

elasticsearch {

#host => "es1.internal.173,es2.internal.173,es3.internal.173"

cluster => "soaes"

index => "soa_logs-%{+YYYY.MM.dd}"

}

}

这里filter配置source => message,是把message里json串解析出来,作为索引字段,然后配置remove_field 把不需要字段删除

启动

./logstash -f soalog-es.conf --verbose -l ../soalog-es.log &

./logstash -f log4j.conf --verbose -l ../log4j.log &

Elastcisearch

下载最新版本elasticsearch并解压

bin/elasticsearch -d 后端运行

验证

elasticsearch集群配置:

编辑 config/elasticsearch.yml

#指定你的集群名称,默认是elasticsearch,在使用客户端连接集群模式会用到

cluster.name: soaes

#指定数据存储目录,可以多个磁盘 /path/to/data1,/path/to/data2

path.data: /mnt/hadoop/esdata

#指定日志存储目录

path.logs: /mnt/hadoop/eslogs

#集群主节点列表,执行发现新节点

discovery.zen.ping.unicast.hosts: ["hadoop74", "hadoop75"]

配置es模板 ,可以指定字段是否索引,以及存储类型

在config目录下创建templates目录

增加模板文件template-soalogs.json

{

"template-soalogs" : {

"template" : "soa_logs*",

"settings" : {

"index.number_of_shards" : 5,

"number_of_replicas" : 1,

"index" : {

"store" : {

"compress" : {

"stored" : true,

"tv": true

}

}

}

},

"mappings" : {

"logs" : {

"properties" : {

"providerNode" : {

"index" : "not_analyzed",

"type" : "string"

},

"serviceMethod" : {

"index" : "not_analyzed",

"type" : "string"

},

"appId" : {

"index" : "not_analyzed",

"type" : "string"

},

"status" : {

"type" : "long"

},

"srcAppId" : {

"index" : "not_analyzed",

"type" : "string"

},

"remark" : {

"type" : "string"

},

"serviceVersion" : {

"index" : "not_analyzed",

"type" : "string"

},

"srcServiceVersion" : {

"index" : "not_analyzed",

"type" : "string"

},

"logSide" : {

"type" : "long"

},

"invokeTime" : {

"type" : "long"

},

"@version" : {

"type" : "string"

},

"@timestamp" : {

"format" : "dateOptionalTime",

"type" : "date"

},

"srcServiceInterface" : {

"index" : "not_analyzed",

"type" : "string"

},

"serviceInterface" : {

"index" : "not_analyzed",

"type" : "string"

},

"retryCount" : {

"type" : "long"

},

"traceId" : {

"index" : "not_analyzed",

"type" : "string"

},

"processTime" : {

"type" : "long"

},

"consumerNode" : {

"index" : "not_analyzed",

"type" : "string"

},

"rpcId" : {

"index" : "not_analyzed",

"type" : "string"

},

"srcServiceMethod" : {

"index" : "not_analyzed",

"type" : "string"

}

}

}

}

}

}

kibana

进入elasticsearch目录

bin/plugin -install elasticsearch/kibana 
验证:http://localhost:9200/_plugin/kibana

kibana需要配置查询索引规则

这里index是soa_logs,按天分索引格式需要指定为YYYY-MM-DD

logstash时差8小时问题

logstash在按每天输出到elasticsearch时,因为时区使用utc,造成每天8:00才创建当天索引,而8:00以前数据则输出到昨天的索引

修改logstash/lib/logstash/event.rb 可以解决这个问题

第226行

.withZone(org.joda.time.DateTimeZone::UTC)

修改为

.withZone(org.joda.time.DateTimeZone.getDefault())

log4j.properties配置

#remote logging

log4j.additivity.logstash=false

log4j.logger.logstash=INFO,logstash

log4j.appender.logstash =
org.apache.log4j.net.SocketAppender

log4j.appender.logstash.RemoteHost
= localhost

log4j.appender.logstash.Port =
4560

log4j.appender.logstash.LocationInfo
= false

java日志输出

private static final
org.slf4j.Logger logstash = org.slf4j.LoggerFactory.getLogger("logstash");

logstash.info(JSONObject.toJSONString(rpcLog));

KOPF

elasticsearch集群监控

bin/plugin -install
lmenezes/elasticsearch-kopf

http://localhost:9200/_plugin/kopf


logstash接入tomcat日志示例:

logstash代理端配置tomcat.conf

input {

file {

type=> "usap"

path=>
["/opt/17173/apache-tomcat-7.0.50-8090/logs/catalina.out","/opt/17173/apache-tomcat-7.0.50-8088/logs/catalina.out","/opt/17173/apache-tomcat-7.0.50-8086/logs/catalina.out","/opt/

17173/apache-tomcat-7.0.50-8085/logs/catalina.out","/opt/17173/apache-tomcat-6.0.37-usap-image/logs/catalina.out"]

codec=> multiline {

pattern =>
"(^.+Exception:.+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Caused
by:.+)"

what=> "previous"

}

}

}

filter {

grok {

#match => { "message" =>
"%{COMBINEDAPACHELOG}" }

match => [ "message",
"%{TOMCATLOG}", "message", "%{CATALINALOG}" ]

remove_field => ["message"]

}

}

output {

# stdout{ codec => rubydebug }

redis {host => "redis.internal.173" data_type => "list"
key=> "usap" }

}

修改logstash/patterns/grok-patterns

增加tomcat日志过滤正则

#tomcat log

JAVACLASS (?:[a-zA-Z0-9-]+\:)+[A-Za-z0-9$]+

JAVALOGMESSAGE (.*)

THREAD [A-Za-z0-9\-\[\]]+

# MMM dd, yyyy HH:mm:ss eg: Jan 9, 2014 7:13:13 AM

CATALINA_DATESTAMP %{MONTH} %{MONTHDAY}, 20%{YEAR}
%{HOUR}:?%{MINUTE}(?::?%{SECOND}) (?:AM|PM)

# yyyy-MM-dd HH:mm:ss,SSS ZZZ eg: 2014-01-09
17:32:25,527 -0800

TOMCAT_DATESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY}
%{HOUR}:?%{MINUTE}(?::?%{SECOND}) %{ISO8601_TIMEZONE}

LOG_TIME %{HOUR}:?%{MINUTE}(?::?%{SECOND})

CATALINALOG %{CATALINA_DATESTAMP:timestamp}
%{JAVACLASS:class} %{JAVALOGMESSAGE:logmessage}

#
11:27:51,786 [http-bio-8088-exec-4] DEBUG JsonRpcServer:504 - Invoking
method: getHistory

#TOMCATLOG %{LOG_TIME:timestamp} %{THREAD:thread}
%{LOGLEVEL:level} %{JAVACLASS:class} - %{JAVALOGMESSAGE:logmessage}

TOMCATLOG %{TOMCAT_DATESTAMP:timestamp}
%{LOGLEVEL:level} %{JAVACLASS:class} - %{JAVALOGMESSAGE:logmessage}

启动 tomcat 日志代理:

./logstash -f tomcat.conf --verbose -l
../tomcat.log &

tomcat日志存入es

配置tomcat-es.conf

input {

redis {

host => 'redis.internal.173'

data_type => 'list'

port => "6379"

key => 'usap'

#type => 'redis-input'

#codec => json

}

}

output {

# stdout { codec => rubydebug }

elasticsearch {

#host => "es1.internal.173,es2.internal.173,es3.internal.173"

cluster =>
"soaes"

index =>
"usap-%{+YYYY.MM.dd}"

}

}

启动tomcat日志存储

./logstash -f tomcat-es.conf --verbose -l
../tomcat-es.log &

logstash接入nginx\syslog日志示例

logstash代理端配置nginx.conf

input {

file{

type => "linux-syslog"

path => [ "/var/log/*.log",
"/var/log/messages"]

}

file {

type => "nginx-access"

path =>
"/usr/local/nginx/logs/access.log"

}

file {

type => "nginx-error"

path =>
"/usr/local/nginx/logs/error.log"

}

}

output {

# stdout{ codec => rubydebug }

redis {host => "redis.internal.173" data_type => "list"
key=> "nginx" }

}

启动nginx日志代理

./logstash -f nginx.conf --verbose -l
../nginx.log &

nginx日志存入es

配置nginx-es.conf

input {

redis {

host => 'redis.internal.173'

data_type => 'list'

port => "6379"

key => 'nginx'

#type => 'redis-input'

#codec => json

}

}

filter {

grok {

type => "linux-syslog"

pattern => "%{SYSLOGLINE}"

}

grok {

type => "nginx-access"

pattern => "%{IPORHOST:source_ip} -
%{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] %{IPORHOST:host}
%{QS:request} %{INT:status} %{INT:body_bytes_sent} %{QS:http_refere

r} %{QS:http_user_agent}"

}

}

output {

# stdout { codec => rubydebug }

elasticsearch {

#host => "es1.internal.173,es2.internal.173,es3.internal.173"

cluster =>
"soaes"

index =>
"nginx-%{+YYYY.MM.dd}"

}

}

启动nginx日志存储

./logstash -f nginx-es.conf --verbose -l
../nginx-es.log &

分布式实时日志处理平台ELK的更多相关文章

  1. 分布式实时日志分析解决方案ELK部署架构

    一.概述 ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats.Logstash.Elasticsearch.Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决 ...

  2. ELK实时日志分析平台环境部署--完整记录

    在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...

  3. ELK实时日志分析平台环境部署--完整记录(转)

    在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...

  4. asp.net core结合NLog搭建ELK实时日志分析平台

    0.整体架构 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍ELK 1.说明(此篇ELK采用rpm的方式安装在服务器上)-牛刀小试 承接上一篇文章的内容准备部署ELK来展示asp ...

  5. ELK搭建实时日志分析平台

    ELK搭建实时日志分析平台 导言 ELK由ElasticSearch.Logstash和Kiabana三个开源工具组成,ELK平台可以同时实现日志收集.日志搜索和日志分析的功能.对于生产环境中海量日志 ...

  6. ELK搭建实时日志分析平台之二Logstash和Kibana搭建

    本文书接前回<ELK搭建实时日志分析平台之一ElasticSearch> 文:铁乐与猫 四.安装Logstash logstash是一个数据分析软件,主要目的是分析log日志. 1)下载和 ...

  7. ELK搭建实时日志分析平台之一ElasticSearch搭建

    文:铁乐与猫 系统:CentOS Linux release 7.3.1611 (Core) 注:我这里为测试和实验方便,ELK整套都装在同一台服务器环境中了,生产环境的话,可以分开搭建在不同的服务器 ...

  8. 手把手教你搭建 ELK 实时日志分析平台

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...

  9. 集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack

    大数据之心 关注  0.6 2017.02.22 15:36* 字数 2158 阅读 16457评论 7喜欢 9 简介 X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, ...

随机推荐

  1. FineUI第三天----WebConfig的配置

    这张我们讲讲整个站点Web.config配置文件的配置 Theme: 控件主题,目前支持三种主题风格(blue/gray/access,默认值:blue) Language: 控件语言(en/zh_C ...

  2. 使用 systemd timer 备份数据库

    导读 主要的Linux发行版都改用systemd 来替代 System V启动方式,其中 systemd timer 能替代 crontab 计划任务的大部分功能.本文介绍了用systemd time ...

  3. java笔试三

    请问如何不使用第三个变量交换两个变量值?     例如   int   a=5,b=10:     如何不使用第三个变量交换a,b的值? public class T { public static ...

  4. 大数据之ETL设计详解

    ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直接关接到BI项目的成败.ETL也是一个长期的过程,只有不断的发现问题并解决问题,才能使ETL运行效率更 ...

  5. RabbitMQ消息队列:ACK机制

    每个Consumer可能需要一段时间才能处理完收到的数据.如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了. 因为我们采用no-ack的方式 ...

  6. eclipse内存设置,tomcat内存设置,查看内存大小

    首先可以通过java/jdk/bin下的java visualVM查看eclipse的内存大小和tomcat的内存大小,主要看堆,PermGen两个大小 如图: 多数情况下,eclipse抛出内存溢出 ...

  7. 【leetcode】Best Time to Buy and Sell Stock II

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  8. 34.数组中2个只出现一次的数字[Find two numbers which appear once]

    [题目] 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). [分析] 这是一道很新颖的关于位运算的面试题. ...

  9. iOS 利用constraint实现2个控件上下的空白是相等的

    说的有点乱,先看个图把 其实这个constrant的目的就是控制两个方形的控件上方和下方的空白大小. 对于每一个方块来说,他们上方和下方的空白是相同的.这种“居中”的设计到处可见.一个控件想实现这种居 ...

  10. Java for LeetCode 046 Permutations

    Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the follo ...