Temos vários aplicativos que estão gerando seus próprios arquivos de log de texto sem formatação, que eu gostaria de encaminhar para um servidor syslog remoto para registro centralizado. Não tenho acesso a root
essas máquinas, nem posso reconfigurar syslog
para redirecionar a saída para uma máquina remota.
Encontrei algumas soluções on-line, mas na maioria são scripts caseiros de pessoas, e estou procurando por algo mais robusto e adequado para implementação em um ambiente de produção potencialmente de alto volume.
De preferência, algo projetado de olho em uma pequena área ocupada, daemon em segundo plano que continua em execução, que pode acompanhar muitas linhas etc. - Quais soluções estão disponíveis no momento?
Respostas:
Você já rejeitou "scripts bash de outras pessoas", mas esta é uma solução bastante comum - algum uso criativo do
logger
comando pode seguir um arquivo e enviar seu conteúdo para outro lugar.Eu pessoalmente não faria isso em um ambiente de produção.
Uma opção melhor que requer menos hackers de script está sendo usada
rsyslogd
e o módulo de entrada de arquivo de texto como yoonix mencionado - Esta é uma solução bastante decente, embora exista um potencial de linhas perdidas durante uma rotação de arquivo, e se você estiver em um sistema Linux comrsyslog
como seu daemon syslog, não há muito trabalho adicional necessário.syslog-ng
também suporta uma fonte de entrada de arquivo com funcionalidade semelhante arsyslog
's.IMHO, a melhor solução - embora exija a modificação do aplicativo que gera esses logs - é efetuar logon no syslog diretamente. Você não quer passar por etapas intermediárias, arquivos, etc. -
syslog
é o SYStem LOGger, e as coisas que escrevem logs em uma plataforma Unix devem enviá-las para o syslog.Infelizmente, a implementação disso é deixada como um exercício para o leitor (e desenvolvedor de aplicativos) e pode não ser possível se os desenvolvedores forem inexistentes, preguiçosos ou incompetentes.
fonte
rsyslog
configuração atualmente em execução no sistema. Você NÃO deve estar executando dois daemons syslog. Para não ser rude, mas você precisa parar de tentar fazer algo errado *: Toda solução adequada para esse cenário requer ações administrativas (raiz) no servidor ou modificação do aplicativo. Você terá que enfrentar essa realidade e lidar com qualquer grupo dentro da sua organização que tenha raiz nos sistemas em questão; caso contrário, essa pergunta será fora de tópico (você está tentando burlar as políticas da sua organização) ...Você pode usar o logstash com a entrada do arquivo e a saída do syslog .
Por exemplo, crie uma configuração com o arquivo (ou arquivos) que você deseja monitorar e as informações do servidor syslog.
file-to-syslog.conf:
O logstash inicial com
fonte
Eu hackeei juntos
tail.c
elogger.c
em um único programa compacto de pegada pequena (binário) que é leve, rápido e estável. Desde que tenha acesso de leitura ao (s) arquivo (s) de log, funcionará sem a necessidade de privilégios de root.Também fiz algumas melhorias no criador de logs nativo e adicionei um novo recurso (opcional) de inserir uma sequência de texto no início de cada linha de registro antes de ser enviada ao servidor de registro. O resultado é um programa que pode ser executado sozinho, sem a necessidade de usar pipes de shell (ou seja, não é necessário
tail logfile | logger
). Ele será executado para sempre até ser explicitamente eliminado ou encontrar um erro ao gravar no soquete de rede. Ele ainda continua a ser executado se o arquivo de log for girado ou até desaparecer (ele continuará a verificar se o arquivo reaparece).É fácil de usar: basta fornecer um ou mais arquivos de log para monitorar e, toda vez que uma nova linha for gravada no arquivo, ele enviará uma cópia dessa linha para o servidor syslog local ou remoto que você especificar. Além disso, a sequência de texto extra se você usar essa opção.
Na verdade, terminei o programa em dezembro, mas estava esperando o Yahoo obter os direitos autorais e disponibilizá-lo, o que eles já fizeram. (Eu escrevi como parte do meu trabalho no Yahoo).
informações do programa filelogger e link para download:
fonte
Existem várias maneiras de resolver isso. Mas o muito, muito primeira coisa que você deve fazer é: encaminha os logs usando syslog si .
O syslog (e muitas substituições para o syslog) possui recursos internos para encaminhar o log para outro servidor syslog em um endereço diferente. Você pode fazer isso facilmente, alterando o arquivo de configuração e anexando o endereço para o qual encaminhar o recurso. Por exemplo, adicionando esta linha a:
... encaminharia todas as instalações para a máquina em 192.168.1.1, que (espero) tenha o serviço em execução. O exemplo que eu dou aqui é para o rsyslog, que é o servidor de estoque do syslog no Debian, embora deva funcionar para muitos outros. Consulte a documentação para sua implementação do syslog
man syslog
e veja o que diz sobre "encaminhamento".O servidor syslog remoto pode ser o que você quiser. Há ainda produtos, como Splunk , que felizmente agregar esses logs em uma única visualização com um painel web, pesquisa, notificações dirigidas a eventos, etc. etc. Você pode ver mais aqui: http://www.splunk.com/ Se que não atende às suas necessidades, você pode usar outra coisa. Existem até servidores syslog que serão despejados em um banco de dados SQL!
Claro, você poderia escrever seu próprio script / programa / serviço para fazer isso por você, mas por que reinventar a roda quando ela é feita para você e já foi entregue a você?
Edit: Então eu voltei e reli a pergunta, e notei vários comentários. Parece:
Então, vamos abordar cada um em sequência:
root
para configurar o log. Nós precisamos apenas acessar a API syslog.root
não é um requisito para gravar no syslog; se esse fosse o caso, todos os serviços que eliminassem privilégios não conseguiriam gravar diagnósticos nos arquivos de log.Re: despejos de texto, isso é normal. no entanto, você poderá usar um subshell para canalizar a saída de STDERR e STDOUT para um programa que chama a API syslog. Isso não é ciência de foguetes, está longe de ser quebradiço e está bem documentado. De fato, é um dos motivos pelos quais o redirecionamento de saída existe. Um comando simples que poderia ser lançado em um único script de shell seria:
(meu aplicativo 2> & 1 | meu-syslog-shunt) &
se você tiver a capacidade de alterar o código-fonte do seu aplicativo, escreva um desvio para despejar a saída de texto no syslog em vez de um arquivo de texto sem formatação. Isso não deve ser muito difícil; tudo o que você faz é pegar as linhas que você produziria e envolvê-las com uma chamada. Contudo....
você pode não ter acesso ao código fonte, portanto não pode fazer isso. O que significa que algo como o nº 3 acima funcionaria bem.
fonte
Runtime.exec("logger ..."
) OK, obrigado.Estou respondendo minha própria pergunta.
A amostra pode ter funcionado, mas não consegui que o módulo Sys :: Syslog do perl funcionasse no host, e o / usr / bin / logger instalado no host não suporta o log no servidor remoto (util-linux-ng- 2.17.2)
Portanto, a primeira coisa que fiz foi fazer o download do código-fonte do util-linux-2.20.1, para o qual o programa logger suporta log remoto. Após o teste, ficou claro que há um limite imposto ao número de caracteres permitido na linha de log. Ao pesquisar no código fonte, encontrei um limite de 400 caracteres codificado. (Se você não acredita em mim, execute "strings / usr / bin / logger | grep 400" em qualquer sistema Linux).
Esse limite não é aceitável para log do tipo apache (incluindo nodejs), portanto, modifiquei o código e aumentei o limite para 4096. Enquanto estava nele, também adicionei uma nova opção de linha de comando que permite inserir um opcional sequência de texto no início de cada linha de log. Fiz isso porque os logs do nodejs não incluem o nome do host como se poderia ver no apache.
Nesse ponto, eu poderia executar um script de shell com "tail -F -n 0 [arquivo de log] | ./modified_logger ...." e funcionou. Mas eu tinha algumas preocupações sobre executar isso da supervisão (daemontools) ou mesmo em segundo plano, porque se um ou os outros lados do tubo terminarem, haverá o risco de todo o tubo terminar. Eu também tinha preocupações (embora não testadas) sobre desempenho.
por isso, decidi combinar a funcionalidade tail com a funcionalidade logger em um único binário executável que ignoraria a necessidade de usar pipes Unix ou programas externos. Eu fiz isso cortando o tail.c do gnu coreutils e incorporando o que eu preciso no programa de logger modificado.
O resultado é um novo binário (tamanho de 117k) que estou chamando de "filelogger" e que monitora continuamente um ou mais arquivos e registra cada nova linha em um syslog local ou remoto, via UDP ou TCP. Ele funciona como um encanto. Consegui fazer um pequeno teste comparativo e ele registra cerca de 17.000 linhas (1,8 MB) em cerca de 3 segundos em sub-redes com uma vlan e alguns comutadores físicos entre elas, em um servidor remoto executando o syslog-ng.
Para executar o programa, faça algo como o seguinte (em primeiro plano, em segundo plano ou supervisionado com daemontools):
./filelogger -t 'access' -d -p local1.info -n [host de log remoto] -u / tmp / ignorado -a $ (nome do host) / tmp / myfile1 / tmp / myfile2 ...
/ tmp / myfile1 e / tmp / myfile2 são os arquivos que estão sendo monitorados.
O "-a" é a nova opção que adicionei. Nesse caso, insiro o nome do host local no início de cada linha de log.
Essas soluções eram exatamente o tipo de solução que eu estava procurando quando fiz a pergunta e, como se viu, não existia até que eu a fiz. :)
fonte