您现在的位置是:首页 >技术杂谈 >夜莺(Flashcat)V6监控(四):categraf-mtail日志收集插件详解网站首页技术杂谈

夜莺(Flashcat)V6监控(四):categraf-mtail日志收集插件详解

Dream运维梦工厂 2023-07-08 12:00:02
简介夜莺(Flashcat)V6监控(四):categraf-mtail日志收集插件详解

(一)mtail介绍

     mtail  是谷歌开源的一款从应用日志中提取 metrics 的工具。categraf 将mtail作为一个插件集成了进来,并且兼容 mtail 的语法,简化了部署。原本 mtail 和日志文件之间是一对一的关系,即一般都是一个 mtail 进程处理一类日志,但是对于很高配的物理机,上面会部署很多不同的服务,每个服务进程都对应一个 mtail,此时机器上会出现特别多的 mtail 进程,较难维护。把 mtail 集成到 categraf 之后,复用 categraf 的多实例插件机制,可以做到一台机器上只有一个 categraf 进程即可读取解析多个服务的日志 示例图如下 

      这里我们先说一下单独安装mtail的一些安装流程和一些参数配置和一些缺陷

      mtail的github项目地址:Releases · google/mtail · GitHub

# 下载
$ wget https://github.com/google/mtail/releases/download/v3.0.0-rc51/mtail_3.0.0-rc51_Linux_x86_64.tar.gz
$ tar xf mtail_3.0.0-rc51_Linux_x86_64.tar.gz
$ cp mtail /usr/local/bin

# 查看mtail版本
$ mtail --version
mtail version 3.0.0-rc51 git revision 6fdbf8ec96a63c674c53148eeb9ec96043a2ec9c go version go1.19.4 go arch amd64 go os linux

# mtail后台启动
$ nohup mtail -port 3903 -logtostderr -progs test.mtail -logs test.log &

# 默认端口是3903
$ nohup ./mtail -progs test.mtail -logs test.log &

# 查看是否启动成功
$ ps -ef | grep mtail

# 查看mtail的帮助文档
$ mtail -h

 mtail参数详解:

mtail -h
mtail version 3.0.0-rc51 git revision 6fdbf8ec96a63c674c53148eeb9ec96043a2ec9c go version go1.19.4 go arch amd64 go os linux

Usage:
  -address string # 绑定HTTP监听器的主机或者IP地址
  -alsologtostderr # 记录标准错误和文件
  -block_profile_rate int # 报告goroutine阻塞事件之前的阻塞时间的纳秒数。0表示关闭。
  -collectd_prefix string # 发送给collectd的指标前缀
  -collectd_socketpath string # collectd socket路径,用于向其写入metrics
  -compile_only # 仅禅师编译mtail脚本程序,不执行
  -disable_fsnotify # 是否禁用文件动态发现机制。为true时,不会监听动态加载发现的新文件,只会监听程序启动时的文件。
  -dump_ast # 解析后dump程序的AST(默认到/tmp/mtail.INFO)
  -dump_ast_types # 在类型检查之后dump带有类型注释的程序的AST(默认到/tmp/mtail.INFO)
  -dump_bytecode # dump程序字节码
  -emit_metric_timestamp # 发出metric的记录时间戳。如果禁用(默认设置),则不会向收集器发送显式时间戳。
  -emit_prog_label # 在导出的变量里面展示prog对应的标签。默认为true
  -expired_metrics_gc_interval duration # metric的垃圾收集器运行间隔(默认为1h0m0s)
  -graphite_host_port string # graphite carbon服务器地址,格式Host:port。用于向graphite carbon服务器写入metrics
  -graphite_prefix string # 发送给graphite指标的metrics前缀
  -http_debugging_endpoint # 是否开启调式接口(/debug/*),默认开启
  -http_info_endpoint # 是否开始info接口(/progz,/varz),默认开启
  -ignore_filename_regex_pattern string # 需要忽略的日志文件名字,支持正则表达式。使用场景:当-logs参数指定的为一个目录时,可以使用ignore_filename_regex_pattern 参数来忽略一部分文件
  -jaeger_endpoint string # 如果设为true,可以将跟踪导出到Jaeger跟踪收集器。使用–jaeger_endpoint标志指定Jaeger端点URL
  -log_backtrace_at value # 当日志记录命中设置的行N时,发出堆栈跟踪
  -log_dir string # mtail程序的日志文件的目录,与logtostderr作用类似,如果同时配置了logtostderr参数,则log_dir参数无效
  -logs value # 监控的日志文件列表,可以使用,分隔多个文件,也可以多次使用-logs参数,也可以指定一个文件目录,支持通配符*,指定文件目录时需要对目录使用单引号。
  -logtostderr # 直接输出标准错误信息,编译问题也直接输出
  -max_recursion_depth int # 以解析的标记来衡量mtail语句的最大长度。过长的mtail表达式可能会导致编译和运行时的性能问题。(默认为100)
  -max_regexp_length int # 一个mtail regexp表达式的最大长度。过长的模式可能会导致编译和运行时的性能问题。(默认为1024)
  -metric_push_interval duration # metric推送时间间隔,单位:秒,默认60秒
  -metric_push_interval_seconds int # 弃用,用--metric_push_interval代替
  -metric_push_write_deadline duration # 在出现错误退出之前等待推送成功的时间。(默认10s)
  -mtailDebug int # 设置解析器debug级别
  -mutex_profile_fraction int # 报告的互斥争夺事件的比例。 0将关闭
  -one_shot # 此参数将编译并运行mtail程序,然后从指定的文件开头开始读取日志(从头开始读取日志,不是实时tail),然后将收集的所有metrics打印到日志中。此参数用于验证mtail程序是否有预期输出,不用于生产环境。
  -one_shot_format string # 与-one_shot一起使用的格式。这只是一个调试标志,不适合生产使用。支持的格式: json, prometheus. (默认为 "json")
  -override_timezone string # 设置时区,如果使用此参数,将在时间戳转换中使用指定的时区来替代UTC
  -poll_interval duration # 设置轮询所有日志文件以获取数据的间隔;必须为正,如果为零将禁用轮询。使用轮询模式,将仅轮询在mtail启动时找到的文件
  -poll_log_interval duration # 设置找到所有匹配的日志文件进行轮询的时间间隔;必须是正数,或者是0来禁用轮询。 在轮询模式下,只有在mtail启动时发现的文件会被轮询。(默认250ms)
  -port string # 监听的http端口,默认3903
  -progs string # mtail脚本程序所在路径
  -stale_log_gc_interval duration # stale的垃圾收集器运行间隔(默认为1h0m0s)
  -statsd_hostport string # statsd地址,格式Host:port。用于向statsd写入metrics
  -statsd_prefix string # 发送给statsd指标的metrics前缀
  -stderrthreshold value # 严重性级别达到阈值以上的日志信息除了写入日志文件以外,还要输出到stderr。各严重性级别对应的数值:INFO—0,WARNING—1,ERROR—2,FATAL—3,默认值为2.
  -syslog_use_current_year # 如果时间戳没有年份,则用当前年替代。(默认为true)
  -trace_sample_period int # 用于设置跟踪的采样频率和发送到收集器的频率。将其设置为100,则100条收集一条追踪。
  -unix_socket string # socket监控地址
  -v value # v日志的日志级别,该设置可能被 vmodule标志给覆盖.默认为0.
  -version # 打印mtail版本
  -vm_logs_runtime_errors # 启用运行时错误的记录到标准日志。 如果设置为false,则只将错误打印到HTTP控制台。(默认为true)
  -vmodule value # 按文件或模块来设置日志级别,如:-vmodule=mapreduce=2,file=1,gfs*=3

 这里可以看到参数非常的多,但是我们正常一般情况下使用的就两个,一个-progs 定义mtail日志规则的格式,-logs 定义我们要读取的日志文件的路径

nohup ./mtail -progs test.mtail -logs test.log &

##这里我们就是nohup后台运行mtail程序,并且指定当前目录下的test.mtail日志格式文件,和test.log日志文件读取

日志格式.mtail的规则格式可以在mtail的github项目里面找到格式编写mtail/Programming-Guide.md at main · google/mtail · GitHub

当然在后面的categraf里面的插件也有相应的格式参考

(二)categraf-mtail日志采集案例实操

       categraf-mtail插件项目地址:categraf/inputs/mtail at main · flashcatcloud/categraf · GitHub

       进入正题,这个mtail插件集合在了categraf里,不明白什么是categraf的兄弟姐妹可以看一下我上一期讲的categraf文章,里面都详细讲解了categraf(All-in-on)采集器详解 。

       我们这里案列我们在/opt文件目录下创建两个日志文件a,b  并且创建两个mtail规则脚本文件a.mtail b.mtail。然后使用categraf集合的mtail插件配置mtail插件。

这里注意mtail的规则配置文件必须以.mtail后缀的文件

cd /opt

mkdir mtail   # 创建一个专门的mtail测试案列文件夹

mkdir logs-a  && cd logs-a && touch a.log
mkdir logs-b  && cd logs-b && touch b.log
#创建日志文件件并且在里面生成两个日志文件a.log 和 b.log

mkdir progs-a && cd progs-a && touch progs-a.mtail 
mkdir progs-b && cd progs-b && touch progs-b.mtail
#创建两个mtail规则脚本文件.mtail。 这里注意mtail的规则配置文件必须以.mtail后缀的文件

##这里创建好以后,我们先配置两个progs规则脚本文件,progs-a我们用来收集a.logs中error字段的日志
##progs-b我们用来收集b.logs中dream字段的日志

vim progs-a.mtail
gauge err_cnt 
/ERROR.*/ {
      err_cnt++
}


vim progs-b.mtail
gauge dream_cnt 
/dream.*/ {
      dream_cnt++
}

##这个规则的用法是使用GO的正则表达式进行配置说明,比如第一行gauge err_cnt是声明我们这个mtail规则名称是什么
##然后第二行/ERROR.*/ 的意思就是读取日志文件中包含ERROR字段的所有
##第三行就是如果读## 取到日志文件中出现EEROR字段,就自动增加检测到的ERROR报错信息,上报给监控。




接下来我们配置categraf的mtail插件配置文件,让categraf的mtail插件读取我们这两个日志文件和规则配置文件。

## 进入categraf的插件目录conf 找到mtail
vim /categraf/conf/input.mtail/mtail.toml

[[instances]]
progs = "/opt/mtail/progs-a/progs-a.mtail" # progs声明我们的第一个a.mtail的规则配置文件的路径
logs = ["/opt/mtail/logs-a/a.log"]      # 声明我们的a.log的配置文件的目录
# override_timezone = "Asia/Shanghai"  # 这里是声明时区
# emit_metric_timestamp = "true" #string type  # 时间戳的配置 ,默认是开启的

[[instances]]
progs = "/opt/mtail/progs-b/progs-b.mtail" # progs声明我们的第一个b.mtail的规则配置文件的路径
logs = ["/opt/mtail/logs-b/b.log"]       
# override_timezone = "Asia/Shanghai"
# emit_metric_timestamp = "true" # string type


##注意这里的一个instances字段下面的4行内容是一个instances 
##一个instances里面可以写一个mtail规则和多个日志文件,就是一个mtail规则脚本可以给多个日志文件读取使用。

配置完这些用户 我们启动categraf做一下本地测试

./categraf --test --inputs mtail

启动以后我们再开一个终端窗口来写入日志来测试是否成功收集指标

echo "ERROR" >> a.log

 再categraf启动的终端窗口下发现成功收集到 然后我们来说一下这几个字段的意思:

21:45:31  :前面的时间默认是用的你本机本服务器里的时间。

mtail_ :这里的mtail_是默认不变的 只要你启动了mtail插件他就会默认有这个字段。

后面的_err_cnt: 是我们再配置progs规则配置文件的时候 声明的gauge err_cnt

agent_hostname: 就是你本机的主机名了

1: 代表的是当前采集到一个ERROR字段的规则,只要日志里面出现一次ERROR的信息日志,这里的参数就会++

注意: 细心的伙伴肯定也发现了,这个日志采集的时间是15秒一次,而且采集的日志字段收集的字段是在我们启动categraf-mtail以后才开始收集采集的,日志文件之前的信息是不会采集的。

当然我们还可以在n9e里面查看我们的mtail信息:

 当然肯定mtail的规则配置肯定不仅仅只有这些用法,下面我们再举例做两个规则脚本用法一个是添加标签,一个是增加规则配置变量让我们更好的区分我们收集的是哪个日志。

更多的一些规则配置脚本和一些高级的正则表达式的一些用法大家可以去categraf的mtail插件项目里面参考:categraf/inputs/mtail at main · flashcatcloud/categraf · GitHub

(1) 打标签

在categraf的mtail配置文件里面 增加一个labels字段即可

[[instances]]
progs = "/opt/mtail/progs-a/progs-a.mtail" # prog dir1
logs = ["/opt/mtail/logs-a/a.log"]
labels = { log="a.log" }    ## 这里是我们添加的标签
# override_timezone = "Asia/Shanghai"
# emit_metric_timestamp = "true" #string type

[[instances]]
progs = "/opt/mtail/progs-b/progs-b.mtail" # prog dir2
logs = ["/opt/mtail/logs-b/b.log"]
labels = { log= "b.log" }
# override_timezone = "Asia/Shanghai"
# emit_metric_timestamp = "true" # string type

添加好以后重启categraf然后我们在写入日志测试

echo “ERROR” >> a.log
echo "dream" >> b.log
 ./categraf --test --inputs mtail

 (2) 增加env变量

配置我们的mtail规则文件 增加env变量

vim /opt/mtail/progs-a/progs-a.mtail

hidden text env
env="dream king"
gauge err_cnt by env
/ERROR.*/ {
     err_cnt[env]++
}

然后我们重启categraf,重新写入测试日志文件

echo “ERROR” >> a.log
 ./categraf --test --inputs mtail

总结:

     相比于谷歌的mtailcategrafmtail做了一些优化,可以更好的处理多日志的问题,并且不会出现日志错乱的一些现象,我们在使用谷歌的mtail的时候很多时候都会出现日志错乱,不同的指标收集到了其他的日志文件里面,但是categraf把它做了优化,成功的解决这些问题。而且 categraf 本身集成了很多插件,都可以统一使用它实现。

    如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,如果还有对夜莺的使用不了解的可以看看我的专栏,也欢迎提问,你的支持会激励我输出更高质量的文章,非常感谢!♥

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。