IIS日志文件查看和分析

IIS日志文件查看和分析

老增 887 2021-06-09

IIS 日志文件位置

打开IIS管理器, 选择对应的站点, 在功能视图中看到“日志” 项,双击打开看到记录的地址。

一般为:%SystemDrive%\inetpub\logs\LogFiles

IIS 日志文件格式

一份典型的IIS日志文件如下:

#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2021-06-08 00:00:00
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2021-06-08 00:44:12 47.88.15.65 GET / - 80 - 101.89.162.33 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/63.0.3239.132+Safari/537.36 301 0 0 454
2021-06-08 00:44:13 47.88.15.65 GET / - 80 - 101.89.162.33 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/63.0.3239.132+Safari/537.36 301 0 0 403
2021-06-08 00:44:19 47.88.15.65 GET / - 80 - 73.186.22.141 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/91.0.4472.77+Safari/537.36+Edg/91.0.864.41 301 0 0 142
  • 前面三行是日志文件的基本信息
  • 第 4 行相当于表头, 从第5行开始是对应每一次请求的信息, 各个字段之间以空格分隔。

各个字段的前缀含义如下:剩下就好理解了

s-服务器操作。
c-客户端操作。
cs-客户端到服务器的操作。
sc-服务器到客户端的操作。

各个字段含义如下:

字段含义备注
date time记录时间这是两个字段, 记录的是UTC时间
s-ip服务端IP
cs-method请求方法
cs-uri-stem请求访问的页面, 即路由地址
cs-uri-queryquerystring
s-port服务器端口
cs-username用户名对于通过身份验证的用户,格式是“域\用户名”;对于匿名用户,是一个连字符 (-)。
c-ip客户端IP
cs(User-Agent)UA
sc-status返回状态码
sc-substatusHTTP子协议的状态
sc-win32-statusWin32® 状态
time-taken耗时

其他字段参考: https://www.cnblogs.com/zhoujie/p/iis1.html

对于一些简单的分析, 用文本文件如(sublime) 打开日志文件之后, 按照上面的字段理解做统计就可以。 例如用 Ctrl + F 查找工具, 可以简单的统计一些基本的信息:

  • 查看0点的请求数: 查找 2021-06-08 00:
  • 查看指定IP的请求数据
  • 查看指定UA的请求数据

而如果遇到一些复杂的统计需求, 比如

  • 统计频繁访问的IP (尤其面对网络攻击时)
  • 统计某时间段内的平均请求时间

或者更高自由度的定义的查询时, 就需要用到一些更高的工具, 例如 LogParser, 或者ELK

日志分析工具 LogParser

LogParser 是微软官方提供的IIS日志分析工具, 可以将日志转化为表格, 或者导入数据库中进行分析。

虽然依旧是手动操作,但是好歹支持了复杂的查询, 下面简单介绍一下这个软件的使用方法。

下载地址: https://www.microsoft.com/en-us/download/details.aspx?id=24659

下载安装之后, 打开安装路径, 双击 LogParser.exe 会弹出一个命令行窗口, 如果没有可自行打开命令行(CMD,PowerShell, Terminal)切换到安装目录下, 通过调用 LogParser.exe 来进行自定义的操作。 直接输入 .\LogParser 可打出帮助日志。

另外安装目录下的 LogParser.chm 是更详细的文档, 各种命令,参数的用法均在里面写有。 下面介绍两种常见的使用场景

将日志转成表格查看

如果日志数据量比较小, 并且只是简单查看日志, 可直接转成表格查看日志。

.\LogParser -o:DATAGRID "SELECT c-ip,cs-method,s-port,cs-uri-stem,sc-status,sc-win32-status,sc-bytes,cs-bytes,time-taken FROM test.log"

# 或者
.\LogParser -o:DATAGRID "SELECT * FROM test.log"

PS: 我在测试的过程中一直报错, 没找到原因。 但是导入数据库的话不会有这个问题

Task aborted.
Cannot open <from-entity>: Error setting locale info for codepage 65001:
  传递给系统调用的数据区域太小。

Statistics:
-----------
Elements processed: 0
Elements output:    0
Execution time:     0.00 seconds
将日志导到数据库中

导到数据库的话需要数据库对应的 ODBC 驱动。

所以无论导入什么数据库, 需要先安装对应的 ODBC 驱动。 在 ODBC 数据源管理程序中可以看到已经安装的驱动以及配置的数据源

  1. 通过用户名密码配置导入

    这个方案对于导入到 SqlServer, MySql 等数据库用起来比较合理, 更想平时的编程习惯

    .\LogParser "SELECT  *  FROM  'path\to\xxx.log'  to tableName" -o:SQL -server:192.168.0.219 -driver:"SQL Server" -database:iislogs -username:sa -password:mypassword -createtable:ON
    
    # 说明
    # .\LogParser LogParser.exe 的地址 
    # SELECT  *  FROM  'path\to\xxx.log' 查询语句。 也可单独查询字段, 注意此时字段中的非法字符会省略, 例如 s-ip -> sIp 等, 可能不同数据库的命名习惯不一样。 'path\to\xxx.log' 日志文件低地址
    # to tableName 导出的表名, 配合最后的参数课自动建表
    # -o:SQL 导出类型
    # -server:192.168.0.219 服务器地址
    # -driver:"SQL Server"  SQL Server 是已经安装好的 ODBC 驱动
    # database:iislogs 导入的数据库为: iislogs, 这个数据库需要先手动创建
    

程序会将日志数据导入数据库中, 这个过程比较缓慢, 可以同时去数据库查询导入的数据量, 导入完成后会输出如下日志:

Statistics:
-----------
Elements processed: 385015
Elements output:    385015
Execution time:     4850.01 seconds (01:20:50.01)
  1. 按 DSN 导入

    办法其实跟上面差不多, 只是要在 ODBC 数据源中配置好数据源(DSN), 命令可以省略为

    .\LogParser "SELECT  *  FROM  'path\to\xxx.log'  to tableName" -o:SQL -dsn:"my_sqlserver" -createtable:ON
    
    # -dsn:"my_sqlserver"  为在数据源管理中配好的数据源
    
Sqlite

原本为了方便, 想着直接用 DSN 导入 SQLite 查看的, 结果遇到了下面两个坑, 以作参考:

  • Sqlite 的 ODBC 驱动目前只找到了 Devart 公司的这个 , 是收费的, 有30天试用期

  • 安装后, 配置 ODBC 连接成功, 但是导出时会报错, 不知道是不是我配置不对的原因

    PS C:\Program Files (x86)\Log Parser 2.2>  .\LogParser "SELECT  *  FROM  u_ex210608.log to iislog" -i:IISW3C  -o:SQL -database:"mydata.db" -dsn:"sqlite" -createtable:ON
    Task aborted.
    Error connecting to ODBC Server
      SQL State:     IM002
      Native Error:  0
      Error Message: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定
      默认驱动程序
    
    Statistics:
    -----------
    Elements processed: 0
    Elements output:    0
    Execution time:     0.02 seconds
    
    # 已配置好数据源: sqlite
    # 已创建数据库文件: mydata.db