Por que a maioria dos arquivos de log usa texto sem formatação em vez de um formato binário?

81

O log é algo que é necessário, mas é (relativamente) raramente usado. Como tal, pode ser muito mais compacto em termos de armazenamento.

Por exemplo, os dados mais comumente registrados como ip, data, hora e outros dados que podem ser representados como um número inteiro estão sendo armazenados como texto.

Se o registro fosse armazenado como dados binários, muito espaço poderia ser preservado, exigindo menos rotação e aumentando a vida útil do disco, especialmente com SSDs onde as gravações são limitadas.

Alguns podem dizer que é uma questão tão pequena que realmente não importa, mas, considerando o esforço necessário para construir esse mecanismo, não faz sentido não fazê-lo. Qualquer um pode fazer isso por dois dias no seu tempo livre, por que as pessoas não fazem isso?

php_nub_qq
fonte
20
Eu contestaria sua afirmação de que as pessoas não fazem isso. Muitos fazem. Alguns não, com certeza, mas muitos o fazem.
Servy
44
> Se o log foi armazenado como dados binários, muito espaço pode ser preservado. Bem, os logs antigos normalmente são compactados.
leonbloy
89
Ler um log de texto em uma máquina que esteja com a metade do caminho pode ser uma grande vantagem sobre a necessidade de um binário para analisá-lo.
tofro
23
Após meses de modificações para executar o algoritmo corretamente no cluster grande, ainda não conseguimos ver muito ganho de desempenho, mas quando mudamos para armazenar os arquivos de log em arquivos binários? Caramba, nunca ousamos sonhar que o desempenho poderia estar nesse nível. Quão plausível é esse tipo de história?
Nulo

Respostas:

163

systemdfamosa armazena seus arquivos de log em formato binário. Os principais problemas que ouvi foram:

  1. se o log for corrompido, é difícil recuperar, pois precisa de ferramentas especializadas
  2. eles não são legível, para que você não pode usar ferramentas padrão, como vi, grep, tailetc para analisá-los

A principal razão para usar um formato binário (que eu saiba) foi que foi considerado mais fácil para criar índices, etc., ou seja, tratá-lo mais como um arquivo de banco de dados.

Eu argumentaria que a vantagem do espaço em disco é relativamente pequena (e diminuindo) na prática. Se você deseja armazenar grandes quantidades de logs, compactar os logs compactados é realmente bastante eficiente.

No geral, as vantagens de ferramentas e familiaridade provavelmente errariam no lado do log de texto na maioria dos casos.

Alex
fonte
3
Bom ponto. Eu estava pensando imediatamente no systemd também. A parte ainda mais importante aqui é que seu aplicativo não precisa saber como os dados do log são armazenados. Pode ser fornecido como um serviço do sistema.
5gon12eder
97
"famosa", mais como "infame"
whatsisname 04/10/16
4
pf (firewall) também registra em binário, especificamente para o formato tcpdump
Neil McGuigan
3
@Hatshepsut Logs em rolo: a saída do log grava em um arquivo, digamos myapp.logaté meia-noite, move o arquivo para myapp.log.1e começa a gravar em um novo myapp.logarquivo. E o velho myapp.log.1é movido para myapp.log.2, e assim por diante, todos rolam. Assim, myapp.logé sempre o atual. Ou eles podem mudar quando um determinado tamanho é atingido. Talvez eles tenham colocado a data / hora no nome do arquivo. Muitas estruturas de registro suportam esse tipo de coisa imediatamente.
SusanW
13
@Hatshepsut O termo rotatingtambém é usado pelo que sei.
George D
89

Por que a maioria dos arquivos de log usa texto sem formatação em vez de um formato binário?

Pesquise a palavra "texto" no artigo da Wikipedia sobre filosofia Unix , por exemplo, você encontrará declarações como:

McIlroy, então chefe do Bell Labs CSRC (Centro de Pesquisa em Ciências da Computação) e inventor do tubo Unix, [9] resumiu a filosofia do Unix da seguinte forma: [10]

Esta é a filosofia do Unix: escreva programas que fazem uma coisa e fazem bem. Escreva programas para trabalhar juntos. Escreva programas para lidar com fluxos de texto, porque essa é uma interface universal.

Ou, por exemplo, em Fundamentos da filosofia Unix ,

Regra de composição: crie programas para serem conectados com outros programas.

É difícil evitar a programação de monólitos complicados, se nenhum dos seus programas puder se comunicar.

A tradição Unix incentiva fortemente a escrita de programas que leem e escrevem formatos simples, textuais, orientados a fluxo e independentes de dispositivo. No Unix clássico, o maior número possível de programas é gravado como filtros simples, que recebem um fluxo de texto simples na entrada e o processam em outro fluxo de texto simples na saída.

Apesar da mitologia popular, essa prática é preferida não porque os programadores Unix odeiam interfaces gráficas de usuário. É porque se você não escreve programas que aceitam e emitem fluxos de texto simples, é muito mais difícil conectar os programas.

Os fluxos de texto são para ferramentas Unix, assim como as mensagens são para objetos em uma configuração orientada a objetos. A simplicidade da interface de fluxo de texto impõe o encapsulamento das ferramentas. Formas mais elaboradas de comunicação entre processos, como chamadas de procedimentos remotos, mostram uma tendência a envolver demais os programas com os internos.

Qualquer um pode fazer isso por dois dias no seu tempo livre, por que as pessoas não fazem isso?

Armazenar o arquivo de log em binário é apenas o começo (e trivial). Você precisaria escrever ferramentas para:

  • Exibir o arquivo de log inteiro ( edit)
  • Exibir o final do log, sem ler o início ( tail -f)
  • Procure coisas no arquivo ( grep)
  • Filtre para exibir apenas itens selecionados / interessantes (usando uma expressão de filtro arbitrariamente complicada)
  • Envie o log por email para outra pessoa que não possua seu software de decodificador de arquivos de log
  • Copie e cole um fragmento do arquivo de log
  • Leia o arquivo de log enquanto o programa (que cria o arquivo de log) ainda está sendo desenvolvido e depurado
  • Leia os arquivos de log das versões antigas do software (implantadas nos sites dos clientes e em execução).

Obviamente, o software também pode usar formatos de arquivos binários (por exemplo, para bancos de dados relacionais), mas não vale a pena (no sentido YAGNI ), geralmente não vale a pena, para arquivos de log.

ChrisW
fonte
24
Não se esqueça da documentação! Escrevi um gravador de mensagens binárias para um sistema há alguns anos, que registrava solicitações de regressão / reprodução. Agora, a única maneira de entender esses arquivos horríveis é olhar para o código que os lê / grava, e ainda outras equipes os usam e fazem perguntas sobre eles. Coisas horríveis.
SusanW
2
Para ser justo, armazenar seu log em um banco de dados SQLite combinado com ferramentas básicas de consulta para leitura forneceria todos os recursos mencionados por você imediatamente. ;)
jpmc26 6/06
3
@ jpmc26 Sim, você pode ler o arquivo de log, enquanto você pode, de alguma forma, convertê-lo em um formato de texto ...
ChrisW
1
como dito em outros comentários: os arquivos de texto podem ser compactados com facilidade e eficiência. Mas a compactação não precisa estar nos 'dados'. A compactação pode ser feita no sistema de arquivos. para que você possa usar o texto sem formatação em todas as ferramentas e não ter espaço em disco desperdiçado.
Bernd Wilke 7φ
2
@ JefréN. Se eu for executado tail -fem um arquivo de log de vários gigabytes, ele pulará para o final do arquivo (usando 'seek' sem 'read') e, em seguida, lerá e exibirá apenas o final do arquivo. Não é necessário descompactar / decodificar o arquivo inteiro.
11116 ChrisW
49

Existem muitas presunções discutíveis aqui.

O log tem sido parte integrante de (quase) todos os trabalhos que tive. É essencial se você deseja algum tipo de visibilidade sobre a saúde de seus aplicativos. Duvido que seja um uso "marginal"; a maioria das organizações com as quais me envolvi considera os logs muito importantes.

Armazenar logs como binários significa que você deve decodificá-los antes de poder lê-los. Os logs de texto têm a virtude da simplicidade e facilidade de uso. Se você estiver contemplando a rota binária, também poderá armazenar logs em um banco de dados, onde poderá interrogá-los e analisá-los estatisticamente.

Atualmente, os SSDs são mais confiáveis ​​do que os HDDs, e os argumentos contra muitas gravações são amplamente discutidos. Se você estiver realmente preocupado com isso, armazene seus logs em um disco rígido comum.

Robert Harvey
fonte
19
"você também pode armazenar logs em um banco de dados, onde você pode interrogá-los e analisá-los estatisticamente." Em um trabalho anterior, tínhamos uma ferramenta personalizada que importa nossos logs (baseados em texto) em um banco de dados exatamente para esse fim.
Mason Wheeler
5
Percebo o que OP significa "SSD onde as gravações são limitadas" é o fato de que no SSD há ciclos limitados de gravação / apagamento e a gravação excessiva em um setor diminuiu a vida útil do dispositivo. Ela não quis dizer que as gravações estão perdidas.
Tulains Córdova 04/10
4
@ TulainsCórdova: Sim, eu sabia o que ela queria dizer.
Robert Harvey
2
@ DocSalvager: Eu não afirmei o contrário.
Robert Harvey
2
@ TulainsCórdova - os limites dos ciclos de gravação de SSD são geralmente muito altos atualmente. Mesmo os SSDs de baixo custo para consumidores têm garantia do fabricante em ciclos de gravação que atingem centenas de vezes o tamanho do dispositivo e MTBFs que cobrem você para gravar milhares de vezes a capacidade do dispositivo. E em um ambiente comercial, você deve usar dispositivos de ponta que têm limites de ciclo de gravação muito maiores e substituí-los em pelo menos um ciclo de cinco anos. Portanto, a menos que você esteja gravando> 10% da capacidade de armazenamento por dia, acho que não há algo com que se preocupar.
Jules
36

Os arquivos de log são uma parte crítica de qualquer aplicativo sério: se o login no aplicativo for bom, eles permitem que você veja quais eventos importantes aconteceram e quando; que erros ocorreram; e integridade geral do aplicativo que vai além do monitoramento projetado. É comum ouvir sobre um problema, verificar os diagnósticos internos do aplicativo (abrir o console da Web ou usar uma ferramenta de diagnóstico como JMX) e, em seguida, recorrer à verificação do arquivos de log.

Se você usa um formato não textual, é imediatamente confrontado com um obstáculo: como você lê os logs binários? Com a ferramenta de leitura de log, que não está nos servidores de produção! Ou é, mas, nossa nossa, adicionamos um novo campo e este é o antigo leitor. Não testamos isso? Sim, mas ninguém o implantou aqui. Enquanto isso, sua tela começa a se iluminar com os usuários fazendo o ping.

Ou talvez esse não seja o seu aplicativo, mas você está dando suporte e acha que sabe que é esse outro sistema e o WTF? os logs estão em um formato binário? Ok, comece a ler as páginas da wiki e por onde começar? Agora eu os copiei na minha máquina local, mas - eles estão corrompidos? Eu fiz algum tipo de transferência não binária? Ou a ferramenta de leitura de log está desarrumada?

Em resumo, as ferramentas de leitura de texto são multiplataforma e onipresentes, e os logs geralmente têm vida longa e às vezes precisam ser lidos às pressas . Se você inventa um formato binário, fica isolado de um mundo inteiro de ferramentas bem compreendidas e fáceis de usar. Grave perda de funcionalidade exatamente quando você precisar.

A maioria dos ambientes de log é comprometida: mantenha os logs atuais legíveis e presentes e comprima os mais antigos. Isso significa que você obtém o benefício da compactação - mais ainda, porque um formato binário não diminui as mensagens de log. Ao mesmo tempo, você pode usar menos e grep e assim por diante.

Então, quais possíveis benefícios podem surgir do uso de binário? Uma pequena quantidade de eficiência de espaço - cada vez mais sem importância. Menos gravações (ou menores)? Bem, talvez - na verdade, o número de gravações esteja relacionado ao número de confirmações de disco; portanto, se as linhas de log forem significativamente menores que o tamanho do bloco de disco, um SSD estaria atribuindo novos blocos repetidamente. Portanto, binário é uma escolha apropriada se:

  • você está escrevendo grandes quantidades de dados estruturados
  • os logs devem ser criados particularmente rapidamente
  • é improvável que você precise analisá-los em "condições de suporte"

mas isso parece menos com o log de aplicativos; esses são arquivos de saída ou registros de atividades. Colocá-los em um arquivo provavelmente está apenas a um passo de gravá-los em um banco de dados.

EDITAR

Eu acho que há uma confusão geral aqui entre "logs de programas" (conforme estruturas de log) e "registros" (como em logs de acesso, registros de logon etc.). Suspeito que a questão esteja mais intimamente relacionada com a última e, nesse caso, a questão é muito menos bem definida. É perfeitamente aceitável que um registro de mensagens ou log de atividades esteja em um formato compacto, especialmente porque provavelmente será bem definido e usado para análise, em vez de solução de problemas. As ferramentas que fazem isso incluem tcpdumpe o monitor do sistema Unix sar. Os logs do programa, por outro lado, tendem a ser muito mais ad hoc.

SusanW
fonte
1
Até o Unix /var/log/utmp/ wtmp é binário . Eles registram quem está conectado no momento em que tty (para que não cresçam apenas), mas são uma forma de registro. (E é útil para ser capaz de analisá-los mais barato, uma vez que vários comandos comuns como whofazer exatamente isso.)
Peter Cordes
1
@PeterCordes Very true. Mais uma vez, dados bem definidos. registros estruturados. E, é claro, velocidade e tamanho em todas as escalas eram considerações vitais naquela época.
SusanW
9

Um exemplo de um log um tanto binário é amplo: o log de eventos do Windows. Do lado profissional, isso permite que as mensagens de log sejam bastante prolixo (e, portanto, esperançosamente úteis) a praticamente nenhum custo, possivelmente algo como

Aviso: a fila de foobars a fazer cresceu 517 itens nos últimos 90 segundos. Se isso acontecer uma vez por dia, não há com o que se preocupar. Se isso acontecer com mais frequência ou em rápida sucessão, convém verificar a quantidade de RAM disponível para o aplicativo foobar. Se ocorrer junto com o evento 12345, no entanto, você parece estar usando um banco de dados obsoleto e é melhor chamar o suporte em + 1-555-12345 para impedir a perda de dados.

A parte principal desta mensagem existe apenas uma vez como um recurso instalado com o aplicativo. No entanto, se esse recurso não estiver instalado corretamente (por exemplo, porque enquanto uma versão mais recente foi instalada que não suporta mais essa mensagem obsoleta), tudo o que você vê no log de eventos é uma mensagem padrão, que é apenas um texto sofisticado para

Não sei, algo com "517" e "90".

e não é mais útil de forma alguma.

Hagen von Eitzen
fonte
9
Sem mencionar que encontrar algo no log de eventos do Windows pode ser um pesadelo. Certamente me faz desejar um arquivo de texto simples.
Michael Hampton
4
Esperar. Deseja ver duas (ou mais) entradas de log simultaneamente? Muito ruim.
Eric Towers
2
Minha resposta seria "logs de eventos do Windows", basta dizer.
Craig
Minha experiência com a falta de recursos para o Visualizador de Eventos foi com ferramentas que não têm recursos para instalar, mas, nesse caso, AFAIR, ainda há uma linha de informações reais do programa de relatórios, na parte inferior, depois que o Windows termina sua ' o recurso pode estar ausente ou corrompido" lengalenga.
underscore_d
5

As duas perguntas principais que você gostaria de fazer antes de escolher entre texto e binário são:

  • Quem é meu público?
  • Que conteúdo eu preciso transmitir?

Uma opinião comum é que o público de uma mensagem de log é um ser humano. Obviamente, essa não é uma suposição perfeita, porque há muitos scripts de rastreamento de log por aí, mas é comum. Nesse caso, faz sentido transmitir as informações em um meio com o qual os humanos se sintam confortáveis. O texto tem uma longa tradição de ser este meio.

Quanto ao conteúdo, considere que um log binário deve ter um formato bem definido. O formato deve ser bem definido o suficiente para que outras pessoas escrevam software que opera nesses logs. Alguns logs são muito bem estruturados (sua pergunta lista vários). Outros logs precisam da capacidade de transmitir conteúdo em um formato de linguagem natural menos bem definido. Esses casos de linguagem natural são pouco compatíveis com os formatos binários.

Para os logs que poderiam ser bem descritos em binário, você deve fazer uma escolha. Como o texto funciona para todos, geralmente é visto como a opção padrão. Se você registrar seus resultados em texto, as pessoas poderão trabalhar com seus registros. Foi provado milhares de vezes. Arquivos binários são mais complicados. Como resultado, pode ser que os desenvolvedores produzam texto simplesmente porque todos sabem como será o comportamento.

Cort Ammon
fonte
5

TL; DR: o tamanho não importa, mas a conveniência do uso

Antes de tudo, embora seja uma questão importante comparar as respectivas vantagens dos formatos de texto e binários para armazenamento de log de curto prazo, o tamanho não importa. As duas razões para isso são:

  1. Logs são informações altamente redundantes que compactam muito bem: na minha experiência, não é raro ver arquivos de log compactados cujo tamanho é 5% ou menos do tamanho do arquivo original. Conseqüentemente, o uso de um formato de texto ou binário não deve ter nenhum impacto mensurável no armazenamento de logs de longa data.

  2. Qualquer que seja o formato escolhido, os logs preencherão rapidamente um disco do servidor se não implementarmos um “coletor de arquivos de log” que comprima e envie os arquivos de log para uma plataforma de armazenamento de longo prazo. O uso de um formato binário pode retardar um pouco isso, mas mesmo uma alteração de um fator 10 não importa muito.

Formatos de log de texto versus binários

A promessa dos sistemas Unix é que, se aprendermos a usar o conjunto de ferramentas padrão que trabalha em arquivos de texto estruturados em linhas - como grep , classificar , ingressar , sed e awk - seremos capazes de usá-los para montar rapidamente protótipos executando qualquer trabalho queremos, ainda que lenta e grosseiramente. Uma vez que o protótipo demonstre sua utilidade, podemos optar por transformá-lo em um software realmente projetado para obter desempenho ou adicionar outros recursos úteis. Esta é, pelo menos no meu entendimento, a essência da filosofia Unix.

Dito de outra forma, se provavelmente precisamos realizar tratamentos e análises, não podemos descobrir até hoje, se não sabemos quem deve implementar essa análise etc. etc., estamos no estágio em que protótipos devem ser usados ​​e formatos de texto para os logs provavelmente são ótimos. Se precisarmos executar repetidamente um pequeno conjunto de tratamentos bem identificados, estaremos na situação em que devemos projetar um sistema de software perene para executar essa análise e os formatos binários ou estruturados de logs, como bancos de dados relacionais, provavelmente serão ótimo.

(Há algum tempo, escrevi um post sobre isso.)

Michael Le Barbier Grünewald
fonte
4

Os arquivos de log estão no formato de texto porque podem ser facilmente lidos usando qualquer tipo de editor de texto ou exibindo o conteúdo via comando do console.

No entanto, alguns arquivos de log estão em formato binário se houver muitos dados. Por exemplo, o produto em que estou trabalhando armazena no máximo 15000 registros. Para armazenar os registros na menor quantidade de espaço, eles são armazenados em binário. No entanto, um aplicativo especial deve ser gravado para exibir os registros ou convertê-los em um formato que possa ser usado (por exemplo, planilhas).

Em resumo, nem todos os arquivos de log estão no formato textual. O formato textual tem uma vantagem de que não são necessárias ferramentas personalizadas para visualizar o conteúdo. Onde há muitos dados, o arquivo pode estar no formato binário . O formato binário precisará de um aplicativo (personalizado) para ler os dados e exibir em um formato legível por humanos. Mais dados podem ser compactados em um formato binário. A utilização do formato textual ou binário é uma decisão baseada na quantidade de dados e na facilidade de visualização do conteúdo.

Thomas Matthews
fonte
3

Em sistemas incorporados nos quais eu posso não ter um canal de saída disponível durante o tempo de execução, o aplicativo não pode permitir a velocidade atingida imposta pelo registro, ou o registro alteraria ou ocultaria o efeito que estou tentando gravar, geralmente recorreu ao empacotamento de dados binários em uma matriz ou em um buffer de anel, e imprimiu-os no final do teste ou despejou-os em bruto e gravou um intérprete para imprimi-los como legíveis. De qualquer forma, quero terminar com dados legíveis.

Em sistemas com mais recursos, por que inventar esquemas para otimizar o que não precisa ser otimizado?

JRobert
fonte
1
Da mesma forma, ao tentar efetuar logon em tempo real de um dispositivo incorporado a um PC através de uma porta serial de 9.600 bauds, é recomendável compactar dados ou usar um formato binário, para evitar estouros.
MAWG
3

Os arquivos de log destinam-se a ajudar na depuração de problemas. Normalmente, o espaço no disco rígido é muito mais barato que o tempo de engenharia. Os arquivos de log usam texto porque existem muitas ferramentas para trabalhar com texto (como tail -f). Até o HTTP usa texto sem formatação (veja também por que não enviamos binário ao invés de texto em http ).

Além disso, é mais barato desenvolver um sistema de log de texto sem formatação e verificar se ele funciona, mais fácil de depurar se der errado e mais fácil recuperar qualquer informação útil caso o sistema falhe e corrompa parte do log.

Casey Kuball
fonte
2
Como foi criado por outra pessoa, eu queria ressaltar que o HTTP / 2 (cuidado!) Permite comunicações binárias, bidirecionais e multiplexadas. Todos os desenvolvedores que gostam de elite devem aprender rapidamente e depois se perguntam por que isso não aconteceu antes.
Shaun Wilson
3

Um arquivo de texto corrompido ainda pode ser lido na parte corrompida. Um arquivo binário corrompido pode ser restaurado, mas também pode não ser. Mesmo se for restaurável, exigiria um pouco mais de trabalho. A outra razão é que um formato de log binário torna menos provável que, durante uma corrida para criar uma "correção temporária" (aka "a mais permanente de todas as correções"), a solução de log seja usada em vez de algo que pode ser criado mais rapidamente.

Dmitry Rubanovich
fonte
2

Contamos com testes de unidade para obter e manter a robustez do nosso software. (A maioria do nosso código é executado em um servidor, sem cabeçalho; a análise pós-operação dos arquivos de log é uma estratégia importante.). Quase todas as classes em nossa implementação fazem algum log. Uma parte importante de nossos testes de unidade é o uso de registradores 'simulados' usados ​​nos testes de unidade. Um teste de unidade cria um logger simulado e o fornece ao item que está sendo testado. Em seguida (quando útil / apropriado) analisa o que foi registrado (especialmente erros e avisos). O uso de um formato de log baseado em texto facilita muito isso pelas mesmas razões que as análises realizadas em logs 'reais': existem mais ferramentas à sua disposição que são rápidas de usar e adaptar.

Art Swri
fonte
2
embora outra pessoa tenha votado mal, gostaria de salientar que esse tipo de resposta ainda oferece valor, mostra que os logs baseados em texto podem ser úteis até nos piores níveis da prática, de maneira que o programador comum não se importa, mas devemos. +1
Shaun Wilson
Obrigado pelo comentário do suporte. Tento fornecer informações que acho que serão úteis para pelo menos algumas pessoas. É o que eu quero e espero quando vou para o SO.
Art SWRI
2

Historicamente, os Logs eram registros oficiais, manuscritos e seqüenciais de eventos. Quando o maquinário se tornou capaz de registrar eventos, estes foram gravados em um dispositivo de saída impressa, como uma impressora de teletipo, que produzia um registro seqüencial permanente, mas que só podia processar texto e, ocasionalmente, tocar uma campainha ...

Chris_F
fonte
2

Nos meus dias de mainframe, usamos um formato de log binário personalizado. O principal motivo não foi para economizar espaço, porque queríamos que o log ocupasse espaço finito substituindo entradas antigas por novas; a última coisa que queríamos era ser incapaz de diagnosticar problemas causados ​​por discos cheios (em 1980, o espaço em disco custava US $ 1000 / Mb, para que as pessoas não comprassem mais do que precisavam).

Agora, ainda gosto da idéia de um arquivo de log circular e, se os sistemas operacionais oferecerem uma fera, eu o usaria sem hesitação. Mas binário era uma má ideia. Você realmente não quer perder tempo encontrando os comandos certos para decifrar um arquivo de log quando tiver um problema crítico a resolver.

Michael Kay
fonte