我计划使用 Webalizer 来分析和绘制我们的 IIS 日志,但是因为我们有一个服务器场,所以 Webalizer 要求我确保所有日志都按时间顺序排列(否则它将开始跳过结果)。
我们的日志以 gzip 格式存储,因此我首先将所有内容解压缩到单独的文件中,然后使用 LogParser 2.2 合并这些文件。我的 LogParser 命令是:
LogParser.exe -i:iisw3c "select * into combinedLogFile.log from *.log order by date, time" -o:w3c
我可能不需要 *,但我确实需要大多数字段,因为 Webalizer 需要它们。这在我的某些日志上工作得很好,但是我们的一个服务器群生成了大量日志,我们有 14 台服务器,每台服务器的日志(至少)每天 2.5 GB(每条日志都在不同的一天)。所以当我尝试合并这些日志时,LogParser 会崩溃并出现毫无意义的一般错误。
我认为这是一个内存问题,因此我尝试了多种方法来尽量减少内存。
我正在使用 powershell 调用 LogParser,因此我开始尝试使用标准 Powershell 管道来管道输入。(这导致 Powershell(而不是 LogParser)中出现 OutOfMemoryException,比我能做到的任何使用文件都要快)。
我最终采用的方法是使用从批处理文件调用“Cat”中调用的多个命名管道,直接将其传输到 LogParser 中……然后我回到了预先压缩它们时的起点。
我们有其他脚本可以处理这些相同的日志文件,并且它们都没有问题(尽管它们的输出通常比这个小)。
所以我只是想知道您是否有关于合并所有这些文件的更好方法的任何想法,或者某些可以正常工作的 LogParser 脚本,因为我提出的脚本是不够的。
PS,我知道我可能可以在.NET 中编写一个合并程序,因为所有单独的日志都已经排序好了,所以我不需要一次读取超过几行,但如果可能的话,我尽量避免这样做。
答案1
鉴于您在尝试对一天的数据进行排序时遇到问题,我会考虑以下两种策略之一。
找到更好的排序方式。看看能否让 Windows 排序工具为您工作。出于某种原因,日志首先使用日期和时间,采用适合 ASCII 文本排序的格式。它占用的内存少得多,并且不必解析行进行排序。我敢打赌这对您有用。
编写一个交错程序,打开所有 14 个文件并从每个文件的顶部提取最早的行,同时遍历 14 个文件。想到这一点我就不寒而栗,但每个文件只需要 64KB 内存。
旧答案:
分而治之。编写一个脚本,读取日志并按日期将它们放入新文件中,并使用包含日期的已知文件名(weblog-20110101.log)。对每个文件进行按时间排序的排序。将您需要的文件放在一起。