使用LogParser分析日志

系统运维,少不了分析系统日志,微软有个工具Log Parser可以帮助你分析日志。它功能强大,使用简单,可以分析基于文本的日志文件、XML 文件、CSV(逗号分隔符)文件,以及操作系统的事件日志、注册表、文件系统、Active Directory。它可以像使用 SQL 语句一样查询分析这些数据,甚至可以把分析结果以各种图表的形式展现出来。

Log Parser可以到微软的网站下载,安装完后,就会有命令行的执行程序LogParser.exe,供API使用的LogParser.dll及说明文件LogParser.chm,里面还会有一些Sample Code可以供参考.

Log Parser支持的格式很多,输入格式如下:

输出格式如下:

通过 .NET Framework 的 COM interop (COM 交互操作)特性,可以很方便地在 .NET 应用程序中使用 Log Parser,.NET Framework 的 COM interop 是通过 Runtime Callable Wrappers (RCW) 来实现对 COM 的操作的,RCW 是 .NET 中的一个类。

现在要玩的是,怎么用LogParser.dll来开发更适合的API,其实命令行的做法就可以满足大部份的需求,但有时有时特殊的判断,在命令行模式下就有难度了,比如说,我们需要用程序自动去处理大批量的日志文件分析等,所以这时用API就方便很多.

下面我们用.NET封装下LogParser的Com接口,从LogParser的操作流程来看,无非就是不同格式文件的日志文件的输入,通过类SQL的分析输出我们需要的结果,核心算法就是类似于

          // 初始化LogQuery 对象 
            var logQuery = new LogQueryClass();
            // 缓存输入上下文   
            if (myInputContext == null)    
                myInputContext = GetInputContext();    
            // 执行查询   
            var oRecordSet = logQuery.Execute(query, myInputContext);    
 
             // 浏览记录    
            for (; !oRecordSet.atEnd(); oRecordSet.moveNext())    
            {    
                // 获取当前的记录    
                ILogRecord logRecord = oRecordSet.getRecord();              
            }    
            oRecordSet.close();

使用OOP方式封装接口,大家很容易的就会得出类似下面的设计,类图如下:

每一种类型的日志的分析主要是格式的不同,通过一个配置类去记录每种类型的不同配置,根据配置去生成相应的输入、输出格式类。下面我们就来做个简单的Demo来演示下IIS日志分析。

       private void QryData()
      {

          //构造查询语句
          StringBuilder query = new StringBuilder("SELECT ");
          if (txtRecord.Text.Trim().Length > 0)
          {
              int rec = 0;
              if (int.TryParse(txtRecord.Text.Trim(), out rec))
              {
                  if (rec > 0)
                  {//如果有值,而且数字大于0,则取数字取得Top n
                      query.Append(" TOP ");
                      query.Append(rec);
                  }
              }
          }
          if (btnLocalTime.Checked)
          {
              query.Append("UserIP,Username,TO_LOCALTIME(TO_TIMESTAMP(date,time)) as LocalTime");
          }
          else
          {
              query.Append("UserIP,Username,TO_TIMESTAMP(date,time) as LocalTime");
          }

          query.Append(",ServiceInstance,HostName,ServerIP,TimeTaken,BytesSent,bytesReceived,StatusCode" +
                       ",Win32StatusCode,RequestType,Target,Parameters " +
                       "FROM ");
          query.Append(openFileDialog1.FileName);
          if (txtWhere.Text.Trim().Length > 0)
          {
              query.Append(" Where ");
              query.Append(txtWhere.Text.Trim());
          }

          IISLogParserConfig config = new IISLogParserConfig()
          {
               Codepage =936,
              
          };
          IISLogParser logParser = new IISLogParser(config);
          DataTable dt = logParser.RunQuery(query.ToString());
          dataGridView1.DataSource = dt;
      }

这段Code就是把Log读进来,并用DataGrid去显示,如果IIS Log里的时间不是当地时间,还可用TO_LOCALTIME做时间转换,看这Script,还可以用 Select Top n from 文件路径,这里有一点要注意,路径不能有中文名称,Query有那些可以用,可以参考说明文件的Query Syntax章节.

注意:LogParser.dll是需要注册的,如果没有注册,是会抛出错误信息,注册的方式很简单,也就是注册Com组件,在命令行模式下 : C:\LogParser>regsvr32 LogParser.dll

代码下载:LogParser.zip

相关文章:

一个强大的LogParser的UI工具--logparserlizard简介

使用logparser做 房途网日志(Nginx)分析

Log Parser (分析多種 Log 格式的超強工具)

使用 Log Parser 將 IIS LOG 轉入 SQL 2005 Express

Examples (SQL) queries for IIS Analysis

用LogParser对IIS 日志进行分析

Log Parser: 功能強大且威名遠播的記錄分析器

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GuZhenYin

SignalR系列续集[系列6:使用自己的连接ID]

前言 老规矩,前言~,在此先道个歉,之前的1-5对很多细节问题都讲的不是很详细,也有很多人在QQ或者博客问我一些问题 所以,特开了这个续集.. - -, 讲一些...

517100
来自专栏Golang语言社区

关于JSON.stringify和Unicode编码,需要注意的几点

1JSON.stringify会自动把所要转换内容中的汉字转换为Unicode编码 2浏览器间有差别,个别浏览器会把将要提交表单内容中的Unicode编码自动转...

42180
来自专栏大内老A

如何通过自定义MessageFilter的方式利用按键方式操作控件滚动条[附源代码]

很长一段时间内,一直在做一个SCSF(Smart Client Software Factory)的项目,已经进入UAT阶段。最近,用户提出了一个要求:需要通过...

31170
来自专栏葡萄城控件技术团队

异步陷阱之死锁篇

提倡异步编程旨在给用户更好的前端体验,但异步编程也让学习成本和犯错几率大大升高,其中最常见且最难处理的就是死锁。 何谓“死锁”,英文术语称“Deadlock”,...

31790
来自专栏.NET技术

Visual Studio Package 插件开发之自动生成实体工具

  这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到【生成实体】心里可能会暗想,T4模板都可以做了、动软不是已经做了么、不就是...

19930
来自专栏木宛城主

ASP.NET那点不为人知的事(三)

有了以下的知识: ASP.NET那点不为人知的事(一) ASP.NET那点不为人知的事(二) 想必开发一个小型服务器以不是问题了,功能补复杂,能够响应...

21690
来自专栏跟着阿笨一起玩NET

DataTable的AcceptChange方法为什么不能在Update之前?

本人转载http://www.cnblogs.com/telnet_mike/archive/2011/08/29/2159013.html

16410
来自专栏恰童鞋骚年

ASP.Net请求处理机制初步探索之旅 - Part 3 管道

开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest()、Ht...

16720
来自专栏Golang语言社区

关于JSON.stringify和Unicode编码,需要注意的几点

1JSON.stringify会自动把所要转换内容中的汉字转换为Unicode编码 2浏览器间有差别,个别浏览器会把将要提交表单内容中的Unicode编码自动转...

42340
来自专栏逸鹏说道

Python3 与 C# 并发编程之~ 上篇

其实逆天现在Coding已经是80%变成Python了,20%才是Net,也不确定是否一直在Net界干下去,所以只能尽可能的在说新知识的同时,尽量把脑子里面Ne...

13640

扫码关注云+社区

领取腾讯云代金券