2-ELK日志内容优化篇

正则表达式基础简介

发送整行日志存在的问题

  1. 整行message一般我们并不关心
  2. 需要对message进行段拆分,需要用到正则表达式

正则表达式

  1. 使用给定好的符号去表示某个含义
  2. 例如.代表任意字符
  3. 正则符号当普通符号使用需要加反斜杠

正则的发展

  1. 普通正则表达式
  2. 扩展正则表达式

普通正则表达式

  .  匹配任意一个字符(非换行符)  
  *  匹配前一个字符出现0次或者多次 
  [abc]  中括号内任意一个字符
  [^abc] 非中括号内的字符
  [0-9]   表示一个数字
  [a-z]    小写字母
  [A-Z]   大写字母
  [a-zA-Z]   所有字母
  [a-zA-Z0-9] 所有字母+数字
  [^0-9]  非数字
  ^xx    以xx开头
  xx$    以xx结尾
  \d   任何一个数字
  \s   任何一个空白字符

扩展正则表达式,在普通正则符号再进行了扩展

  ? 前面字符出现0或者1次 
  + 前面字符出现1或者多次
  {n}  前面字符匹配n次
  {a,b}  前面字符匹配a到b次
  {,b}   前面字符匹配0次到b次
  {a,}   前面字符匹配a或a+次
  (string1|string2) string1或string2

简单提取IP

  1. 114.114.114.114 255.277.277.277
  2. 1-3个数字.1-3个数字.1-3个数字.1-3个数字
  3. [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
  4. 多提取

Logstash正则分析Nginx日志

Nginx日志说明

192.168.1.1 - - [02/May/2023:22:51:08 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"

  1. 访问IP地址
  2. 访问时间
  3. 请求方式(GET/POST)
  4. 请求URL
  5. 状态码
  6. 响应body大小
  7. Referer
  8. User Agent

Logstash正则提取日志

  1. 需要懂得正则,Logstash支持普通正则和扩展正则
  2. 需要了解Grok,利用Kibana的Grok学习Logstash正则提取日志

Grok提取Nginx日志

  1. Grok使用(?<xxx>提取内容)来提取xxx字段
  2. 提取客户端IP: (?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
  3. 提取时间: \[(?<requesttime>[^ ]+ \+[0-9]+)\]
(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^             ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"
图形用户界面, 文本, 应用程序, 电子邮件

描述已自动生成

提取Tomcat等日志使用类似的方法

Logstash正则提取Nginx日志

/usr/local/logstash-6.6.0/config/logstash.conf

input {
  file {
    path => "/usr/local/nginx/logs/access.log"
  }
}
filter {
    grok {
        match => {
            "message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"'
        } 
    }
}
output {
  elasticsearch {
    hosts => ["http://192.168.1.10:9200"]
  }
}

重载logstash

kill -1 $(ps aux | grep logstash | grep -v grep | awk '{print $2}' | head -1)

访问几次nginx网页

图形用户界面, 文本, 应用程序, 电子邮件

描述已自动生成
图形用户界面, 文本, 应用程序

描述已自动生成

注意正则提取失败的情况

echo "1111" >> /usr/local/nginx/logs/access.log

Logstash正则提取出错就不输出到ES

图形用户界面, 文本, 应用程序

描述已自动生成
output{
    if "_grokparsefailure" not in [tags] and "_dateparsefailure" not in [tags] {
        elasticsearch {
            hosts => ["http://192.168.1.10:9200"]
        }
    }
}

Logstash去除不需要的字段

去除字段注意

  1. 只能去除_source里的
  2. 非_source里的去除不了

Logstash配置去除不需要的字段 /usr/local/logstash-6.6.0/config/logstash.conf

filter {
    grok {
        match => {
            "message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"'
        }
        remove_field => ["message","@version","path"]
    }
}
图形用户界面, 文本, 应用程序, 电子邮件

描述已自动生成

"message","@version","path"这三个字段已经不显示了

去除字段优势:

  1. 减小ES数据库的大小
  2. 提升搜索效率

ELK覆盖时间轴和全量分析

默认ELK时间轴

  1. 以发送日志的时间为准
  2. 而Nginx上本身记录着用户的访问时间
  3. 分析Nginx上的日志以用户的访问时间为准,而不以发送日志的时间
图形用户界面, 文本, 应用程序, 电子邮件

描述已自动生成

Logstash全量分析所有Nginx日志,如果延迟过高,nginx的日志和kibana上显示的出入会非常大,所以用requesttime去覆盖timestamp

input {
  file {
    path => "/usr/local/nginx/logs/access.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

Logstash的filter里面加入配置24/Feb/2019:21:08:34 +0800

filter {
    grok {
        match => {
            "message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "[^"]+" "(?<ua>[^"]+)"'
        }
        remove_field => ["message","@version","path"]
    }
    date {
        match => ["requesttime", "dd/MMM/yyyy:HH:mm:ss Z"]
        target => "@timestamp"
    }
}
图形用户界面, 文本, 应用程序, 电子邮件

描述已自动生成

统计Nginx的请求和网页显示进行对比

cat /usr/local/nginx/logs/access.log |awk '{print $4}'|cut -b 1-19|sort |uniq -c

不同的时间格式,覆盖的时候格式要对应

  1. 20/Feb/2019:14:50:06 -> dd/MMM/yyyy:HH:mm:ss
  2. 2016-08-24 18:05:39,830 -> yyyy-MM-dd HH:mm:ss,SSS

发布者:LJH,转发请注明出处:https://www.ljh.cool/37111.html

(1)
上一篇 2023年5月5日 上午12:08
下一篇 2023年5月5日 上午12:19

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注