您现在所在的是:

工控软件

回帖:0个,阅读:595 [上一页] [1] [下一页]
884
yefanqiu
文章数:33
年度积分:50
历史总积分:884
注册时间:2004/8/19
发站内信
发表于:2009/11/9 23:05:02
#0楼
对一个复杂的需要24小时连续运行的系统来说,日志系统必不可少,它为系统调试、错误定位提供最有力的支持。msn direct就是一个这样的系统,不仅24小时连续运行,还会不断地从不同的web server获取诸如交通、天气、新闻、股价等信息,并把获得数据进一步处理后,存入到数据库,最后msn direct调度程序再根据不同的策略从数据库提取数据,并把它们通过广播转发出去,以上任一个环节出问题,就会导致信息发送失败,而详尽的日志文件便能为此类问题的定位提供第一手信息,其重要性不言而喻。
msn direct输出的信息分为5类:成功(success)、错误(error)、警告(warning)、信息(info)、调试(debug);
相关示例代码如下(相关接口函数我进行了调整和简化,去掉了eventcode参数):
code highlighting produced by actipro codehighlighter (freeware)http://www.codehighlighter.com/-->;private void btntest_click(object sender, eventargs e)
{
   logger.success(success);
   try
   {
       int a = 10,b=0;
       a /=  b;
   }
   catch (exception ee)
   {
       logger.error(ee, error);
       logger.error(ee);
       logger.warning(ee, warning);
       logger.warning(ee);
       logger.warning(warning1);
   }
   logger.info(info);
   logger.debug(debug);
}

其输出方式也有4种之多,这4种方式分别为:
1、vs2005/vs2008 输出对话框。  
2、控制台信息输出
3、系统事件输出(可通过事件查看器浏览)
4、log文件输出
msn direct的日志系统,每小时便输出一个文件(因为对msn direct系统来说,一小时便能产生近10m数据),并且可设定日志文件保存的天数(默认2天),为了方便查阅我编写了一个日志浏览器(参见上图),不仅可分类查看,还可以进行关键字搜索。
在开发这个日志浏览器过程中,有一个技术问题困扰了我一段时间。对msn direct的日志系统,有两种写日志文件方式,一是文件句柄一直打开(直到一小时结束换另一个日志文件为止),二是输出一条便即时关闭,写下条时再打开。由于msn direct日志信息量巨大,所以为了优化性能选择了第一种方式。这就有一个问题,日志浏览器只能打开以前的日志进行浏览,而对当前的日志却无法打开,程序会提示你,该文件已被打开之类云云。你试着用其它文档编辑器去打开,你会发现大多数这类程序都无法打开,目前就我所知,winhex和记事本程序可以(没有想到记事本程序还有这么强的的一面)。
从网上搜索“打开已打开文档”(也可以称为文件共享访问,不过有点特殊的是,前提是该文件已被独占打开了),未发现有价值的文章。当然也有釜底抽薪的做法,就是直接读取磁盘,对fat32的文件系统来说,技术上我还可以实现,但是对ntfs格式的磁盘我就捉襟见肘了。
本打算深入研究一下记事本到底调用了什么api,后来囿于时间关系,所以采取了曲线救国的方式实现了该功能。
思路:先用记事本打开,然后从记事本获取信息,最后关闭记事本。不过很不爽的是,采用各种方法记事本的窗体还是无法隐藏(估计是初始打开的文件太大了)。
相关代码如下:
code highlighting produced by actipro codehighlighter (freeware)http://www.codehighlighter.com/-->;#region 用记事本打开已打开的文本文件
   system.diagnostics.process proc;
   try
   {
       // 启动记事本
       proc = new system.diagnostics.process();                          
       proc.startinfo.filename = notepad.exe;
       proc.startinfo.arguments = filename;
       proc.startinfo.useshellexecute = false;                                    
       //proc.startinfo.redirectstandardinput = true;
       //proc.startinfo.redirectstandardoutput = true;    
       proc.startinfo.createnowindow = true;
       proc.startinfo.windowstyle = system.diagnostics.processwindowstyle.hidden;
       proc.start();      
   }
   catch
   {
       proc = null;
   }
   #endregion
   #region 从记事本获取数据
   if (proc != null)
   {
       // 调用 api, 传递数据
       while (proc.mainwindowhandle == intptr.zero)
       {
           proc.refresh();
       }
       showwindow(proc.mainwindowhandle, 0);                        
       intptr vhandle = findwindowex(proc.mainwindowhandle, intptr.zero, edit, null);
       const int wm_gettextlength = 0xe;
       int intsize = sendmessageint(vhandle, wm_gettextlength, 0, 0);
       stringbuilder sb = new stringbuilder(intsize);
       const int wm_gettext = 0xd;
       sendmessagestr(vhandle, wm_gettext, intsize, sb);
       proc.closemainwindow();
       //proc.kill();
       byte[] bytdata = system.text.encoding.default.getbytes(sb.tostring());  
       stream = new memorystream(bytdata);        
   }
#endregion
   
如果哪个网友有更好的解决方案,忘不吝告知,谢谢!
msn direct日志系统可通过下面4个属性(我新添加),以决定以哪种方式输出日志信息。
   logger.tracelogenable = true;
   logger.consolelogenable = true;
   logger.eventlogenable = true;
logger.filelogenable = true;    
当然以上对msn direct日志系统介绍,仅仅是皮毛,诸如xml配置、二进制序列化等等技术细节只有留待日后有时间再细说了。
[URL=http://blog.csdn.net/yefanqiu/archive/2009/09/28/4602886.aspx]
msn项目简介
[/URL]
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=105216&Name=yefanqiu

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003