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-query | querystring | |
s-port | 服务器端口 | |
cs-username | 用户名 | 对于通过身份验证的用户,格式是“域\用户名”;对于匿名用户,是一个连字符 (-)。 |
c-ip | 客户端IP | |
cs(User-Agent) | UA | |
sc-status | 返回状态码 | |
sc-substatus | HTTP子协议的状态 | |
sc-win32-status | Win32® 状态 | |
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 数据源
管理程序中可以看到已经安装的驱动以及配置的数据源
-
通过用户名密码配置导入
这个方案对于导入到 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)
-
按 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