编写bashshell脚本来读取mongodb日志文件并将其写入&x27;将内容复制到另一个文本文件

编写bashshell脚本来读取mongodb日志文件并将其写入&x27;将内容复制到另一个文本文件,mongodb,bash,shell,cron,cron-task,Mongodb,Bash,Shell,Cron,Cron Task,我试图读取位于/var/log/MongoDB的MongoDB日志文件,其内容如下: 2019-11-04T05:04:00.390-0800 I COMMAND[conn38649]COMMAND loldb.$cmd COMMAND:update{update:“SUBSCRIPTION”,ordered:true,writeConcern:{w:1},$db:loldb}numields:0 reslen:295锁:{Global:{acquireCount:{r:460 w:460},

我试图读取位于
/var/log/MongoDB
的MongoDB日志文件,其内容如下:


2019-11-04T05:04:00.390-0800 I COMMAND[conn38649]COMMAND loldb.$cmd COMMAND:update{update:“SUBSCRIPTION”,ordered:true,writeConcern:{w:1},$db:loldb}numields:0 reslen:295锁:{Global:{acquireCount:{r:460 w:460},数据库:{acquireCount w:460},集合:{acquireCount w:459},oplog:{acquireCount:{w:1}}}协议:op_查询568ms

2019-11-04T05:04:00.396-0800 I命令[conn38657]命令loldb.SUBSCRIPTION命令:查找{find:“SUBSCRIPTION”,筛选器:{customerID:75824180,policdepartmentid:1},投影:{},$readPreference:{mode:“secondaryPreferred”},$db:“loldb”}planSummary:COLLSCAN KeysChecked:0 docsChecked:69998 cursorExhousted:1 numields:550 nreturned:1 reslen:430锁:{Global:{acquireCount:{r:1102}},数据库:{acquireCount:{r:551},集合:{acquireCount:{r:551}}}协议:op\u查询424ms

2019-11-04T05:04:00.402-0800 I命令[conn38735]命令loldb.SUBSCRIPTION命令:查找{find:“SUBSCRIPTION”,过滤器:{customerID:75824164},投影:{},$readPreference:{mode:“secondaryPreferred”},$db:“loldb”}planSummary:COLLSCAN KeysChecked:0 docsChecked:58142 cursorExhousted:1 numields:456 nreturned:1 reslen:417锁:{Global:{acquireCount:{r:914}},数据库:{acquireCount:{r:457},集合:{acquireCount:{r:457}}}协议:op\u查询374ms


每个blockquote都是单行条目

文件内容每秒钟更新一次我需要读取文件,如果查询时间
协议:op_query 385ms
超过300ms,我需要将整个日志/行保存到另一个文本文件
slow_querys.text

我正在阅读的文件是
.log
文件,但内容似乎是JSON格式(如果我错了,请纠正我),前面有时间戳和命令类型,有没有有效的方法读取这种格式的数据?我只是逐字逐行地读


另外,我该如何做才能自动读取对
.log
文件所做的更改,而无需每次运行脚本?

我刚刚在本地计算机上尝试了此操作,可能需要为您的用例做一些工作。但我添加了一些注释,因此这可能会帮助您:

编辑:我添加了对时间戳的检查,您必须根据需要对其进行配置

!/bin/bash
#持续读取文件并将其导入while循环
tail-F“test.log”|\
读行时
做
#从行中获取时间戳并以秒为单位获取时间
TimeUnseconds=“$(grep-P“^\S*”|日期-d-+%S)”
#在5分钟之前获取当前时间戳
timebeforefivemin=“$(日期-d'-5分钟+%s)”
#仅当行的时间戳小于5分钟之前的时间时记录
如果[[$(expr$timeinseconds-$timebeforefivemin)-lt 0]];
然后
#从行中获取查询的时间
querytime=“$(echo“$LINE”| grep-oP'\d+ms'| grep-oP'\d+')”
#如果grep成功并且查询时间大于300
如果[$?=0]&&[“$querytime”-gt 300]
然后
#将该行回显到慢速查询文件->将其更改为所需的路径
echo“$LINE”>>slow_querys.txt
fi
fi
完成

谢谢,这很有效,有没有什么方法可以搜索特定的时间戳,或者只有5分钟的日志?您想在该脚本中搜索/var/log/mongodb下的日志文件,还是只想在该脚本之外搜索slow_querys.txt?在/var/log/mongodb文件中读取日志时使用相同的脚本是非常有用的有没有办法按时间戳过滤这些日志?您必须编辑
timebeforefivemin
以分配给类似
date-d'的内容,然后按'
过滤这些日志,如果条件必须类似于
if[[[$timebeforefivemin-eq$timeinseconds]]
。请注意,您必须给出准确的时间戳。但是,请查看相应的手册页上的日期,并亲自查看条件,以了解如何实现您想要的功能:)谢谢,我将研究所有这些:)