我计划使用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台服务器,每台服务器的日志(至less)是每天2.5GB(每个日志在不同的日子)。 所以当我尝试合并这些日志LogParser只是崩溃与一个毫无意义的通用错误。
我认为这是一个内存问题,所以我尝试了很多方法来尽量减less内存。
我正在使用PowerShell来调用LogParser,所以我开始尝试使用标准的Powershellpipe道inputinput。 (这导致Powershell(而不是LogParser)的OutOfMemoryException,而不是以任何方式使用这些文件)。
我最终得到的结果是使用多个命名pipe道从一个batch file调用调用到“猫”直接pipe道到LogParser …我回到我开始时,我是在预先压缩他们。
我们有其他脚本处理这些相同的日志文件,没有任何问题(尽pipe它们的输出通常比这个小)。
所以我只是想知道,如果你有更好的方法来合并所有这些文件或一些LogParser脚本,我会想到的工作是不够的。
PS我知道我可以在.NET中编写一个合并程序,因为所有的日志都已经被sorting,所以我不需要每次只读几行,但是我试图避免这样做,如果可能。
鉴于您遇到的问题试图sorting数据的一天,我会看看两个战略之一。
find一个更好的sorting。 看看你是否可以得到Windows分类工具为你工作。 日志首先用date和时间操作,出于某种原因,采用ascii-text-sort友好的格式。 它使用的内存less得多,不需要分析行进行sorting。 我敢打赌,这是适合你的作品。
写一个交错,打开所有14个文件,并从每个文件的顶部拉最早的行,同时通过14个文件。 我不寒而栗,想到这一点,但它不需要每个文件的64KB的内存。
老回答:
分而治之。 写一个脚本读取日志,并按date将它们放入新文件中,并使用已知文件名(日志文件名为weblog-20110101.log)。 对每个按时间sorting的文件进行sorting。 把你需要的文件放在一起。