你现在位置:首页>技术论文>数据通讯>正文
MSNDirect日志系统浅析
日期:2009-11-11 9:28:29 点击:
来源:本站整理
作者:
点击【】放大字体.

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

WW.W_PLCJS_COM-PLC-技.术_网

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

——可——编——程——控-制-器-技——术——门——户

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

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

private void btnTest_Click(object sender, EventArgs e)
WW.W_PLC※JS_C,OM-PL,C-技.术_网

{
——可——编——程——控-制-器-技——术——门——户

    Logger.Success("Success");
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    try
WW.W_PLCJS_COM-PLC-技.术_网

    {
WWcW_PLCJS_COM-PLC-技.术_网

        int a = 10,b=0;
plcjs.技.术_网

        a /=  b;
plcjs.技.术_网

    }
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    catch (Exception ee)
WWW_P※LCJS_COM-PLC-)技.术_网

    {
plcjs.技.术_网

        Logger.Error(ee, "error");
WWW_PLCJS@_COM%-PLC-技.术_网

        Logger.Error(ee);
WWW_P※LCJS_CO※M-PLC-技-.术_网

        Logger.Warning(ee, "Warning");
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

        Logger.Warning(ee);
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

        Logger.Warning("Warning1");
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

    }
WWW_PLCJS_COM-PLC-技.术_网

    Logger.Info("info");
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    Logger.Debug("Debug");
WWW_PLC※JS_COM-PmLC-技.术_网

}
plcjs.技.术_网

 

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

其输出方式也有4种之多,这4种方式分别为:

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

1VS2005/VS2008 输出对话框。  

WW.W_PLC※JS_C,OM-PL,C-技.术_网

WW.W_PLCJS_COM-PLC-技.术_网

2、控制台信息输出

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

plcjs.技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

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

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW_P※LCJS_COM-PLC-)技.术_网

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

4log文件输出

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

——可——编——程——控-制-器-技——术——门——户

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

WWW_P※LCJS_COM-PLC-)技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

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

WWW_P※LCJS_CO※M-PLC-技-.术_网

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

P.L.C.技.术.网——可编程控制器技术门户

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

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

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

WWcW_PLCJS_COM-PLC-技.术_网

相关代码如下:

WWW_PLCJS_COM-PLC-技.术_网

#region 用记事本打开已打开的文本文件
plcjs.技.术_网

    System.Diagnostics.Process Proc;
W1WW_P4LCJS_COM-PLC-技.术_网

    try
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    {
WWW_PLCJS_COM-PLC-技.术_网

        // 启动记事本
WWW_PLCJS@_COM%-PLC-技.术_网

        Proc = new System.Diagnostics.Process();                          
——可——编——程——控-制-器-技——术——门——户

        Proc.StartInfo.FileName = "notepad.exe";
WWW_PLC※JS_COM-PmLC-技.术_网

        Proc.StartInfo.Arguments = FileName;
WWW_PLC※JS_COM-PmLC-技.术_网

        Proc.StartInfo.UseShellExecute = false;                                    
WW.W_PLC※JS_C,OM-PL,C-技.术_网

        //Proc.StartInfo.RedirectStandardInput = true;
WWW_PL※CJS_COM-PLC-技.术_网

        //Proc.StartInfo.RedirectStandardOutput = true;    
——可——编——程——控-制-器-技——术——门——户

        Proc.StartInfo.CreateNoWindow = true;
P.L.C.技.术.网——可编程控制器技术门户

        Proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
——可——编——程——控-制-器-技——术——门——户

        Proc.Start();      
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

    }
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    catch
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    {
WW.W_PLCJS_COM-PLC-技.术_网

        Proc = null;
WWW_PLC※JS_COM-PmLC-技.术_网

    }
WWW_PL※CJS_COM-PLC-技.术_网

    #endregion
WWW.PLCJS.COM——可编程控制器技术门户

    #region 从记事本获取数据
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

    if (Proc != null)
P.L.C.技.术.网——可编程控制器技术门户

    {
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

        // 调用 API, 传递数据
WWW_PLCJS@_COM%-PLC-技.术_网

        while (Proc.MainWindowHandle == IntPtr.Zero)
WWW.PLCJS.COM——可编程控制器技术门户

        {
WW.W_PLCJS_COM-PLC-技.术_网

            Proc.Refresh();
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

        }
WWW.PLCJS.COM——可编程控制器技术门户

        ShowWindow(Proc.MainWindowHandle, 0);                        
WW.W_PLC※JS_C,OM-PL,C-技.术_网

        IntPtr vHandle = FindWindowEx(Proc.MainWindowHandle, IntPtr.Zero, "Edit", null);
WWW_PLCJS@_COM%-PLC-技.术_网

        const int WM_GETTEXTLENGTH = 0xE;
WWW_PLCJS_COM-PLC-技.术_网

        int intSize = SendMessageInt(vHandle, WM_GETTEXTLENGTH, 0, 0);
——可——编——程——控-制-器-技——术——门——户

        StringBuilder sb = new StringBuilder(intSize);
WWW_PL※CJS_COM-PLC-技.术_网

        const int WM_GETTEXT = 0xD;
——可——编——程——控-制-器-技——术——门——户

        SendMessageStr(vHandle, WM_GETTEXT, intSize, sb);
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

        Proc.CloseMainWindow();
WWW_PL※CJS_COM-PLC-技.术_网

        //Proc.Kill();
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

        byte[] bytData = System.Text.Encoding.Default.GetBytes(sb.ToString());  
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

        stream = new MemoryStream(bytData);        
WWW_PLC※JS_COM-PmLC-技.术_网

    }
P.L.C.技.术.网——可编程控制器技术门户

#endregion
WWW_PLC※JS_COM-PmLC-技.术_网

本新闻共2页,当前在第11 2  
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行