Mesclar grandes logs do IIS

1

Estou planejando usar o Webalizer para analisar e representar graficamente os logs do IIS, mas como temos um farm de servidores, o Webalizer exige que eu verifique se todos os logs estão em ordem cronológica (ou então ele começará a ignorar os resultados).

Nossos logs são armazenados em gzip, então comecei descompactando tudo em arquivos separados e então usei o LogParser 2.2 para mesclar esses arquivos. Meu comando LogParser foi:

LogParser.exe -i:iisw3c "select * into combinedLogFile.log from *.log order by date, time" -o:w3c 

Provavelmente não preciso de * mas preciso da maioria dos campos porque o Webalizer precisará deles. Isso funciona perfeitamente em alguns dos meus logs, mas um de nossos clusters de farm de servidores gera muitos logs, temos 14 servidores em que os logs de cada servidor são (no mínimo) 2,5 GB por dia (cada log está em um dia separado). Então, quando tento mesclar esses logs, o LogParser apenas trava com um erro genérico insignificante.

Assumi que era um problema de memória e tentei várias maneiras de minimizar a memória.

Estou usando o powershell para chamar o LogParser e, assim, comecei a tentar canalizar a entrada usando a tubulação padrão do Powershell. (Isso causou um OutOfMemoryException no Powershell (em vez de LogParser) mais cedo do que apenas usando os arquivos de qualquer maneira que eu poderia fazê-lo).

O que eu finalmente terminei é usar vários pipes nomeados sendo chamados de uma chamada de arquivo em lote para "Cat", inserindo diretamente o LogParser ... e voltei para onde comecei quando estava pré-compactando-os.

Temos outros scripts que processam esses mesmos arquivos de log e nenhum deles tem problemas (embora sua saída seja geralmente menor do que essa será).

Então, eu só quero saber se você tem alguma idéia sobre uma maneira melhor de mesclar todos esses arquivos ou algum script LogParser que funcione como o que eu criei não é suficiente.

P.S. Eu sei que eu provavelmente poderia escrever um programa de fusão no .NET como todos os logs individuais já estão classificados e, portanto, eu não precisaria ler mais do que algumas linhas de cada vez, mas eu estou tentando evitar ter que fazer isso, se possível .

    
por James J. Regan IV 15.07.2011 / 20:04

1 resposta

4

Como você está enfrentando problemas tentando classificar os dados em um único dia, eu observo uma das duas estratégias.

  1. Encontre uma classificação melhor. Veja se você pode obter a ferramenta de classificação do Windows para trabalhar para você. Os registros são manipulados com data e hora primeiro, em um formato amigável de classificação de ascii por uma razão. Ele usa muito menos memória e não precisa analisar linhas para classificar. Minha aposta é que isso funciona para você.

  2. Grave um entrelaçamento, que abra todos os 14 arquivos e retire a linha mais antiga do topo de cada um, percorrendo simultaneamente os 14 arquivos. Estremeço pensar nisso, mas não precisaria de 64 KB de memória para cada arquivo.

resposta antiga:

Divida e conquiste. Escreva um script que leia logs e coloque-os em novos arquivos por data, com um nome de arquivo conhecido que tenha a data contida nele (weblog-20110101.log). Execute uma classificação em cada arquivo que classifica por hora. Cat os arquivos que você precisa juntos.

    
por 15.07.2011 / 20:10