Como ter vários fluxos de log na janela de encaixe

21

Temos um aplicativo que grava três tipos de logs em três arquivos separados: logs de acesso, logs genéricos de aplicativos e logs do sistema. O formato (e a finalidade) desses logs são muito diferentes. E temos encaminhadores de logs separados que os enviam separadamente para o nosso sistema de registro centralizado.

Com base nos registros de tratamento como princípio do fluxo de eventos , estamos pensando em passar do uso de arquivos para o stdout. Embora conheçamos alguns dos benefícios dessa abordagem, isso também significaria que obteríamos um fluxo mesclado de logs com formatos diferentes, que precisaríamos dividir novamente antes de poder enviá-los ao nosso sistema central (Kibana / Splunk / etc.) ou lá dentro.

Estamos nos perguntando se existem ferramentas ou recomendações sobre como devemos abordar essa situação.

SztupY
fonte
4
Eu não acho que vale a pena. Por que trabalhar mais para mesclar e depois dividir os fluxos de logs, apenas por causa de algum "princípio"? Arquivos são bons. Arquivos funcionam. Isso soa com excesso de engenharia. Eu diria que talvez canalize todos os logs no syslog, com tags diferentes, etc., mas devo dizer que, se alguém da minha equipe sugerir isso, eu ficaria decepcionado.
Assaf Lavie 31/03
Porque o uso de arquivos tem outros tipos de pesadelos de gerenciamento, especialmente se eles são gerados de dentro de um contêiner de janela de encaixe. Por agora parece que as desvantagens de mudar para stdout superam os benefícios para o nosso caso de uso, mas já estamos tendo problemas com a nossa abordagem baseada em arquivo
SztupY
3
Eu não sei sobre "pesadelos". Eu sei que é assim que as coisas são feitas há algum tempo e há muito software por aí que ajuda você a fazer isso. Os arquivos de log são rotacionados, lidos com pontos de verificação - um arquivo é uma ótima abstração para isso. Eu não aceitaria um princípio que me vende novos pesadelos por medo de padrões antigos e familiares. Seus registros de log são gravados em um arquivo ou manipulados na memória (pelo menos enquanto estiverem sendo movidos pelo contêiner). Boa sorte em obter a confiabilidade dos arquivos de log com divisores e fusões de fluxo na memória.
Assaf Lavie 31/03
@AssafLavie Você deve escrevê-lo em uma resposta que possa ser votada. IMHO é um ponto de vista perfeitamente válido.
Dan Cornilescu
2
Eu vim aqui com a mesma pergunta. O simples fato é que a funcionalidade de log embutida do docker depende de tudo o que é stdout / stderr; portanto, o driver de log e o ecossistema de ferramentas de terceiros criadas em torno dele também. Também estou tentado a despejar todos os meus logs em um volume de host, mas sei que vou ter que voltar e gerenciar isso quando meus contêineres mudarem para k8s ou openshift ou gke ou o que for, enquanto se eu seguir a janela de encaixe stdout abordagem, será muito mais suave. Enquanto isso eu vou continuar procurando uma resposta para esta pergunta legítima
ruibarbo

Respostas:

13

Ainda estou procurando uma abordagem de mesclagem / divisão, mas, enquanto isso, a abordagem recomendada pela documentação do Kubernetes parece uma solução sólida: use um contêiner lateral para cada um dos logs separados .

Um "side-car" é qualquer contêiner de docker que você usa ao lado de outro contêiner de docker para trabalhar com ele de alguma maneira. Nesse caso, para cada um dos seus três logs, você teria um contêiner separado que varre ou segue os logs e as saídas para o stdout.

Dessa maneira, cada um de seus contêineres de log-sidecar possui seu próprio docker-log a partir de seu próprio stdout. Sendo separado assim, você pode usar práticas padrão do docker (e kubernetes, etc) para separar ou agregar. Aqui está o que a página do Kubernetes tem a dizer:

Essa abordagem permite separar vários fluxos de logs de diferentes partes do seu aplicativo, alguns dos quais podem não ter suporte para gravar no stdout ou stderr. A lógica por trás do redirecionamento de logs é mínima, portanto dificilmente representa uma sobrecarga significativa. Além disso, como stdout e stderr são manipulados pelo kubelet, você pode usar ferramentas internas, como logs do kubectl.

Os "fluxos de log separados" decorrem da marcação interna que o docker aplica aos logs de diferentes contêineres, descritos na documentação do docker aqui:

A opção log de tags especifica como formatar uma tag que identifica as mensagens de log do contêiner. Por padrão, o sistema usa os 12 primeiros caracteres do ID do contêiner. Para substituir esse comportamento, especifique uma opção de tag

Ruibarbo
fonte
Vale mencionar a desvantagem dessa abordagem de log-sidecar-containers, citação: "Observe que, apesar do baixo uso da CPU e da memória, gravar logs em um arquivo e depois transmiti-los ao stdout pode duplicar o uso do disco". Gostaria de saber se alguém tenta esta abordagem na prática.
yusong 22/10
8

A idéia de mesclá-los em um fluxo apenas para dividi-los mais tarde parece dolorosa. Eu não tive um motivo para fazer isso sozinho, mas é aqui que eu começaria:

  • Ao executar o contêiner do docker, crie um volume para facilitar a exibição / envio de logs do host.
  • Use algo como remote_syslog2 para enviar os logs para o coletor de logs

Parece um pouco menos do que elegante ter que fazer algumas configurações no host também, mas se você usar algo como ansible, poderá executar um manual e configurá-lo durante a implantação na caixa, não deve ser muito ruim.

bradym
fonte
Essa solução pode ser combinada com pipes nomeados, o único problema com os pipes nomeados é que eles não funcionam em todos os sistemas no momento. Eles não funcionam no Mac
Jens