进入这篇文章的人默认是已经搭建好ELK的日志平台

一、概述

1、日志有什么用?

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

2、何为ELK?

ELK 由ElasticSearch 、 Logstash 和 Kibana 三个开源工具组成,是一个开源实时日志分析平台。
Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制, restful 风格接口,多数据源,自动搜索负载等。
Logstash 是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。
kibana 也是一个开源和免费的工具,他 Kibana 可以为 Logstash 和ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

这里写图片描述

因为ElasticSearch、kibana、Logstash的搭建和部署,网上一找一大把,此处略过。下文主要是针对Logstash的解析配置和Kibana的使用说明。

二、Logstash解析日志

1、Logstash结构

这里写图片描述
2、Logstash解析文件(以dubbo日志文件解析为例)

input {
      file {
            path => "F:\log.txt" ## 填写文件的绝对路径
            start_position => "beginning"  ## 从头开始进行收集
            codec => multiline {  ## 通过配置识别日志开头,来保证多行可以被合并
                pattern => "^[\d{2}:\d{2}:\d{2}.\d+]" ## 正则匹配以什么作为日志开头标志
                negate => true
                what => "previous"
            }
        }
    }
    filter {
        grok {## 常用的filter之一,用于对文本日志记录进行json格式化
            match => {
                "message" => [ ## 多个正则格式数据
                    "(?<time>\d{2}:\d{2}:\d{2}.\d+)\s(?<thread>\[[^]]*\]{1})\s(?<level>\w+)\s\s(?<class>[\w|.]*)\s-{1}\s+(?<dubbo>\[[\w|\d|\-]*\]{1})\s(?<date>\[\d+-\d+-\d+\s\d+:\d+:\d+\])\s(?<customer>\d+.\d+.\d+.\d+):\d+\s-\>\s(?<producer>\d+.\d+.\d+.\d+:\d+)\s-\s(?<content>[\s|\S]*)",
                    "(?<time>\d{2}:\d{2}:\d{2}.\d+)\s(?<thread>\[[^]]*\]{1})\s(?<level>\w+)\s(?<content>[\s|\S]*)"
                ]
            }
            remove_field => ["message"]
        }
        date { ## 日期配置
            match => [ "timestamp" , "HH:mm:ss Z" ] 
        }
    }
    output {
        if[level]=="ERROR"{ ## 输出配置,如果当前日志标志为ERROR,则进行下方输出
            stdout { ## 输出到控制端
                codec => rubydebug
            }
            file { ## 输出到文件
                path => "/diskb/bi_error_log/bi_error.log"
            }
        }
        if[level]=="ERROR" or [level]=="INFO" and "monitor" not in [content]{
            elasticsearch { ## 输出到es
                hosts => ["localhost:9200"] ## es地址和端口
                flush_size => 5000
                index => "ebs-%{+YYYY.MM.dd}" ## kibana的检索index
                idle_flush_time => 10
            }
        }
    }

3、Logstash解析mysql数据库

input {
  jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.30.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://ip:3306/schema"
    jdbc_user => "your username"
    jdbc_password => "your password"
    schedule => "* * * * *" ## cron 表达式用以控制数据库记录采集的频率
    statement => "SELECT * from `dubbo_invoke` where date_sub(FROM_UNIXTIME(LEFT(invoke_time,10), '%Y-%m-%d %H:%i:%S'),interval 8 hour)  > :sql_last_value" ## sql_last_value 是logstash的关键字,保证日志的采集不会重复,同时logstash采集日志时间会慢8个小时
    type => "jdbc"
    last_run_metadata_path => "logstash-oradb.lastrun" ## 记录最后一条记录的值,可能是id值,也可能是最后一条记录的日期
  }
}
filter {
    date {
      locale => "zh"
      timezone => "Asia/Shanghai"   
      match => [ "invoke_time", "UNIX_MS" ]
    }
}
output {
  stdout{}
  elasticsearch {
    hosts => ["localhost:9200"]
    flush_size => 5000
    index => "monitor-%{+YYYY.MM.dd}" ## kibana的检索index
    idle_flush_time => 10
  }
}

4、Logstash解析oracle数据库

input {
  jdbc {
    jdbc_driver_library => "ojdbc14.jar"
    jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
    jdbc_connection_string => "jdbc:oracle:thin:@//cidpdev.gz.cvte.cn:1521/pdev_db" ## 此处是oracle12c的协议,oracle12c以下的协议是另外一种。注意:logstash协议前缀必须有jdbc
    jdbc_user => "your username"
    jdbc_password => "your password"
    schedule => "* * * * *"
    statement => "select * from comm_clog_option_log where TO_DATE(TO_CHAR(CRT_TIME,'yyyy-mm-dd HH24:MI:SS'),'yyyy-mm-dd HH24:MI:SS') - interval '8' hour  > :sql_last_value"
    type => "jdbc"
    last_run_metadata_path => "logstash-oradb.lastrun"
  }
}
filter {
    date {
      locale => "zh"
      timezone => "Asia/Shanghai"   
      match => [ "CRT_TIME", "UNIX_MS" ]
    }
}
output {
  stdout{}
  elasticsearch {
    hosts => ["localhost:9200"]
    flush_size => 5000
    index => "cidpdev-%{+YYYY.MM.dd}" ## kibana的检索index
    idle_flush_time => 10
  }
}

三、Kibana的使用

1、创建自己的索引(“Settings”)

这里写图片描述

2、检索自己的数据(“Discover”)
这里写图片描述

3、绘制数据图(“Visualize”)
这里写图片描述

四、那些坑
1、国内网上的配置大多比较旧,google上提问和官网查阅,但是官网例子也太简单;
2、kibana使用中文进行统计分组的解析会单个字
这里写图片描述
3、常用网址
Logstash官方地址:
https://www.elastic.co/guide/en/logstash/current/index.html
ELK中文指南
https://www.gitbook.com/book/chenryn/kibana-guide-cn/details
在线正则校验
http://grokdebug.herokuapp.com/
ELK讨论社区
https://discuss.elastic.co/

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐