Posso usar analisadores de log, mas geralmente preciso analisar logs da web recentes para ver o que está acontecendo no momento.
Às vezes, faço coisas como descobrir os 10 ips principais que solicitam um determinado arquivo
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
O que você tem na sua caixa de ferramentas?
Respostas:
Você pode fazer praticamente qualquer coisa com os arquivos de log do apache apenas com o awk. Os arquivos de log do Apache são basicamente separados por espaços em branco, e você pode fingir que as aspas não existem e acessar as informações de seu interesse pelo número da coluna. O único momento em que isso ocorre é se você possui o formato de log combinado e está interessado nos agentes do usuário; nesse momento, você deve usar aspas (") como separador e executar um comando awk separado. A seguir, serão mostrados os IPs de todo usuário que solicita a página de índice classificada pelo número de hits:
$ 7 é o URL solicitado. Você pode adicionar as condições que desejar no início. Substitua '$ 7 == "/" pelas informações desejadas.
Se você substituir $ 1 em (ipcount [$ 1] ++), poderá agrupar os resultados por outros critérios. Usar US $ 7 mostraria quais páginas foram acessadas e com que frequência. Obviamente, você deseja alterar a condição no início. O seguinte mostraria quais páginas foram acessadas por um usuário a partir de um IP específico:
Você também pode canalizar a saída através da classificação para obter os resultados em ordem, como parte do comando shell ou também no próprio script awk:
O último seria útil se você decidisse expandir o script awk para imprimir outras informações. É tudo uma questão do que você deseja descobrir. Estes devem servir como ponto de partida para o que você estiver interessado.
fonte
Uma coisa que eu nunca vi mais alguém fazer, por razões que não consigo imaginar, é alterar o formato do arquivo de log do Apache para uma versão mais facilmente analisável com as informações que realmente são importantes para você.
Por exemplo, nunca usamos autenticação básica HTTP, portanto, não precisamos registrar esses campos. Eu estou interessado em quanto tempo cada pedido leva a servir, por isso vamos acrescentar que, em. Para um projeto, nós também queremos saber (em nosso balanceador de carga), se todos os servidores estão servindo pedidos mais lento do que outros, então nós registramos o nome do servidor para o qual estamos fazendo proxy.
Aqui está um trecho da configuração do apache de um servidor:
O que você realmente não pode dizer disso é que entre cada campo existe um caractere de tabulação literal (\ t). Isso significa que, se eu quiser fazer alguma análise em Python, talvez mostre status que não seja 200, por exemplo, eu posso fazer isso:
Ou se eu quisesse fazer 'quem está ligando as imagens?' seria
Para contagens de IP em um log de acesso, o exemplo anterior:
torna-se algo como isto:
Mais fácil de ler e entender e muito menos caro computacionalmente (sem regex) que, em logs de 9 GB, faz uma enorme diferença em quanto tempo leva. Quando isso fica MUITO legal, é se você deseja fazer o mesmo com os agentes do usuário. Se seus logs forem delimitados por espaço, você precisará fazer alguma correspondência de expressão regular ou pesquisa de string manualmente. Com este formato, é simples:
Exatamente o mesmo que o acima. De fato, qualquer resumo que você queira fazer é essencialmente exatamente o mesmo.
Por que diabos eu gastaria a CPU do meu sistema em awk e grep quando o cut fará exatamente o que eu quero ordens de magnitude mais rapidamente?
fonte
cut -f 3 log | uniq -c | sort -n
agentes do usuáriocut -f 8 log | uniq -c | sort -n
.Esqueça o awk e o grep. Confira asql . Por que escrever scripts ilegíveis quando você pode usar sql como sintaxe para consultar o arquivo de log. Por exemplo.
fonte
Aqui está um script para encontrar os principais URLs, principais referenciadores e principais usuários das recentes entradas de log N
Fonte
fonte
para contagens de IP em um log de acesso:
É um pouco feio, mas funciona. Eu também uso o seguinte com o netstat (para ver as conexões ativas):
Eles são alguns dos meus favoritos "one liners" :)
fonte
Criar uma lista de perguntas comuns seria um ótimo índice para essas respostas a essa pergunta. Minhas perguntas comuns são:
Percebo essas alterações monitorando as páginas de status do servidor (via mod_status) quanto à taxa de bits e tempo de resposta aproximado para solicitações ativas e concluídas recentemente (sabendo muito bem que sinto falta de uma pilha enorme de dados, mas as amostras são boas o suficiente).
Eu uso a seguinte diretiva LogFormat (o% T é realmente útil)
Estou procurando causa-efeito e o que aconteceu primeiro ... geralmente sobre subconjuntos específicos de padrões nos meus logs, portanto, preciso saber o seguinte para qualquer padrão / expressão regular:
Eu geralmente uso perl, porque eventualmente fica complexo o suficiente para valer a pena.
Um exemplo não-perl seria uma rápida taxa de bits por minuto para códigos de status que não sejam 200:
Sim, estou trapaceando com esse grep, presumindo que um espaço de aspas-200-espaço corresponda apenas aos códigos de status http .... poderia usar awk ou perl para isolar o campo, mas lembre-se de que pode ser impreciso.
Um exemplo mais complexo em perl pode ser visualizar uma alteração na taxa de bits de um padrão.
Há muito o que mastigar no script abaixo, especialmente se você não é familiar com o perl.
código a seguir:
Se você deseja apenas processar métricas padrão, finalize a compra
fonte
Aqui, meu exemplo 'sed', lê o formato padrão dos logs do apache e o converte em algo mais conveniente para o processamento automático. A linha inteira é definida como expressão regular, as variáveis são salvas e gravadas na saída com '#' como separador.
A notação simplificada da entrada é:% s% s% s [% s] "% s"% s% s "% s" "% s"
Exemplo de linha de entrada: xx.xx.xx.xx - - [29 / Mar / 2011: 12: 33: 02 +0200] "GET /index.html HTTP / 1.0" 200 9443 "-" "Mozilla / 4.0"
Exemplo de linha de saída: xx.xx.xx.xx # - # - # 29 / Mar / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # Mozilla / 4.0
Sinta o poder das expressões regulares :-)
fonte
Eu uso muito o awk arrastando ou bloqueando o arquivo. Toda noite eu entrego um relatório da web para cada servidor. Dependendo do seu arquivo de log e do seu LogFormat, você precisará editar alguns dos liners para trabalhar para você.
Aqui está um exemplo simples:
Se eu quiser alterar os logs no meu servidor apenas para códigos de status 404/500, eu faria o seguinte:
<snip>
</ snip>
fonte
Quem está vinculando suas imagens a quente:
fonte
O que costumo fazer na maioria das vezes é ler seções de um log com base no tempo, então escrevi o script a seguir usando sed para extrair o período em que estou interessado, ele funciona em todos os arquivos de log que vim e também pode lidar com os logs arquivados.
fonte
Embora não seja sed ou awk, há duas coisas que achei úteis para lidar com arquivos de log do apache e icecast.
O AWStats possui um script muito útil chamado logresolvemerge.pl que combina vários arquivos de log compactados ou descompactados, tira dupes e classifica por carimbo de data / hora. Ele também pode fazer pesquisas de DNS e ser configurado para executar multithread. É particularmente útil quando usado com o awstats, porque o awstats não pode adicionar linhas de registro com registros de data e hora mais antigos que o banco de dados atual; portanto, tudo deve ser adicionado em ordem, mas isso é muito fácil, basta você checar tudo em logresolvemerge.pl e tudo sair bem.
sed e awk são muito ruins em lidar com datas, porque geralmente os tratam como strings. O awk possui algumas funções de hora e data, mas elas não são suficientes. Por exemplo, extrair um intervalo de linhas entre dois registros de data e hora é difícil se esses registros de data e hora exatos não ocorrerem no arquivo (mesmo que os valores entre eles ocorram) - o exemplo de Chris tem exatamente esse problema. Para lidar com isso, escrevi um script PHP que relata os intervalos de registro de data e hora do arquivo de log e também pode extrair um pedaço por intervalo de registro de data e hora, usando qualquer formato de data ou hora que você desejar (não precisa corresponder ao formato de registro de data e hora do arquivo de registro).
Para manter este tópico, aqui estão alguns awkisms úteis: Obtenha o número total de bytes exibidos no log do apache ou icecast:
Obtenha o número total de segundos conectados a partir de um log do icecast:
fonte
Recuperando esse thread antigo, depois de desistir do asql para grandes arquivos de log, procurei uma solução novamente, também em serverfault, descobri sobre o wtop aqui que é uma ferramenta de código aberto, capaz de monitorar ao vivo ou processar logs e obter estatísticas (topo N), muito flexível e poderoso, o local oficial é aqui
fonte