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,这种系统只能将日志保存为文本文件 ...
一周排行
  • 说明: 本文采用一个50M大小的日志文件进行测试.日志文件名:log.txt.gz.文件行数:208363方法1:(split分割)语法:split [-<行数>][-b <字节>][-C & ...
  • 正如"打工皇帝"唐骏说:"我觉得有两种人不要跟别人争利益和价值回报.第一种人就是刚刚进入企业的人,头5年千万不要说你能不能多给我一点儿工资,最重要的是能在企业里学到什么,对发展是不是有利 ...
  • ............接续:   分享exchange 2007系列之二:Windows 2008平台部署exchange 2007 sp1 CCR 参考整理(1)  ======================= ...
  • 怎样在AIX 5L 5.1中进行64位和32位内核的切换?环境 AIX 5L 5.1, RS/6000, pSeries问题 怎样在AIX 5L 5.1中进行64位和32位内核的切换 解答 首先用如下命令确定当前的所 ...
  • linux环境下,怎么确定nginx是以那个config文件启动的?输入命令行: ps -ef | grep nginx 摁回车,将出现如下图片:master process 后面的就是 nginx的目录.
  • 一.vi.vim介绍文本编辑器分为:(1)基于图形界面,如gedit.geany等:(2)基于命令行,如nano.vi.joe等:每个命令行界面的文本编辑器都有各自不同的快捷键,比如nano的保存为CTRL+W,vi ...
  • 命令名称:gzip命令英文愿意:GNU zip命令所在路径:/bin/gzip执行权限:所有用户语法:gzip [文件]功能描述:压缩文件压缩后文件格式:.gz.gz .zip .rar[window]命令名称:gu ...
  • 编译:检测代码的语法合法性,随后生成.o文件. 链接:把项目中所有的.out合并,生成一个可执行文件. OC编译连接过程 .m---->.o---->.out  . 检测源文件的语法合法性,生成.o文件, ...
  • 一.始终隐藏状态栏 如果在App中需要状态栏一直是隐藏着的,可以在AppDelegate的application:didFinishLaunchingWithOptions:函数中进行设置,比如下面这段示意代码可以让 ...
  • 安装完NTFSforMac应用列表里没有
    粉丝提问:我一个月前装了NTFS for Mac.当时装完后应用列表里没有它,但是移动硬盘 ...