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,这种系统只能将日志保存为文本文件 ...
一周排行
  • 一:非归档模式下丢失或者损坏数据文件在非归档模式下损坏或者丢失数据文件,如果有相应的备份,在一定程度上是可以恢复的,但是如果oracle过多的读写操作记录信息而导致redo重写的时候,恢复就会停滞,非归档下系统能自动 ...
  • 自己曾经写过一个脚本来自动检测死锁信息,判断是否是新的死锁,死锁信息的保存等死锁检测,其实它的灵感还是来源zabbix插件的功能 今天一朋友说Zabbix 死锁信息不能检测,根本没有返回值: 打开zabbix ser ...
  • 最近看了很多关于职场的书,但是我觉得其中<杜拉拉升职记>.<潜伏在办公室>这两个系列还是不错的.这些书都讲到了一些职场的潜规则,结合自己的一些工作经验,我总结了以下几点,我认为是比较重要的.1 ...
  • Centos6.7简单搭建dns服务器
    Linux下dns服务主要安装包bind                #dns服务安装包 ...
  • 今天主要学习了一些路由器和交换机的命令,下面举例来说明:1.查看运行配置文件:Router#show running-config 运行配置文件running-config位于路由器的RAM中,存放的是路由器当前使用 ...
  •  前端web-----日志收集服务器---[rsync/scribe]---中继----日志接收机(HDFS网关接收机/MFS)---put---HDFS大集群/小集群---日志清洗---结果入库---页面展现--- ...
  • 上代码:publicstaticvoid main(String[] args){int j =0;for(int i =0; i <100; i++){ j = j++;System.out.println( ...
  • 博客话题我的老师———一个普通又平凡的老师
      感谢51CTO提供这样一个平台,来写一写我值得尊敬的一个老师,此篇不提技术.写在教师节 ...
  • //设置导航栏全透明 self.navigationController.navigationBar.barStyle = UIBarStyleBlack; [self.navigationController.na ...
  • IOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换.1.RootVie ...