/**
*作者:ahuaxuan
*日期:2008-10-21
**/ [size=medium]
日志监控这个功能应该有很多程序员都遇到过这种需求,一般来说它在关键型应用(尤其涉及到收入问题,该功能也是来自于系统问题发生后我们的反省)上显得尤其重要.下面我们来看看我们之所以需要这丫得前因后果.
我们将其分为两个部分
一开发,开发以人为主导因素,一般得流程是:开发->单元测试->集成测试->黑盒测试.理论上来讲,这个流程是没有问题的,不过有一个前提或者说是基础,那就是我们的程序员和测试人员是不能同时失误的,如果同时失误,那么有问题的代码可能会被部署到服务器运行.
二部署,部署之后程序是否正常很大程度上和服务器软硬件环境有关,如果需要保证我们的程序可以无差错运行,那么就需要保证我们的软硬件环境的正常运行.
有了这两点上的保证,那么我们晚上就可以安心的睡觉了,不过事实上这两个环节都有可能发生问题.
第一点,测试人员和程序员同时粗心的”巧合”确实是会发生,发生的频率和团队的项目管理水平有及其紧密的联系,两者成明显反比,项目管理水平越低,那么发生这种情况的几率就越高,反之亦然.同时,世界上没有不犯错误的人,据我所知,windows2000在开发的时候有900个人员,而测试人员达到了1800个,由此可见,微软非常明白这个道理.
第二点,服务器软硬件问题的发生有时候会非常的蹊跷,比如说网线出了点小问题都能把人折磨半天.或者原本理论上没有问题的网络时不时的会出现点小问题,让人丈二和尚摸不着头脑,尤其是我们可能会半天都没有察觉到它对我们程序的影响.
那么基于以上论断,有规范的流程,有貌似正常的软硬件环境对我们来说还是不够的,我们还需要保证我们的应用运行良好(尤其是核心应用,其他应用看情况).那么一旦我们的应用出现问题,我们怎么才能及时的得到通知呢,日志是个好东西,我们可以从日志下手
对于java程序员来说,最熟悉的莫过于的是log4j,对于c’er来说最熟悉的可能是log4c, 还有log4c++,log4p等等等等,log4````还是比较多的.不过本文并不准备介绍他们的使用步骤或者其他什么方面.
纵观日志监控的类型,基本可以分为2个大类,耦合和解耦.耦合类基本把日志监控的功能整合到应用程序中,比如说扩展log4j(自己写一个myappender之类的,这对于java程序员来说最熟悉),还有扩展log4c(不熟,无发言权)等等.拿扩展log4j来说,在myappender中记录下错误的信息,然后发给一个日志搜集程序也是可以的,如果你不想扩展log4j,那么没有问题,有exceptioninterceptor吗?不管怎样,你一定有一个总的异常拦截的方案,在把这些异常显示到页面之前你总得做点什么吧,ok,就在这里,把这个异常发到日志搜集程序里去吧.
还有一种就是解耦了,也就是说你的应用程序无需关心日志监控方面的问题.交给别人来做吧,这样似乎比较安心一点.那么这样做的一个关键就是在分析日志文件上,分析完之后发送给一个统一的日志搜集程序就行了(这个日志搜集程序收到请求后可以发邮件给当事人).
这样问题就变成了如何解析日志文件了.我把它分为以下几个步骤:
1定义日志格式,要解析日志,那么这个日志数据需要遵循某种规范,比如说我们规定我们的日志必须以”日期 时间 级别:”这样的形式开头
Eg: 2008-10-17 10:00:43 INFO:xxxxxxxxxxxxxxxxxxxxxxxxxxx
2 合理设置日志的输出级别.比如把warn和error的信息输出到单独的文件中去,而不是把它们和info或者debug放在一起.这样做的目的是减轻日志分析器的压力.
3 需要开发一个日志搜集中心,所有项目的日志分析器在分析到错误信息后都可以发到这个统一的日志搜集中心.
下面的代码是我用python写的一个日志分析器的雏形时的代码,仅供理解使用.代码中有一些解释,主要用到了python几个模块:
正则表达式模块,该模块用来判断日志是否符合要求
time模块,常用模块
urllib和urllib2模块,发送http请求模块,日志信息会被发送到统一的日志中心.
cPickle模块,记录最新的日志日期和时间
socket模块,得到机器的ip和机器名
hashlib模块,过滤重复的日志信息
以下是代码部分:
#!python
import re, time
import urllib2, urllib
import cPickle as pp
import zlib, socket, hashlib
#------------------------ setting begin ------------------------
fileAddress = 'E:/workspace/logs/aaa.log'
logLevel = 'ERROR:'
datePattern = '\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}'
msgReceiveUrl = 'http://localhost:8083/test/logcollect'
fileDataPath = 'D:/a.txt'
sepMinutes = 5
#------------------------ setting end ------------------------
logf = open(fileAddress, 'r')
p = re.compile(datePattern)
class LogParser(object):
def __init__(self, t):
self.lastTime = t
self.msgList = []
self.tmpTime = None
def isNewMsg(self, msg):
currentTimeStr = msg[:19]
currentTime = time.strptime(currentTimeStr, '%Y-%m-%d %H:%M:%S')
if self.lastTime == None:
self.lastTime = time.localtime()
if currentTime > self.lastTime:
self.tmpTime = currentTime
return True
else:
return False
'''
如果是新的日志信息则保存到需要发送的列表中
'''
def collectMsg(self, msg):
if self.isNewMsg(msg):
self.msgList.append(msg)
else:
pass
'''
过滤重复的日志信息
将日志列表中的新日志信息发出去,
'''
def sendMsg(self):
#record the last time
if self.tmpTime != None:
picklef = open(fileDataPath, 'w')
pp.dump(self.tmpTime, picklef)
print 'middle time ------------ ' + str(self.tmpTime)
picklef.close()
finalList = []
existMsgList = []
for tmpmsg in self.msgList:
hash = hashlib.md5(tmpmsg[19:-1]).hexdigest()
if not existMsgList.__contains__(hash):
existMsgList.append(hash)
finalList.append(tmpmsg)
#data = zlib.compress(str(finalList[:1000]))
#print data
print finalList
body = {}
for a in finalList[:10000]:
body['msg'] = a
body['ip'] = socket.gethostbyname(socket.gethostname())
body['hostname'] = socket.gethostname()
#print self.msgList
#cj = cookielib.CookieJar()
# opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener = urllib2.build_opener()
urllib2.install_opener(opener)
req = urllib2.Request(msgReceiveUrl, urllib.urlencode(body))
u = urllib2.urlopen(req)
print u.read()
'''
解析日志文件中的每行日志
'''
def parseLog(self):
tmpLogStr = ''
for a in logf:
#print ' pattern result ' + str(p.match(a))
if p.match(a) != None:
if tmpLogStr != '':
self.collectMsg(tmpLogStr)
if a.find(logLevel) > 0:
tmpLogStr = a
else:
tmpLogStr = tmpLogStr + a
if __name__ == '__main__':
picklef = open(fileDataPath)
t = None
try:
t = pp.load(picklef);
except EOFError:
pass
#t = time.strptime('2008-10-17 10:00:43', '%Y-%m-%d %H:%M:%S')
picklef.close()
begin = time.time()
print 'begin --- last log time : ' + str(t)
parser = LogParser(t)
parser.parseLog()
parser.sendMsg()
logf.close()
print 'end ------- total time is ' + str(time.time() - begin)
有了这个脚本,那么我们任何的应用无需作逻辑上的改动,不需要改动java代码,只需要修改一下log4j的配置文件即可.可以说和application是完全解耦的.
ahuaxuan的机器是cpu e4400,频率2g,内存2g,硬盘7200转,型号不知,分析8m的日志文件用时1.2s.该脚本可以使用操作系统的cron功能使其定时运行. 比如说10分钟运行一次.
这样,一旦系统出现问题,相关人员可以立刻收到邮件,及时处理,把损失降到最小.
由于ahuaxuan水平所限,文章或者代码中不免有不妥之处,望不吝赐教[/size]
分享到:
- 2008-10-21 17:16
- 浏览 2463
- 评论(0)
- 论坛回复 / 浏览 (0 / 4418)
- 查看更多
相关推荐
java反编译器,支持jdk5.0 博文链接:https://ahuaxuan.iteye.com/blog/139493
铌酸锂基有源无源器件系列建模仿真:从光栅到电光调制器的探索,一.铌酸锂基有源和无源器件系列,FDTD MODE COMSOL建模仿真 1.一维光栅 2.MMI型分束器 3.波导型偏振旋转控制器,定向耦合器 4.铌酸锂电光调制器建模仿真 ,铌酸锂基;有源无源器件系列;FDTD MODE COMSOL建模仿真;一维光栅;MMI型分束器;波导型偏振旋转控制器;定向耦合器;铌酸锂电光调制器建模仿真。,"铌酸锂器件建模:光栅与波导偏振调控"
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
是一个简单的记事本应用,使用了Vue.js框架来构建。这个应用允许用户添加、显示和删除任务。 HTML结构 头部 (<header>): 包含应用名称("xback记事本")和一个输入框(用于输入新任务),以及一个按钮("添加任务"),用于将输入框中的内容作为新任务添加到列表中。 主体区域 (<section class="main">): 显示任务列表。每个任务都是一个列表项(<li>),包含任务的序号、内容和删除按钮。 底部 (<footer>): 当存在任务时显示,包含两个元素:一个显示当前任务总数的统计信息,和一个按钮("清空任务"),用于删除所有任务。 交互 用户可以在输入框中输入新任务,然后点击"添加任务"按钮将其添加到列表中。 每个任务旁边都有一个删除按钮,点击后可以删除对应的任务。 如果存在任务,底部会显示任务总数,并提供一个"清空任务"按钮,点击后可以删除所有任务。
Gigabyte Z97X-UD3-H f7版本bios
HD Tune Pro6.0
COMSOL 6.1模型仿真探究光纤等波导三维弯曲的模场分布与波束包络方法,COMSOL模型仿真光纤等波导的三维弯曲,模场分布,波束包络方法 Comsol6.1版本自建仿真模型 ,核心关键词:COMSOL模型; 光纤等波导; 三维弯曲; 模场分布; 波束包络方法; Comsol6.1版本; 自建仿真模型。,"COMSOL 6.1:仿真光纤等波导三维弯曲的模场分布与波束包络方法"
2025年辐射安全与防护培训考试试题(含答案).docx
2025年材料员网络培训考试题库及答案.pptx
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
Matlab Simulink下的双馈风机风电调频技术研究:虚拟惯性惯量与下垂控制应用,风电场仿真优化及快速仿真分析,matlab simulink 双馈风机调频,风电调频,一次调频,风电场调频,三机九节点,带有惯性惯量控制,下垂控制。 风电渗透20%,同步机调频,火电水电机组调频,phasor模型,仿真速度快,只需要20秒 ,MATLAB; Simulink; 双馈风机调频; 风电调频; 一次调频; 风电场调频; 虚拟惯性惯量控制; 下垂控制; 20%风电渗透; 同步机调频; 火电水电机组调频; Phasor模型; 仿真速度。,"Matlab Simulink双馈风机与多类型机组协同调频技术"
本书结合 AI 原生应用落地的大量实践,系统讲解提示工程的核心原理、相关案例分析和实战技巧,涵盖以下内容:提示工程概述、结构化提示设计、NLP 任务提示、内容创作提示、生成可控性提示、提示安全设计、形式语言风格提示、推理提示、智能体提示等。 本书的初衷不是告诉读者如何套用各种预设的提示模板,而是帮助读者深入理解和应用提示设计技巧,以找到决定大语言模型输出的关键因子,进而将提示工程的理论知识应用到产品设计中。 本书适合 AI 原生应用开发的从业者和研究人员,以及人工智能相关专业的教师和学生阅读。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
2025年海洋知识竞赛题及答案.doc
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
2025年计算机基础理论信息安全基本知识试题及答案.docx
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。