适用于: Internet Information Services 本文介绍使用 Microsoft LogParser 分析 Internet Information Services (IIS) 日志来确定性能问题的故障排除步骤。 命令提示符 IIS HTTP 状态代码的 基础知识 SQL 查询的基础知识 本文可帮助你分析 IIS 日志文件,以确定在 IIS 上托管的应用程序发生故障或遇到性能问题时的原因。 在开始之前,请务必注意,默认情况下不会启用 IIS 可以记录的所有字段。 例如, 默认情况下未启用“已发送 的字节数”和 “接收 的字节数”,但在排查性能问题时非常有用。 因此,包含这些附加字段的最佳时机是在遇到系统问题之前。 因此,请确保已启用这些附加字段。 它们将帮助你在出现问题时找到解决方案。 有关如何启用这些字段的详细信息,请参阅 windows-2008/" data-linktype="external" style="box-sizing: inherit; outline-color: inherit; cursor: pointer; overflow-wrap: break-word; background-color: rgba(0, 0, 0, 0); outline-style: initial; outline-width: 0px;">修改 Windows 2008 中的 IIS 7 日志数据。 作为系统管理员,你将开始听到 IIS 上托管的系统用户的报告,指出响应速度缓慢。 其中一些人提到,Web 浏览器在访问您的网站时只是超时或停止完全响应。 跳转到操作中并回收工作进程。 一切似乎都像平常一样工作。 但是,你不能接受作为解决方案,需要知道它发生的原因,但不知道从何处开始。 用户没有提供详细信息,如错误代码、屏幕截图。更糟糕的是,你没有性能数据,无法将刚刚发生的情况与正常性能进行比较。 在许多情况下,其他新问题会让你无法认真分析根本原因。 Microsoft LogParser 是一个很好的工具,易于使用。 在许多情况下,该工具将帮助你快速深入了解服务器上发生的情况,并可能帮助你确定问题所在。 可将 LogParser 收集的信息传递给数据库团队、网络团队或开发人员以进行更多分析。 默认情况下,IIS 日志文件位于以下目录中: IIS 7 及更高版本: %SystemDrive%\inetpub\logs\LogFiles IIS 6 及更早版本: %WinDir%\System32\LogFiles 在此疑难解答中,我将使用 IIS 8。 打开 IIS 管理器并选择“站点”,如图 1 所示。 这将显示服务器上托管的每个网站的 ID。 需要此 ID 来确定要分析的 W3SVC* 目录。 打开 Windows 资源管理器,然后导航到遇到性能问题的网站的 IIS 日志文件所在的目录。 图 2 显示可能的情况。 IIS 日志文件可能非常大;例如在图 2 中,日志文件 u_ex12101858.log 的大小接近 100MB。 由于这些日志文件可能非常大,并且包含成千上万个单独的日志文件条目,因此手动查看每个文件以查找错误并不是一个好方法,而且与你所投入的时间相比,返回的结果却很少。 这时,LogParser 就成了故障排除工具库中不可或缺的工具。 第一步是确定哪些日志文件可能包含错误。 例如,如果客户在 2012 年 6 月 3 日抱怨性能问题,日志文件可能是 u_ex120603.log,其中: 注意:上述示例假定 IIS 日志记录配置为每天轮换日志文件,这是默认设置。 如果你将该 IIS 设置更改为以不同时间间隔(如每周或每小时)轮换日志文件,那么日志文件名会有所不同。 有关 IIS 日志文件名称的语法的详细信息,请参阅 IIS 日志文件格式。 备注 默认情况下,IIS 日志中的日期和时间使用 GMT 存储;在确定哪些日志包含错误时,需要考虑到这一点。 也就是说,可使用 LogParser 的 确定包含错误的 IIS 日志文件后,应将它们复制到可进行分析的位置。 这是一个可选步骤,但不建议在 IIS 服务器上分析日志,因为 LogParser 查询的运行时间可能很长,而且如果日志文件很大,LogParser 可能会争用系统资源。 例如,可将 IIS 日志复制到个人计算机上已复制 LogParser 文件的文件夹中,我通常就是这样分析日志文件的。 图 3 举例说明了我在创建本文时存储日志文件的位置。 下载 LogParser 后,即可开始分析。 我运行的第一个查询如图 4 所示。 结果可让你大致了解 IIS 对请求的响应情况。 图 4:LogParser 查询(sc-status 和 sc-substatus) 结果中值得关注的要点如下: 200 和 304 HTTP 状态代码(成功请求)之间的比率 500 HTTP 状态代码(失败请求)的数量 下面将介绍每个状态代码的意义。 200 和 304 HTTP 状态代码之间的比率很重要,因为它显示有多少请求是从客户端缓存中检索的,而不是直接从服务器检索的。 图 4 中的结果显示,有 3,920,658 个请求的 HTTP 状态代码为 200。 这意味着所请求文件每次都是从服务器提供的。 相比之下,有 178,705 个请求的 HTTP 状态代码为 304。 这意味着所请求文件是从本地缓存中检索的。 换句话说,95.5% 的请求是从服务器处理的。 缓存可对系统性能带来一些非常积极的影响;有关静态和动态压缩的详细信息,请参阅在 IIS 7 中配置 HTTP 压缩一文。 HTTP 500 状态代码可能表示系统存在严重问题。 HTTP 500 错误根本原因可能对系统造成的影响程度从毫无影响到工作进程崩溃不等。 因此在看到此类代码时,应执行图 5 所示的查询以查找导致 500 HTTP 状态代码的请求。 图 5:LogParser 查询(含 500 sc-status 的 cs-uri-stem) 这些结果显示了请求时以 HTTP 500 状态代码响应的文件的路径和名称。 此类信息对开发团队非常有用。 例如,开发团队可以进一步调查该特定代码,并搜索 让我们进一步分析此示例,重点关注 HTTP 500 状态代码的主要贡献者。 我们很想知道这些错误是什么时候发生的,因为可以利用此信息检查依赖项是否同时出现问题。 图 6:LogParser 查询(含 500 sc-status 的 cs-uri-stem) 图 6 中的部分结果限制了问题的日期范围。 此信息可以传递给网络、数据库、操作系统管理员和开发团队,以检查同一时间是否发生了任何其他情况。 例如:08:00 至 09:59:59 GMT 和 14:00:00 至 14:59:59 GMT 之间是否有其他问题? 下一组 LogParser 查询使用以下字段,这可能会更好地帮助我们了解性能问题: 如前所述,现在花点时间来请求启用 sc-bytes 和 cs-bytes 字段,或者自行启用(如果可能)。 可通过这些宝贵信息深入了解系统及其行为。 以图 7 为例。 可以看到,平均时间只有几百毫秒,相当不错。 但是,看看最长耗时,那可花了太多时间。 图 7:LogParser 查询(MAX 和 AVG time-taken) 我知道你已经在问自己下一个需要回答的问题了。 哪个请求花了这么多时间? 图 8 显示了该问题的答案。 可以看到,我在 LogParser 查询中加入了 sc-bytes 字段。 请记住,sc-bytes 表示从服务器发回客户端的文件的大小。 图 8:LogParser 查询(MAX 和 AVG time-taken) 我们很可能都同意请求所用的时间超过正常的响应时间。 但是,管理员或开发人员需要对这些文件的大小进行分析,以确定这些大小是否在可接受范围内。 结论是 , GetDetailsView.aspx文件已引发多个 500 个 HTTP 状态代码,并且在某些时候需要很长时间才能完成,即使该文件相对较小。 你可能需要查看此文件出现问题时的日期和时间,并检查文件中出现问题的代码。 (例如,IIS 日志包含查询字符串中传递的变量列表;可以检查这些值是否为错误数据。) 图 4 - 8 中提供的示例有助于了解问题的根本原因。 不过,这种分析只是提供了一个更好的视角,这将引出更多的问题和更深入的分析。 如果是这种情况,你可能希望以更直观的方式呈现此数据。 下一节将对此进行详细介绍。 在性能问题的分析阶段,包含 LogParser 查询及其结果的命令窗口屏幕截图可能有用;但如果需要在经理或董事面前解释发生了什么情况,则可能不适用。 备注 要通过 LogParser 绘制图表,需要安装 Office Web Components。 以下文章介绍了如何执行此操作: 图 9 显示一个 LogParser 查询,用于创建包含请求数及其关联 HTTP 状态代码的 3D 饼图。 我删除了状态 200,因为这些都是成功的。 这里需要的除“成功”以外的请求。 图 9:LogParser 查询(创建 3D 饼图) 查询结果如图 10 所示。 可以向影响图像的 LogParser 传递许多其他参数。 例如,图例、groupSize、配置等...若要获取完整列表,请输入: 另一个有用的图表是缓存请求与实际请求之间的比率。 回想一下数据分析部分,我曾讨论过 HTTP 状态代码 200 意味着所请求文件是从服务器中检索的,而 304 表示是从客户端检索的。 图 11 显示了用于创建此图表的 LogParser 查询。 请注意,我使用了 -values 参数。 图 11:LogParser 查询(创建 3D 饼图) 尽管 HTTP 状态代码 200 和 304 之间的差异一目了然,但我认为加入每种状态代码的命中次数可能会增添一些价值。 图 12 展示了上一个 LogParser 查询的输出。 我想你现在已经明白使用 LogParser 绘制 IIS 日志图表可以比数据表更好地表达所发生的情况。 但在结束之前,我想再展示一个使用柱形图类型的示例。 图 13 所示的 LogParser 查询生成一个 3D 柱形图,显示每小时 500 HTTPS 状态代码的数量。 图 13:LogParser 查询(创建 3D 柱形图) 生成的图表如图 14 所示。 本节开头提到了如果要使用 LogParser 图表绘制功能,需要安装 Office Web Component (OWC)。 在你的组织中,可能会有禁止安装的限制,或者你可能根本不想安装。 在这两种情况下,请考虑将 LogParser 查询结果导出为 CSV 文件并将其导入 Excel。 图 15 显示一个 LogParser 查询,该查询将所有请求的 HTTP 状态代码(不含 200)提取到 CSV 文件中。 图 15:LogParser 查询(创建 CSV 文件以导入 Excel) 请注意,在图 15 中,我使用了 -o 参数,以便 LogParser 以 CSV 格式创建输出。 若要将 CSV 文件导入 Excel,以便可以从其中创建图表,请打开 Excel,导航到“数据”选项卡,然后选择“从文本”。 图 16 显示了这种情况。 选择 LogParser 查询创建的status.csv文件,然后浏览导入向导。 导入逗号分隔的 CSV 文件,最终会看到 A 列中的状态以及 B 列中每个状态的出现次数。这假定你执行了图 15 中显示的 LogParser 查询。 最后,选择 A 列和 B 列的所有数据(包括标题),然后选择要创建的饼图类型。 图 17 说明了这一情况。 最终结果是一个饼图,如图 18 所示,与前面图 10 所示类似。 颜色、图表类型、标签等有许多选项。单击按钮还可将图表类型从饼图更改为条形图或折线图。 在 Excel 中创建专业外观图表的选项非常多。 使用 LogParser 分析和呈现该分析结果的选项和可能性非常多。 有关一些其他提示和示例,请查看 罗伯特·麦克默里撰写的有关 LogParser 的博客。 LogParser 的安装包中还提供了一个非常有用的帮助文件和许多预先编写的脚本。 下一节将更详细地讨论此主题和其他主题。 在计算机上安装 LogParser 2.2 时,它默认安装到 C:\Program Files (x86)\Log Parser 2.2 目录中。 导航到该位置并查看 Samples\Queries 和 Samples\Scripts 目录,以获取大量预先编写的代码,可让你快速移动。 你还将通过读取 LogParser.chm 文件中的内容来实现极大的好处。 可能会遇到 IIS 日志文件过大导致 LogParser 无法查询的情况。 这种情况很可能发生在 32 位计算机上,但也可能发生在 64 位计算机上。 尽管如此,如果在运行 LogParser 查询时遇到“内存不足”错误,请考虑执行图 19 中显示的命令。 该查询从一个大型 IIS 日志文件中提取一些重要字段,并将其放入另一个文件中,从而生成一个较小的日志文件。 图 19:减小 IIS 日志文件的大小(通过删除字段) 在此示例中,我发现文件大小减少了约 45%。 在许多情况下,这可能足够了,但在其他情况下可能并不够。 这取决于原始日志文件的大小。 如果发现仍需减小 IIS 日志文件的大小,请考虑向 LogParser 查询添加日期时间约束,如图 20 所示。 图 20:通过添加 WHERE 子句进一步减小 IIS 日志文件的大小 这是减小文件大小的一项宝贵技术,但从 IIS 日志中删除不需要的条目也很有用。 例如,在开始排查问题时,你意识到 LogParser 是一款小巧但功能强大的工具,用于分析多种不同的系统日志类型。 本文重点介绍了适用于 IIS 日志的查询。 在 IIS 环境中遇到性能问题或错误时,有时很难知道从何入手。 LogParser 可用作起点,因为具备一定 SQL 技能的系统管理员可以快速生成一些非常复杂的 LogParser 查询。 可通过这些查询进一步分析问题的根本原因。mp(1.59375rem, 18.7895px + 1.39803vw, 2.125rem); line-height: 1.3; padding-inline-start: 1.875rem;">此疑难解答中使用的工具和知识
概述
场景
数据收集
图 1:获取网站的 ID
图 2:IIS 日志文件位置数据分析
12
是 2012 年的缩写年份06
指第六个月(6月)03
是月份的第三天TO_LOCALTIME()
函数来调整日期/时间,如以下示例所示:logparser.exe "SELECT TO_STRING(TO_LOCALTIME(TO_TIMESTAMP(date,time)),'yyyy-MM-dd hh:mm:ss') AS LocalTime, COUNT(*) AS Hits FROM *.log WHERE date='2012-10-18' GROUP BY LocalTime ORDER BY LocalTime" -i:w3c
图 3:本地托管的 IIS 日志文件,以便使用 LogParser 进行分析logparser.exe "SELECT sc-status, sc-substatus, COUNT(*) FROM *.log GROUP BY sc-status, sc-substatus ORDER BY sc-status" -i:w3c
输出sc-status sc-substatus COUNT(ALL *) --------- ------------ ------------ 200 0 3920658 206 0 2096 301 0 1031 302 0 65386 304 0 178705 400 0 35 401 2 692096 404 0 2935 404 11 7 405 0 1 406 0 36 500 0 11418 Statistics: ----------- Elements processed: 4189228 Elements output: 12 Execution time: 7.70 seconds
HTTP 200 和 304 状态代码之间的比率(分析成功的请求)
HTTP 500 状态代码(分析失败的请求)
logparser.exe "SELECT cs-uri-stem, COUNT(*) FROM *.log WHERE sc-status=500 GROUP BY cs-uri-stem ORDER BY COUNT(*) DESC" -i:w3c
输出cs-uri-stem COUNT(ALL *) --------------------------- ------------ /ShoppingCart/ViewCart.aspx 1378 /DataService.asmx 1377 /Start/default.aspx 949 /GetDetailsView.aspx 753 /Details/ImageUrls.asmx 722 Statistics: ----------- Elements processed: 4189228 Elements output: 5 Execution time: 24.89 seconds
try {...} catch {...}
代码块未包含的执行代码,或者他们正在执行需要优化的大型数据查询。logparser.exe "SELECT TO_STRING(TO_TIMESTAMP(date,time),'yyyy-MM-dd hh') AS Hour, COUNT(*) FROM *.log WHERE sc-status=500 AND cs-uri-stem='/Start/default.aspx' AND date='2012-10-18' GROUP BY Hour ORDER BY Hour" -i:w3c
输出Hour COUNT(ALL *) ------------- ------------ 2012-10-18 08 191 2012-10-18 09 163 2012-10-18 14 150 Statistics: ----------- Elements processed: 4189228 Elements output: 3 Execution time: 6.36 seconds
字段 说明 默认启用 time-taken
操作耗时(毫秒) 是 sc-bytes
服务器发送的字节数 否 cs-bytes
服务器接收的字节数 否 logparser.exe "SELECT cs-method, COUNT(*) AS TotalCount, MAX(time-taken) AS MaximumTime, AVG(time-taken) AS AverageTime FROM *.log GROUP BY cs-method ORDER BY TotalCount DESC" -i:w3c
输出cs-method TotalCount MaximumTime AverageTime --------- ---------- ----------- ----------- GET 3172034 1366976 153 POST 1011765 256539 359 HEAD 5363 26750 209 Statistics: ----------- Elements processed: 4189228 Elements output: 3 Execution time: 6.36 seconds
logparser.exe "SELECT cs-uri-stem, time-taken, sc-bytes FROM *.log WHERE time-taken > 250000 ORDER BY time-taken DESC" -i:w3c
输出cs-uri-stem time-taken sc-bytes --------------------------- ---------- -------- /ShoppingCart/ViewCart.aspx 1366976 256328 /DataService.asmx 1265383 53860 /Start/default.aspx 262796 8077 /GetDetailsView.aspx 261305 5038 /Details/ImageUrls.asmx 256539 2351 Statistics: ----------- Elements processed: 4189228 Elements output: 5 Execution time: 8.98 seconds
正在报告
logparser.exe "SELECT sc-status AS Status, COUNT(*) AS Count INTO status.gif FROM *.log WHERE sc-status > 200 GROUP BY Status ORDER BY Status" -i:w3c -o:CHART -chartType:PieExploded3D -ChartTitle:"Request Status"
输出Statistics: ----------- Elements processed: 4189228 Elements output: 10 Execution time: 6.20 seconds
LogParser -h -o:CHART
所有参数的列表。 此命令还将提供不同图表类型的列表。
图 10:LogParser 3D 饼图logparser.exe "SELECT sc-status AS Status, COUNT(*) AS Count INTO cache.gif FROM *.log WHERE sc-status=200 OR sc-status=304 GROUP BY Status ORDER BY Status" -i:w3c -o:CHART -chartType:PieExploded3D -ChartTitle:"Cache" -values:ON
输出Statistics: ----------- Elements processed: 4189228 Elements output: 2 Execution time: 6.35 seconds
图 12:LogParser 3D 饼图logparser.exe "SELECT to_string(to_timestamp(date, time), 'yyyy-MM-dd hh') AS Hour, COUNT(*) AS Count INTO 500.gif FROM *.log WHERE sc-status=500 GROUP BY Hour ORDER BY Hour" -i:w3c -o:CHART -chartType:Column3D -ChartTitle:"500 Errors by Hour"
输出Statistics: ----------- Elements processed: 4189228 Elements output: 13 Execution time: 6.32 seconds
图 14:LogParser 3D 柱形图使用 Excel 和 CSV 创建图表
logparser.exe "SELECT sc-status AS Status, COUNT(*) AS Count INTO status.csv FROM *.log WHERE sc-status > 200 GROUP BY Status ORDER BY Status" -i:w3c -o:csv
输出Statistics: ----------- Elements processed: 4189228 Elements output: 10 Execution time: 6.20 seconds
图 16:将 LogParser 创建的 CSV 文件导入 Excel
图 17:使用 CSV 文件创建饼图
图 18:使用 CSV 文件的饼图,类似于图 10帮助
减小 IIS 日志文件的大小或拆分 IIS 日志文件
logparser.exe "SELECT date, time, c-ip, cs-uri-stem, cs-uri-query, sc-status, sc-substatus, sc-win32-status, sc-bytes, cs-bytes, time-taken INTO u_exJUSTRIGHT.log FROM u_exTOOBIG.log" -i:w3c -o:w3c
输出Statistics: ----------- Elements processed: 19712301 Elements output: 19712301 Execution time: 3.07 seconds
logparser.exe "SELECT date, time, c-ip, cs-uri-stem, cs-uri-query, sc-status, sc-substatus, sc-win32-status, sc-bytes, cs-bytes, time-taken INTO u_exJUSTRIGHT.log FROM u_exTOOBIG.log WHERE to_timestamp(date, time) >= timestamp('2012-11-09 00:00:00', 'yyyy-MM-dd hh:mm:ss')" -i:w3c -o:w3c
输出Statistics: ----------- Elements processed: 240123 Elements output: 240123 Execution time: 0.45 seconds
time-take
sc-bytes
,并且cs-bytes
未记录。 你在 IIS 中启用了它们,并希望查询只分析那些具有最近启用字段的条目。 使用 where 语句从 IIS 日志文件中提取已启用这些字段的时间段内的数据。 使用AVG
MIN
和MAX
聚合时,这一点非常重要。结束语
本文链接:https://www.kinber.cn/post/4688.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝: