ELKF日志搜集系统

优采云 发布时间: 2020-08-26 08:21

  ELKF日志搜集系统

  one:Elasticsearch , Logstash, Kibana ,FileBeat

  序:

  一般我们须要进行日志剖析场景,往往应营运须要, 对应用进行日志剖析,其次也是 为营运推广提供有用的营运数据,使营运推广具有目的性、针对性和直接性,就是营运想知道,用户行为是什么样的,用户更关心的是哪些等等一系列问题;那我们怎么做到呢?通常我们的做法是直接对日志文件进行grep、awk等命令就可以获得想要的信息。但是,随着用户体量的降低,支撑的节点也急剧降低,那么传统方式曝露出好多问题,比如:效率低下,日志量很大怎样归档、文本搜索很慢怎样办、如何多维度查询等等。这就须要我们集中化处理我们的日志,那么怎样对所有服务器上的日志进行搜集汇总?常见解决思路是构建集中式日志搜集系统,将所有节点上的日志统一搜集,管理,访问。

  一个完整的集中式日志系统,需要收录以下几个主要特征:

  采集-能够采集多种来源的日志数据

  传输-能够稳定的把日志数据传输到中央系统

  存储-如何储存日志数据

  分析-可以支持 UI 分析

  警告-能够提供错误报告,监控机制

  ELK提供了一整套解决方案,并且都是开源软件,之间相互配合使用,完美衔接,高效的满足了好多场合的应用。目前主流的一种日志系统。

  ELK是三个开源软件的简写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志搜集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上采集日志后传输给Logstash,官方也推荐此工具。

  Elasticsearch是个开源分布式搜索引擎,提供采集、分析、存储数据三大功能。它的特征有:分布式,零配置,自动发觉,索引手动分片,索引副本机制,restful风格插口,多数据源,自动搜索负载等。

  Logstash 主要是拿来日志的采集、分析、过滤日志的工具,支持大量的数据获取方法。一般工作方式为c/s架构,client端安装在须要搜集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch起来。

  Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志剖析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

  

  这是常见的FELK的*敏*感*词*:

  

  下载安装,二进制包,解压就可用;下面我们看一下,用logstash搜集系统secure日志和nginx日志,首先我们来看一下secure的logstash搜集配置文件:

  input {

file {

type => "system"

path => [ "/var/log/secure" ]

start_position => "beginning"

}

}

filter {

grok {

add_tag => [ "valid" ]

match => [

"message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} password for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}",

"message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: message repeated 2 times: \[ %{WORD:login} password for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}",

"message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} password for invalid user %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}",

"message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} %{WORD:auth_method} for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}"

]

}

if "valid" not in [tags] {

drop { }

}

mutate {

remove_tag => [ "valid" ]

lowercase => [ "login" ]

}

date {

match => [ "syslog_date", "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ]

timezone => "Asia/Shanghai"

}

geoip {

source => "ip"

fields => ["city_name"]

database => "/usr/local/lnmp/logstash/GeoLite2-City.mmdb"

}

}

output {

# stdout { codec => rubydebug }

elasticsearch {

hosts => [ "10.9.117.83:9200", "10.9.165.245:9200", "10.9.13.93:9200" ]

index => "logstash-ssh-login-%{+YYYY.MM.dd}"

}

}

  supervisor管理如下:

  [program:ssh]

stdout_logfile=/data/logs/supervisor/ssh_stdout.log

redirect_stderr=true

environment=JAVA_HOME="/usr/local/lnmp/jdk1.8.0_151"

command=/usr/local/lnmp/logstash/bin/logstash -f /usr/local/lnmp/logstash/config/ssh-login.conf --path.data /usr/local/lnmp/logstash/ssh_data

user=root

autostart=true

autorestart=true

startsecs=3

  查看运行实例:

  # supervisorctl status

nginx RUNNING pid 5489, uptime 22:37:49

ssh RUNNING pid 5490, uptime 22:37:49

  kibana配置:

  

  nginx 配置如下:

  input {

file {

type => "nginx_log"

path => ["/data/logs/wwwlogs/www.log", "/data/logs/wwwlogs/test.log"]

}

}

filter {

mutate {

replace => { "type" => "nginx_access" }

replace => { "host" => "10-19-72-229" }

}

grok {

match => { "message" => "%{NGINXACCESS}" }

overwrite => [ "message" ]

}

date {

match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]

}

geoip {

source => "clientip"

target => "geoip"

database => "/usr/local/lnmp/logstash/GeoLite2-City.mmdb"

add_tag => [ "nginx-geoip" ]

add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]

add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]

}

}

output {

elasticsearch {

hosts => [ "10.9.117.83:9200", "10.9.165.245:9200", "10.9.13.93:9200" ]

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

}

# stdout { codec => rubydebug }

}

  在logstash根下边创建一个patterns目录并创建nginx文件,内容如下:

  NGUSERNAME [a-zA-Z\.\@\-\+_%]+

NGUSER %{NGUSERNAME}

NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}

  supervisor管理:

  [program:nginx]

stdout_logfile=/data/logs/supervisor/nginx_stdout.log

redirect_stderr=true

environment=JAVA_HOME="/usr/local/lnmp/jdk1.8.0_151"

command=/usr/local/lnmp/logstash/bin/logstash -f /usr/local/lnmp/logstash/config/nginx.conf --path.data /usr/local/lnmp/logstash/nginx_data

user=root

autostart=true

autorestart=true

startsecs=3

  kibana配置如下:

  

  ELK近来的几个版本又推出了beats集, 并推荐使用它们!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线