对一个复杂的需要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 输出对话框。
2、控制台信息输出
3、系统事件输出(可通过事件查看器浏览)
4、log文件输出
MSN Direct的日志系统,每小时便输出一个文件(因为对MSN Direct系统来说,一小时便能产生近10M数据),并且可设定日志文件保存的天数(默认2天),为了方便查阅我编写了一个日志浏览器(参见上图),不仅可分类查看,还可以进行关键字搜索。
在开发这个日志浏览器过程中,有一个技术问题困扰了我一段时间。对MSN Direct的日志系统,有两种写日志文件方式,一是文件句柄一直打开(直到一小时结束换另一个日志文件为止),二是输出一条便即时关闭,写下条时再打开。由于MSN Direct日志信息量巨大,所以为了优化性能选择了第一种方式。这就有一个问题,日志浏览器只能打开以前的日志进行浏览,而对当前的日志却无法打开,程序会提示你,该文件已被打开之类云云。你试着用其它文档编辑器去打开,你会发现大多数这类程序都无法打开,目前就我所知,WinHex和记事本程序可以(没有想到记事本程序还有这么强的的一面)。
从网上搜索“打开已打开文档”(也可以称为文件共享访问,不过有点特殊的是,前提是该文件已被独占打开了),未发现有价值的文章。当然也有釜底抽薪的做法,就是直接读取磁盘,对FAT32的文件系统来说,技术上我还可以实现,但是对NTFS格式的磁盘我就捉襟见肘了。
本打算深入研究一下记事本到底调用了什么API,后来囿于时间关系,所以采取了曲线救国的方式实现了该功能。
思路:先用记事本打开,然后从记事本获取信息,最后关闭记事本。不过很不爽的是,采用各种方法记事本的窗体还是无法隐藏(估计是初始打开的文件太大了)。
相关代码如下:
#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配置、二进制序列化等等技术细节只有留待日后有时间再细说了。
MSN项目简介
分享到:
相关推荐
NVIDIA 推出的 GPU Direct 就是一组提升 GPU 通信性能的技术。但 GPU Direct 受限于 PCI Expresss 总线协议以及拓扑结构的一些限制,无法做到更高的带宽,为了解决这个问题,NVIDIA 提出了 NVLink 总线协议。
禁用和开启DirectDraw加速,Direct3D 加速,AGP纹理加速批处理 在使用本程序前,请先确认你已经安装最新的显卡驱动程序 使用说明: 解压缩,XP系统用户直接运行BAT文件,WIN7系统用户,请右键以管理员身份运行,否则...
Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D教程Direct3D...
支持所有系统的direct X 11,一定要试试看呀,
在Direct3D游戏开发中,粒子系统实现喷泉效果,源代码
本书是基于DirectX9.0编写的,是介绍Direct3D技术的入门教程。它详细 介绍了Direct3D的背景、基本知识以及3D程序涉及的相关概念与技术。本书由浅入深,分为四个部分,第一部分介绍Direct3D的发展历史和基本知识,对...
Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X 11 3D 游戏Direct X ...
2010-Direct-Detection LADAR Systems2010-Direct-Detection LADAR Systems2010-Direct-Detection LADAR Systems2010-Direct-Detection LADAR Systems2010-Direct-Detection LADAR Systems2010-Direct-Detection ...
用DirectDraw编写动画程序 说起DirectDraw也许大多数人还不知其为何物,但一提到DirectX恐怕每一个Computer Fan 和Game Fan都再耳熟不过了。(什么!你没听说过DirectX!?Oh,My god!来人哪,拉 下去重责五十大板!)...
Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D教程c#版Direct3D...
采用directsound的DirectSoundFullDuplexCreate8创建全双工音频采集,启用AEC效果,让采集出的声音没有回声,即音频通话中的回声消除效果,全双工音频的启用在windowsXP下可用,若系统有声音输出,aec将会失败,启用...
《Direct3D技术内幕》所涉及的主题包括:DirectX 7基础,通过Direct3D和 T&L流水线的转换和照明,渲染对象图元,使用DirectInput与用户交互交控制力 反馈设备,纹理处理、雾化、alpha混合以及其他3D基本概念,高级...
微软公司从Windows98、Windows2000再到今天已经普及的WindowsXP、Windows7,每次推出新的操作系统都让人眼前一亮,Windows7更是给我们带来了很长一段时间的视觉冲击波。使得软件界面越来越受到软件开放厂商的重视,...
一个非常简单的例子系统,基于公告牌技术。DirectX编写,编译环境Visual Studio8 Windows7 DirectXSDK 2009
P2P Direct协议学习
Direct 3D 游戏编程入门教程(第2版)基于DirectX 9.0,是介绍Direct3D技术的入门教程,详细介绍了Direct3D的背景、基本知识以及3D程序设计的相关概念与技术。全书由浅入深,分为四个部分,第一部分介绍Direct3D的发展...
DirectUI示例程序,DirectUI示例程序,DirectUI示例程序,DirectUI示例程序,
Notify,事件通知对象,由于录音是一个长时间的过程,因此使用一个缓冲队列(多个缓冲区)接收数据,每当一个缓冲区满的时候,系统使用这个对象通知应用程序取走这个缓冲区,并继续录音。 以上三个对象是进行录音...
·全面系统的Direct3D基础知识; ·经典的地形渲染技术(高度图户外地形系统、BSP室内地形系统,纹理混合技术,连续精细度绘制技术); ·主流3D动画技术(蒙皮骨骼动画,Morphing动画技术); ·精彩的3D游戏特效...
Direct9C中文版,游戏必备,适合Direct11不支持的一系列大型网络游戏