MSN Direct 日志系统浅析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

对一个复杂的需要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 用记事本打开已打开的文本文件

   

 
  1. System.Diagnostics.Process Proc;  
  2.  
  3.     try 
  4.  
  5.     {  
  6.  
  7.         // 启动记事本  
  8.  
  9.         Proc = new System.Diagnostics.Process();                            
  10.  
  11.         Proc.StartInfo.FileName = "notepad.exe";  
  12.  
  13.         Proc.StartInfo.Arguments = FileName;  
  14.  
  15.         Proc.StartInfo.UseShellExecute = false;                                      
  16.  
  17.         //Proc.StartInfo.RedirectStandardInput = true;  
  18.  
  19.         //Proc.StartInfo.RedirectStandardOutput = true;      
  20.  
  21.         Proc.StartInfo.CreateNoWindow = true;  
  22.  
  23.         Proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;  
  24.  
  25.         Proc.Start();        
  26.  
  27.     }  
  28.  
  29.     catch 
  30.  
  31.     {  
  32.  
  33.         Proc = null;  
  34.  
  35.     }  
  36.  
  37.     #endregion  
  38.  
  39.     #region 从记事本获取数据  
  40.  
  41.     if (Proc != null)  
  42.  
  43.     {  
  44.  
  45.         // 调用 API, 传递数据  
  46.  
  47.         while (Proc.MainWindowHandle == IntPtr.Zero)  
  48.  
  49.         {  
  50.  
  51.             Proc.Refresh();  
  52.  
  53.         }  
  54.  
  55.         ShowWindow(Proc.MainWindowHandle, 0);                          
  56.  
  57.         IntPtr vHandle = FindWindowEx(Proc.MainWindowHandle, IntPtr.Zero, "Edit"null);  
  58.  
  59.         const int WM_GETTEXTLENGTH = 0xE;  
  60.  
  61.         int intSize = SendMessageInt(vHandle, WM_GETTEXTLENGTH, 0, 0);  
  62.  
  63.         StringBuilder sb = new StringBuilder(intSize);  
  64.  
  65.         const int WM_GETTEXT = 0xD;  
  66.  
  67.         SendMessageStr(vHandle, WM_GETTEXT, intSize, sb);  
  68.  
  69.         Proc.CloseMainWindow();  
  70.  
  71.         //Proc.Kill();  
  72.  
  73.         byte[] bytData = System.Text.Encoding.Default.GetBytes(sb.ToString());    
  74.  
  75.         stream = new MemoryStream(bytData);          
  76.  
  77.     }  
  78.  
  79. #endregion  
  80.  

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

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

  

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

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

 

 






本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/324066,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
28天前
|
存储 关系型数据库 MySQL
|
1月前
|
SQL 数据采集 DataWorks
DataWorks产品使用合集之pyodps的线程限制是什么意思
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
13天前
|
监控
查看服务器/IIS日志、log、访问信息基本方法
除了手动查看,你也可以使用日志分析工具,如Log Parser、AWStats等,这些工具可以帮助你更方便地分析日志数据。
8 1
|
21天前
|
Java 测试技术 Apache
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
【7月更文挑战第4天】Apache Log4j 是一个广泛使用的 Java 日志框架,它允许开发者控制日志信息的输出目的地、格式和级别。Log4j 包含三个主要组件:Loggers(记录器)负责生成日志信息,Appenders(输出源)确定日志输出的位置(如控制台、文件、数据库等),而 Layouts(布局)则控制日志信息的格式。通过配置 Log4j,可以灵活地定制日志记录行为。
33 4
|
22天前
|
运维 Java Apache
Java中的日志框架:Log4j与SLF4J详解
Java中的日志框架:Log4j与SLF4J详解
|
28天前
|
SQL 运维 关系型数据库
|
28天前
|
存储 关系型数据库 MySQL
|
19天前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十八)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-下篇(详解教程)
【7月更文挑战第6天】本文介绍了如何使用Log4j2将日志输出到文件中,重点在于配置文件的结构和作用。配置文件包含两个主要部分:`appenders`和`loggers`。`appenders`定义了日志输出的目标,如控制台(Console)或其他文件,如RollingFile,设置输出格式和策略。`loggers`定义了日志记录器,通过`name`属性关联到特定的类或包,并通过`appender-ref`引用`appenders`来指定输出位置。`additivity`属性控制是否继承父logger的配置。
22 0
|
1月前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之sls日志告警调用函数计算,出现抛出的结果异常,是什么原因
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
19天前
|
JSON 应用服务中间件 开发工具
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置