zoukankan      html  css  js  c++  java
  • 使用LogParser分析日志

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

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

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

    logparseinput

    输出格式如下:

    logparseoutput

    通过 .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方式封装接口,大家很容易的就会得出类似下面的设计,类图如下:

    ClassDiagram1

    每一种类型的日志的分析主要是格式的不同,通过一个配置类去记录每种类型的不同配置,根据配置去生成相应的输入、输出格式类。下面我们就来做个简单的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章节.

    LogParserQuerySyntax

    注意: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: 功能強大且威名遠播的記錄分析器

    欢迎大家扫描下面二维码成为我的客户,为你服务和上云

  • 相关阅读:
    面试官:Redis 有哪些拓展方案?
    面试官:为什么要合并 HTTP 请求?
    Java 调用第三方接口,实战来了!
    Java 如何模拟真正的并发请求?
    如何搭建一台永久运行的个人服务器?试试这个黑科技!
    vs2005 sp1 出来啦!!
    2007年第一帖
    xp pro sp2支持多个用户同时终端连接
    msn中实现 "添加一个活动或游戏邀请"
    softether
  • 原文地址:https://www.cnblogs.com/shanyou/p/2073427.html
Copyright © 2011-2022 走看看