当前位置: 首页 > 科技观察

如何在12小时内完成日志监控?

时间:2023-03-18 22:43:42 科技观察

日志监控是每个公司都必须解决的问题。对于创业型企业来说,如何半天搞定一个可扩展、通用的日志监控框架,是我们今天要聊的话题。什么是日志监控?关于日志,不同的公司有不同的情况:(1)A类公司:没有日志;(2)B类公司:有日志,只有在用户说系统宕机或有BUG时才登录去系统看日志,大部分日志都是随心所欲打印的,缺乏组织和制度;画外音:很多时候,当追查bug发现日志信息不全时,必须先推出一个有日志的版本,帮助定位bug。(3)C类公司:有日志,有日志规范,有系统地整理和收集日志;监控日志,先于用户发现系统故障,实时告警,这就是今天要讨论的日志监控问题。日志监控有什么要求?对于日志监控,一般有以下几种需求:(1)一旦出现一定级别的日志(比如FATAL级别,或者ERROR级别的日志),或者超过一定的频率,就会发出告警;(2))包含一些特殊含义关键字(如OutOfMemory,或Exception)的异常日志,一旦出现,或超过一定频率,就会发出告警;(3)普通日志,包含一些特殊含义的关键字(如登录,或点击),一旦一定时间没有出现,就会发出告警;其中,前两类需求属于异常日志监控的范畴,如果出现异常会实现告警。第三类需求属于正常日志监控的范畴。如果在一定时间内没有“正常”,则默认为异常,并实施告警。为什么不一出现异常日志就报警呢?为了避免抖动引起的误报,只有达到一定的频率才会发出报警,这是报警策略的一部分。为什么目录和日志的标准化是一般日志监控的前提?这是一个在线模块目录的例子:源代码:hello.c可执行文件:a.out配置文件:hello.conf备份日志:hello.log.2018012812有一个日志:hello.log有一个临时文件:tmp经验,运维同学看到这样的在线文件部署,感觉如何?画外音:没见过网上直接部署的源码?常见的目录规范有哪些?目录标准化不仅对日志监控很重要,对自动化运维也很重要。如果线上目录乱了,几乎没有办法实现自动化运维。常见的目录规范有两种类型:模块优先的目录规范;功能优先的目录规范;什么是模块优先目录规范?如上图所示,以模块名为优先级组织目录:在根目录下,有das、entry、logic一个模块目录;模块目录下有bin目录、conf目录和log目录,分别存放可执行文件、配置文件和日志文件;具有功能优先级的目录规范是什么?如上图所示,目录按照功能优先级组织:根目录下,二进制目录bin,配置文件目录conf,日志目录log;function目录下,有das、entry、logic等不同模块的目录;备份、配置备份、日志清理都非常方便。常见的日志规范有哪些?日志归一化不仅对日志监控非常重要,对大数据系统的建设也非常重要。需要考虑的规范:(1)日志分类规范:不同级别的日志应该分到不同的文件中,比如FATAL级别、ERROR级别、WARM级别、LOG级别、INFO级别、DEBUG级别:fatal.logerror.loginfo。logdebug.log...(2)日志切分规范:运维应提供自动化的日志切分工具,支持hour级别,或Day级别的日志切分。我看过一个120G的访问日志。从日志中grep出某个uid的日志,效率极低:daojia.log.2018012800daojia.log.2018012801…daojia.log.2018012823(3)日志格式规范:日志格式规范是一个可扩展的话题,将这里不展开;画外音:有没有朋友在想,ca,为什么我没有这三种规格呢?通用的、可扩展的日志监控框架是什么?主意?制定目录规范和日志规范后,建立日志监控框架,实现异常和正常日志监控就容易多了。主要有两种思路:集中监控和分散监控。什么是集中式日志监控?集中式日志监控,最流行的是ELK:logstash部署在各个机器节点上,用于收集日志;收集的日志汇总到ES;通过Kibana进行统一分析和展示;这套集中式日志监控系统大家很熟悉了。什么是去中心化日志监控?ELK有点重,三个系统的搭建和运维都比较麻烦。如果只是实现对ERROR日志的监控,异常关键字监控,正常关键字监控,就有点大材小用了。与中心化的日志监控相比,去中心化的日志监控要轻很多,非常适合早期创业的公司。思路是:通过日志监控模块,针对不同集群设置ERROR日志阈值,设置异常关键字和正常关键字;日志监控中心模块统一调度,将配置分发给不同机器的代理节点;代理节点模块不统一收集日志,而是接收监控中心分发的日志监控配置,对每台机器进行日志监控,如果触发日志监控策略,会立即发出告警;与ELK相比,这个日志监控框架会简单很多,扩展性很好。如何半天搞定日志监控框架?整个框架设计如上,大致分为三部分:(1)被监控集群;(2)基本信息和服务;cluster.info.xml:存储集群信息owner.info.xml:存储集群负责人信息mail.service/SM.service:告警基础服务(3)日志监控框架;集群信息和负责人信息同上。集群配置cluster.info.conf[daojia_main]ip.list:ip1,ip2,ip3log.path:/home/work/log/daojia_main/owner.list:shenjian,zhangsan[daojia_user]ip.list:ip4,ip5,ip6log.path:/home/work/log/daojia_user/owner.list:shenjian负责人配置owner.info.conf[shenjian]email:XX@XX.comphone:15912345678[zhangsan]email:YY@YY.comphone:18611220099log监控框架分为两个模块:可扩展监控配置文件log.monitor.conf[log.monitor.item]cluster.name:daojia_main#errorlog监控,每分钟报警error.log.threshold:10超过这个阈值#异常关键字监控,如果这些关键字出现在日志中,就会报警bad.key:exeption|timeout|coredump#普通关键字监控,如果这些关键字每分钟都没有出现在日志中,就会报警good.key:login|user|点击[记录。monitor.item]cluster.name:daojia_usererror.log.threshold:10日志监控调度框架,这里需要写代码,伪代码如下:Array[log-monitor]A1=Parse(log.monitor.config);Array[cluster-info]A2=Parse(cluster.info.config);Array[owner-info]A3=Parse(owner.info.config);//遍历所有监控项for(eachiteminA1){//取出监控项的集群名称,Threshold,异常/正常关键字clusterName=item.clusterName;threshold=item.threshold;badKey=item.badkey;goodKey=item.goodkey;//从集群名称中获取集群信息clusterInfo=A2[clusterName];//获取日志目录,设置groupiplist,clusterownerlistlogPath=clusterInfo.path;Listips=clusterInfo.ip;Listowners=clusterinfo.owner;//集群中每个ip实例需要日志监控for(eachipinips){//登录本机ssh$ip//跳转到相关目录cd$logPath//查看最近一分钟的错误日志条数$count=`grep$timeerror.log|wc-l`//查看badkeyandgoodkey$boolBad=`grep$badkey*`$boolGood=`grep$goodkey*`if($count