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:
# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot
# Custom log format, for testing
#
# date proto ipaddr status time req referer user-agent
LogFormat "%{%F %T}t %p %a %>s %D %r %{Referer}i %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot
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:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
Ou se eu quisesse fazer 'quem está ligando as imagens?' seria
if line[6] in ("","-") and "/images" in line[5]:
Para contagens de IP em um log de acesso, o exemplo anterior:
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n
torna-se algo como isto:
cut -f 3 log | uniq -c | sort -n
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:
cut -f 8 log | uniq -c | sort -n
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?