MSNDirect日志系统浅析

对一个复杂的需要24小时连续运行的系统来说,日志系统必不可少,它为系统调试、错误定位提供最有力的支持。MSN Direct就是一个这样的系统,不仅24小时连续运行,还会不断地从不同的Web Server获取诸如交通、天气、新闻、股价等信息,并把获得数据进一步处理后,存入到数据库,最后MSN Direct调度程序再根据不同的策略从数据库提取数据,并把它们通过广播转发出去,以上任一个环节出问题,就会导致信息发送失败,而详尽的日志文件便能为此类问题的定位提供第一手信息,其重要性不言而喻。

MSN Direct输出的信息分为5类:成功(Success)、错误(Error)、警告(Warning)、信息(Info)、调试(Debug);

相关示例代码如下(相关接口函数我进行了调整和简化,去掉了EventCode参数):

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 输出对话框。

MSNDirect日志系统浅析

2、控制台信息输出

MSNDirect日志系统浅析

3、系统事件输出(可通过事件查看器浏览)

MSNDirect日志系统浅析

4、log文件输出

MSNDirect日志系统浅析

MSN Direct的日志系统,每小时便输出一个文件(因为对MSN Direct系统来说,一小时便能产生近10M数据),并且可设定日志文件保存的天数(默认2天),为了方便查阅我编写了一个日志浏览器(参见上图),不仅可分类查看,还可以进行关键字搜索。

在开发这个日志浏览器过程中,有一个技术问题困扰了我一段时间。对MSN Direct的日志系统,有两种写日志文件方式,一是文件句柄一直打开(直到一小时结束换另一个日志文件为止),二是输出一条便即时关闭,写下条时再打开。由于MSN Direct日志信息量巨大,所以为了优化性能选择了第一种方式。这就有一个问题,日志浏览器只能打开以前的日志进行浏览,而对当前的日志却无法打开,程序会提示你,该文件已被打开之类云云。你试着用其它文档编辑器去打开,你会发现大多数这类程序都无法打开,目前就我所知,WinHex和记事本程序可以(没有想到记事本程序还有这么强的的一面)。

从网上搜索“打开已打开文档”(也可以称为文件共享访问,不过有点特殊的是,前提是该文件已被独占打开了),未发现有价值的文章。当然也有釜底抽薪的做法,就是直接读取磁盘,对FAT32的文件系统来说,技术上我还可以实现,但是对NTFS格式的磁盘我就捉襟见肘了。

本打算深入研究一下记事本到底调用了什么API,后来囿于时间关系,所以采取了曲线救国的方式实现了该功能。

思路:先用记事本打开,然后从记事本获取信息,最后关闭记事本。不过很不爽的是,采用各种方法记事本的窗体还是无法隐藏(估计是初始打开的文件太大了)。

相关代码如下:

#region 用记事本打开已打开的文本文件

  1. System.Diagnostics.Process Proc;
  2. try
  3. {
  4. // 启动记事本
  5. Proc = new System.Diagnostics.Process();
  6. Proc.StartInfo.FileName = "notepad.exe";
  7. Proc.StartInfo.Arguments = FileName;
  8. Proc.StartInfo.UseShellExecute = false;
  9. //Proc.StartInfo.RedirectStandardInput = true;
  10. //Proc.StartInfo.RedirectStandardOutput = true;
  11. Proc.StartInfo.CreateNoWindow = true;
  12. Proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
  13. Proc.Start();
  14. }
  15. catch
  16. {
  17. Proc = null;
  18. }
  19. #endregion
  20. #region 从记事本获取数据
  21. if (Proc != null)
  22. {
  23. // 调用 API, 传递数据
  24. while (Proc.MainWindowHandle == IntPtr.Zero)
  25. {
  26. Proc.Refresh();
  27. }
  28. ShowWindow(Proc.MainWindowHandle, 0);
  29. IntPtr vHandle = FindWindowEx(Proc.MainWindowHandle, IntPtr.Zero, "Edit", null);
  30. constint WM_GETTEXTLENGTH = 0xE;
  31. int intSize = SendMessageInt(vHandle, WM_GETTEXTLENGTH, 0, 0);
  32. StringBuilder sb = new StringBuilder(intSize);
  33. constint WM_GETTEXT = 0xD;
  34. SendMessageStr(vHandle, WM_GETTEXT, intSize, sb);
  35. Proc.CloseMainWindow();
  36. //Proc.Kill();
  37. byte[] bytData = System.Text.Encoding.Default.GetBytes(sb.ToString());
  38. stream = new MemoryStream(bytData);
  39. }
  40. #endregion

如果哪个网友有更好的解决方案,忘不吝告知,谢谢!

MSN Direct日志系统可通过下面4个属性(我新添加),以决定以哪种方式输出日志信息。

  1. Logger.TraceLogEnable = true;
  2. Logger.ConsoleLogEnable = true;
  3. Logger.EventLogEnable = true;
  4. gger.FileLogEnable = true;

当然以上对MSN Direct日志系统介绍,仅仅是皮毛,诸如XML配置、二进制序列化等等技术细节只有留待日后有时间再细说了。

更多相关文章
  • 日志信息详细程序:日志级别子系统:facility(设施)动作(action)linux上的日志系统:    syslog    syslog-ngsyslog服务进程:    syslogd:系统,非内核产生的信息    klogd:内核,专门负责记录内核产生的日志信息kernel  --> ...
  • 配置思科的日志系统
    配置思科的日志系统    企业级日志系统是记录整个企业级网络设备(包括服务器.路由器.交换机.防火墙.入侵检测.入侵防御等)所产生的行为的,对发现和修复网络故障.安全违例事件的追查.网络犯罪证取.性能监视等有着不可忽视的作用.所以,收集各种网络设备上的日志有着重要的价值.实现收集日志需理解如下知识点 ...
  • 一. syslog简介        syslog是一种工业标准的协议,可用来记录设备的日志.在UNIX系统,路由器.交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件.管理者可以通过查看系统记录,随时掌握系统状况.UNIX的系统日志是通过syslogd这个进程记录 ...
  • 服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障是不重启的,半年一年的日志放到一个文件会导致文件过大 .及时保存,程序故障导致异常退出,此时需要通过 ...
  • Linux上的日志系统:syslog
    Linux上的日志系统:syslog日志系统记录了系统每天发生的各种各样的事情,用户可以通过它来检查发生错误的原因,或者寻找受到外来攻击时外来人员留下来的痕迹.日志的主要功能是审计和检测.它还可以实时地监控系统的状态.检测和追踪入侵者.根据信息详细程序的不同可以把日志分级别,就叫日志级别.产生日志的 ...
  • rsyslog日志系统
    记录应用程序和内核的日志系统概念:facility:设施,从功能或程序上对日志进行分类,并由专门的工具负责记录相应的日志信息:authauthprivcrondaemonkernlprmailmarknewssecuritysysloguseruucplocal0 - local7priority: ...
  • 日志系统的组成
    出自Alibaba Webx框架手册baobao的总结,写的非常好 http://openwebx.org/       在某些遗留系统中,有些代码直接用到了Log4j API(例如Log4j Appender).假如,我们仍然希望SLF4J以logback作为日志系统,但是保持这些老代码继续不变地 ...
  • linux日志系统
    Linux日志系统   日志:是记录了系统发生变动时所记录下的历史,通常是按市价序列将发生的时间予以记录的文件.日志中记录了事件发生的时间及事件内容:也记录了日志中事件的级别,也就是事件的关键性程度,如log,level等级别   早期有一种日志系统叫做syslog,这种系统只能将日志保存为文本文件 ...
一周排行
  • 联创公司化运作系统课程第八期落地师训练圆满结束转自中小企业规范化管理网 通讯员 小陈2015年10月7日,联创世纪教育训练集团独家首创的公司化运作系统课程第八期落地师训练,经过四天四晚紧张的学习训练,于17日 ...
  • 如果你玩过路由器的话,就知道路由器里面那些很好玩的命令缩写.例如,"sh int" 的意思是 "show interface". 现在 Windows 2000 也有了类似界面 ...
  • Linux启动流程分析  当你按下开机键后,BIOS就开始进行自检,主要是检测硬件(CPU.内存等)是否完好.   等BIOS自检完成以后,根据BIOS中的设置(也就是设置的开机启动项),就会把系统的引导权交给相应的 ...
  • elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以 ...
  • 公司里最常见的场景之一:一个销售去见了客户,带着一肚子郁闷地回到公司,冲到老板的房间说:老板啊,我今天去见那个某某客户了,人家要咱降价啊.您拿个主意吧,咱降还是不降啊? 如果你是老板,这个时候你会怎样回答呢? 第一, ...
  • 把自己09年的ticket总量整理了下,以回顾下这一年的历程.随着工作熟练程度及其他因素,自己的故障处理效率不断提升.这里录入的最多只有其中的一半数量而已.因为有时候一边要处理问题,一边要录入系统是很麻烦的一件事,而 ...
  •   在if分支判断语句里的条件判断语句不一定就是一个表达式,可以是多个(布尔)表达式的组合关系运算,这里如何使用更多的关系表达式构建出一个比较复杂的条件判断呢?这里需要再了解一下逻辑运算的基础知识.逻辑关系运算有以下 ...
  • var str="welcome to sichuan! chengdu longquanyi!!!"; //下面所有的举例都将以这句话作为例子,consle.log效果自己在控制台查看吧 //一 ...
  • 之前做的实验:Building configuration...Current configuration : 1693 bytes!version 12.4service timestamps debug date ...
  • 移动应用的UI设计就好似达摩克利斯之剑,一方面,一个视觉.交互.体验良好的UI可以加强应用在用户心目中的形象和识别性.而另一方面,一个体验糟糕的UI设计不仅无法让用户沉浸在应用中,还会造成用户对应用产生厌恶感.所以说 ...