夜莺+mtail实现简单日志监控

一、说明

文章是对参考博客学习后的整理,有部分内容来源于参考博客。

二、mtail

1.简介

mtail是google出的一个用于日志提取的工具。它可以从日志中提取内容,并转为换监控metrics。

2.使用指南

2.1 简单使用

安装(centos7系统)

mkdir /opt/mtail; 
cd /opt/mtail; 
wget -S https://github.com/google/mtail/releases/download/v3.0.0-rc50/mtail_3.0.0-rc50_Linux_x86_64.tar.gz; 
tar -zxvf mtail_3.0.0-rc50_Linux_x86_64.tar.gz

启动

cd /opt/mtail;
./mtail -logs /var/log/messages -progs etc/ -log_dir ./logdir/

说明

-logs 指定要监控的日志文件,可以是目录 
-progs 指定提取的过滤规则文件,可以是目录 
-log_dir mtail产生日志存放目录

访问web页面

在浏览器输入ip:3903,即可以看到管理页面。

2.2 mtail参数

来自https://blog.csdn.net/bluuusea/article/details/105508897

参数描述
-address                                绑定HTTP监听器的主机或IP地址
-alsologtostderr                        记录标准错误和文件
-block_profile_rate                     报告goroutine阻塞事件之前的纳秒时间
-collectd_prefix                        发送给collectd的指标的metrics前缀
-collectd_socketpathcollectd unixsock   路径,用于向其写入metrics
-compile_only                           仅尝试编译mtail脚本程序,不执行,用于测试脚本
-disable_fsnotify                       是否禁用文件动态发现机制。为true时,不会监听动态加载发现的新文件,只会监听程序启动时的文件。
-dump_ast                               解析后dump程序的AST(默认到/tmp/mtail.INFO)
-dump_ast_types                         在类型检查之后dump带有类型注释的程序的AST(默认到/tmp/mtail.INFO)
-dump_bytecodedump                      程序字节码
-emit_metric_timestamp                  发出metric的记录时间戳。如果禁用(默认设置),则不会向收集器发送显式时间戳。
-emit_prog_label                        在导出的变量里面展示’prog’对应的标签。默认为true
-expired_metrics_gc_intervalmetric      的垃圾收集器运行间隔(默认为1h0m0s)
-graphite_host_portgraphite carbon      服务器地址,格式Host:port。用于向graphite carbon服务器写入metrics
-graphite_prefix                        发送给graphite指标的metrics前缀
-ignore_filename_regex_pattern          需要忽略的日志文件名字,支持正则表达式。使用场景:当-logs参数指定的为一个目录时,可以使用ignore_filename_regex_pattern 参数来忽略一部分文件
-jaeger_endpoint                        如果设为true,可以将跟踪导出到Jaeger跟踪收集器。使用–jaeger_endpoint标志指定Jaeger端点URL
-log_backtrace_at                       当日志记录命中设置的行N时,发出堆栈跟踪
-log_dirmtail                           程序的日志文件的目录,与logtostderr作用类似,如果同时配置了logtostderr参数,则log_dir参数无效
-logs                                   监控的日志文件列表,可以使用,分隔多个文件,也可以多次使用-logs参数,也可以指定一个文件目录,支持通配符*,指定文件目录时需要对目录使用单引号。如:
-logs a.log,b.log,c.log
-logs a.log -logs b.log -logs c.log
-logs ‘/export/logs/*.log’
-logtostderr                            直接输出标准错误信息,编译问题也直接输出
-metric_push_interval_secondsmetric     推送时间间隔,单位:秒,默认60秒
-metric_push_write_deadline             在出现错误退出之前等待推送成功的时间。(默认10s)
-mtailDebug                             设置解析器debug级别
-mutex_profile_fraction                 报告的互斥锁争用事件的分数。0关闭。(此参数为直译,不太理解啥意思)
-one_shot                               此参数将编译并运行mtail程序,然后从指定的文件开头开始读取日志(从头开始读取日志,不是实时tail),然后将收集的所有metrics打印到日志中。此参数用于验证mtail程序是否有预期输出,不用于生产环境。
-override_timezone                      设置时区,如果使用此参数,将在时间戳转换中使用指定的时区来替代UTC
-poll_interval                          设置轮询所有日志文件以获取数据的间隔;必须为正,如果为零将禁用轮询。使用轮询模式,将仅轮询在mtail启动时找到的文件
-port                                   监听的http端口,默认3903
-progsmtail                             脚本程序所在路径
-stale_log_gc_intervalstale             的垃圾收集器运行间隔(默认为1h0m0s)
-statsd_hostportstatsd                  地址,格式Host:port。用于向statsd写入metrics
-statsd_prefix                          发送给statsd指标的metrics前缀
-stderrthreshold                        严重性级别达到阈值以上的日志信息除了写入日志文件以外,还要输出到stderr。各严重性级别对应的数值:INFO—0,WARNING—1,ERROR—2,FATAL—3,默认值为2.
-syslog_use_current_year                如果时间戳没有年份,则用当前年替代。(默认为true)
-trace_sample_perio                     d用于设置跟踪的采样频率和发送到收集器的频率。将其设置为100,则100条收集一条追踪。
-vv                                     日志的日志级别,该设置可能被 vmodule标志给覆盖.默认为0.
-version                                打印mtail版本
-vmodule                                按文件或模块来设置日志级别,如:-vmodule=mapreduce=2,file=1,gfs*=3

2.3 脚本语法

标准格式

COND {
  ACTION
}

# COND是表达式,可以是正则表达式,也可以是boolean类型的条件语句

示例:
/foo/ {
  ACTION1
}

variable > 0 {
  ACTION2
}

/foo/ && variable > 0 {
  ACTION3
}

COND表达式运算符

关系运算符

< , <= , > , >= , == , != , =~ , !~ , || , && , !

算术运算符

| , & , ^ , + , - , * , /, << , >> , **

赋值运算符

= , += , ++ , –

mtail变量与常量

变量类型

mtail支持定义变量。mtail支持三种类型的变量:counter、gauge、histogram

  • counter
    • counter 类型的数据是单调递增的指标,即只增不减。如,你可以使用 counter 类型的指标来表示服务的请求数、成功任务数、失败的任务数等。
  • gauge
    • gauge类型的数据是指可以任意变化的指标,可增可减。如,可以提取正则匹配到的数据,直接赋值给指标变量返回,或者计算后返回。
  • histogram
    • 在大多数情况下人们都倾向于使用某些量化指标的平均值,例如 CPU 的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统 API 调用的平均响应时间为例:如果大多数 API 请求都维持在 100ms 的响应时间范围内,而个别请求的响应时间需要 5s,那么就会导致某些 WEB 页面的响应时间落到中位数的情况,而这种现象被称为长尾问题。
  • 为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在 0~10ms 之间的请求数有多少而 10~20ms 之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram 和 Summary 都是为了能够解决这样问题的存在,通过 Histogram 和 Summary 类型的监控指标,我们可以快速了解监控样本的分布情况。
  • Histogram 在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。

使用变量

定义变量

gauge log_check_result

变量设置别名

counter lines_total as "lines-total"

常量

const IP /\d+(\.\d+){3}/

 # Duplicate lease
 /uid lease / + MATCH_IP + / for client .* is duplicate on / {
    duplicate_lease++
}

2.4 内置函数

来自:https://blog.csdn.net/bluuusea/article/details/105508897

函数描述
timestamp()                              获取时间戳。
注:需要使用strptime或者settime函数设置时间戳之后才能使用timestamp函数
strptime($date, “2006-01-02 15:04:05”)   第一个参数为日志中解析的时间格式,第二个参数为格式模板,此函数作用为使用第二个参数的格式来解析日志中的时间戳,并设置当前时间戳,将变量导出至上游收集器时使用此时间戳。
注:如果第二个参数格式不对,则编译抛出异常;如果日志解析出的时间格式不匹配,则抛出运行时异常。第二个参数必须使用这个特定的时间:2006-01-02 15:04:05。若需要其他格式,可参考Go的时间.parse()格式字符串中的const 部分下的ANSIC等格式。
len(str)                                获取字符串长度
getfilename()                           获取文件名
tolower(x)                              字符串转小写
int(x)                                  将x转换为整数,如果x的类型支持转为整型,则转为整型;如果x的类型不支持转为整型,则触发编译错误;如果x的值不支持转为整型,则触发运行时错误。
float(x)                                将x转换为浮点数,规则同int(x)
string(x)                               将x转为字符串
strtol(x, y)                            使用base将字符串x转为整数y。用于转换日志消息中的八进制、十六进制值
settime(x)                              x为整型,用于设置当前时间戳,将变量导出至上游收集器时使用此时间戳

2.5 条件判断

通常情况下,当条件表达式不匹配时,会直接跳过。而通过else关键字可实现表达式不匹配时执行其他的动作。而通过otherwise关键字则可以实现像java中的switch一样的多条件判断的功能,如下:

#如果foo不匹配,则执行ACTION2
/foo/ {
  ACTION1
} else {
  ACTION2
}

/foo/ {
  #当匹配foo时,才会进行foo1、foo2、otherwise的比配
  #当匹配foo1时,执行ACTION1,匹配foo2时执行ACTION2,否则执行ACTION3
  /foo1/ {
     ACTION1
  }
  /foo2/ {
     ACTION2
  }
  otherwise {
     ACTION3
  }
}

三、夜莺

参考官方文档

四、部署

1.需求

监控linux的系统日志,当有错误日志时进行报警。

2.方案

一般来说,当有错误的日志信息时,日志中会有’error’、’ERRO’、’Error’、’E’、’e’等关键字。所以可以通过检测某条日志是否有这几个关键字来判断是否有错误日志。

2.1 使用mtail来过滤日志中的关键字。

2.2 使用夜莺汇报客户端,获取mtail的metrics。

2.3 使用夜莺监控进行报警。基于获取的metrics值来报警。

3.mtail部署

3.1 mtail安装(参考mtail介绍)

3.2 编写mtail文件

# vim /opt/mtail/etc/log_check.mtail


counter log_check_result              #定义变量,即metrics值。 

/(error|ERROR|Error| E | e )/ {       # 过滤error|ERROR|Error| E | e  关键字,主要E和e左边和右边都有空格,用于排除模糊情况。
  log_check_result++                  # 变量值递增
}

3.3 启动mtail

# vim /opt/mtail/start.sh

#!/bin/bash


case "$1" in
   "start") 
     cd /opt/mtail;
     nohup /opt/mtail/mtail -logs /var/log/messages -progs /opt/mtail/etc/log_check.mtail -log_dir /opt/mtail/logdir/  &
   ;;
   "shutdown") 
     pid=$(ps aux|grep mtail|grep -v 'grep'|awk '{print $2}')
     kill $pid
     kill $pid
     kill $pid
   ;;
   "restart") 
     pid=$(ps aux|grep mtail|grep -v 'grep'|awk '{print $2}')
     kill $pid
     kill $pid
     kill $pid

     sleep 2s

     cd /opt/mtail;
     nohup /opt/mtail/mtail -logs /var/log/messages -progs /opt/mtail/etc/log_check.mtail -log_dir /opt/mtail/logdir/  &
 
   ;;
   *) 
      echo "Parameter error"
      echo "$0 (start|shutdown|restart)"
   ;;
esac

3.夜莺categraf部署与配置

3.1 安装

mkdir /opt/
cd /opt/
wget -S https://github.com/flashcatcloud/categraf/releases/download/v0.2.12/categraf-v0.2.12-linux-amd64.tar.gz
tar -zxvf categraf-v0.2.12-linux-amd64.tar.gz
mv categraf-v0.2.12-linux-amd64 categraf

3.2 配置

3.2.1 删除不用的插件配置,仅保留使用的插件。

3.2.2 配置categraf

vim /opt/categraf/conf/config.toml

[[writers]]
url = "http://192.168.2.188:19100/prometheus/v1/write"

url为n9e的后端服务地址

3.2.3 配置input.prometheus,用于从mtail获取metrics。

vim /opt/categraf/conf/input.prometheus/prometheus.toml

[[instances]]
urls = [
     "http://localhost:3903/metrics"
]

urls是mtail的接口地址

3.2.4 启动categraf

vim /opt/categraf/start.sh

#!/bin/bash


case "$1" in
   "start") 
     cd /opt/categraf;
     nohup /opt/categraf/categraf -configs /opt/categraf/conf/ &
   ;;
   "shutdown") 
     pid=$(ps aux|grep categraf|grep -v 'grep'|awk '{print $2}')
     kill $pid
     kill $pid
     kill $pid
   ;;
   "restart") 
     pid=$(ps aux|grep categraf|grep -v 'grep'|awk '{print $2}')
     kill $pid
     kill $pid
     kill $pid

     sleep 2s

     cd /opt/categraf;
     nohup /opt/categraf/categraf -configs /opt/categraf/conf/ &
 
   ;;
   *) 
      echo "Parameter error"
      echo "$0 (start|shutdown|restart)"
   ;;
esac

4.夜莺报警配置

4.1 报警原理为:检测5分钟内的log_check_result平均值的变化率。

4.2 PromQL

rate(log_check_result[5m])>0

五、参考内容

夜莺 v5.6使用手册

《Prometheus监控实战》第9章 日志监控

mtail部署说明

mtail官网

mtail github地址

Google mtail配合Prometheus和Grafana实现自定义日志监控

mtail简介

mtail详解

夜莺日志采集mtail

夜莺n9ev5,categraf自定义采集数据

PromQL 查询之 rate 函数的使用

Previous Post

自我认同

Next Post

微信收藏语音如何导出

Related Posts