AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1123835
Accepted
vidarlo
vidarlo
Asked: 2019-03-08 08:55:12 +0800 CST2019-03-08 08:55:12 +0800 CST 2019-03-08 08:55:12 +0800 CST

Reescrevendo logs recebidos via syslog de outra máquina

  • 772

Eu tenho a Máquina A, que é uma instalação pfsense, que envia logs via syslog para uma caixa Ubuntu. O Ubuntu Box terá que reescrever os logs, para substituir, por exemplo, nomes de host e alterar um pouco o formato.

O formato é geralmente o seguinte

Mar  7 00:05:32 hostname service: field1 field2 field3 field4 field5 field6 field7

Gostaria da possibilidade de reescrever hostname, serviço e mudar a ordem dos campos, e filtrar mensagens com determinado valor em determinado campo, pois não são interessantes.

Após a filtragem e tratamento, as mensagens devem ser gravadas em disco em um arquivo de log e enviadas para outra máquina via syslog.

Agora, a parte de registro é trivial - basta configurar o rsyslogd para aceitar as mensagens recebidas e encaminhá-las. No entanto, estou um pouco preso na parte de reescrever. Não sou casado com rsyslogd; qualquer daemon syslog serve.

logging rsyslog
  • 2 2 respostas
  • 2292 Views

2 respostas

  • Voted
  1. Best Answer
    PerlDuck
    2019-03-15T13:09:27+08:002019-03-15T13:09:27+08:00

    A pergunta é um pouco vaga, mas vou tentar propor uma possível solução. Para reescrever mensagens rsyslog, há vários módulos, um dos quais é mmfields. Ele divide uma mensagem recebida em um determinado caractere (apenas um caractere) em campos e permite o acesso a esses campos. Para uma mensagem como

    a=1 b=two c=3 d=four
    

    o separador seria um espaço em branco e os campos seriam acessíveis como $!f2, $!f3, $!f4e $!f5. Infelizmente, o primeiro campo ( $!f1) está sempre vazio porque a mensagem é precedida por um espaço e esse seria o primeiro campo. Assim, para a mensagem acima obtemos $!f1=="", $!f2=="a=1", $!f3=="b=two", $!f4=="c=3", e $!f5=="d=four".

    rsyslogvem com outros módulos de modificação de mensagens também, mas na falta de mais detalhes, escolhi este. Armazene o seguinte arquivo como /etc/rsyslog.d/10-so.conf. Altere o nome de acordo com a ordem de execução desejada, mas mantenha a .confextensão.

    # Load the "Message Modification" module "mmfields" to split
    # incoming messages into fields at a certain separator:
    module(load="mmfields")
    
    # Format used for messages that are forwarded to another host.
    # The fields are re-ordered and field #3 is omitted.
    template(name="rewrite_forward" type="list") {
        constant(value="<")
        property(name="pri")
        constant(value=">")
        property(name="timestamp" dateFormat="rfc3339")
        constant(value=" ")
        property(name="hostname")
        constant(value=" ")
        property(name="syslogtag")
        constant(value=" ")
        property(name="$!f4")
        constant(value=" ")
        property(name="$!f2")
        constant(value=" ")
        property(name="$!f5")
    }
    
    # Format used for messages that are written to a local logfile.
    # The format is almost the same as above, but lacks the priority,
    # uses a different timestamp format, and ends with a "\n" as this
    # is suitable for messages printed to a logfile.
    template(name="rewrite_file" type="list") {
        property(name="timestamp")
        constant(value=" ")
        property(name="hostname")
        constant(value=" ")
        property(name="syslogtag")
        constant(value=" ")
        property(name="$!f4")
        constant(value=" ")
        property(name="$!f2")
        constant(value=" ")
        property(name="$!f5")
        constant(value="\n")
    }
    
    if ( $programname == "so" ) then {
    
        # split message into fields at (exactly) one space character.
        # The "fields" can then be referred to as "$!f1", "$!f2", ..., "$!fN".
        # Note that "$!f1" will always be an empty string because the message
        # usually starts with a blank and that is considered to be the first
        # field. 
        action( type="mmfields" 
                separator=" " 
        )
    
        # If the second field is the string "b=2", then go ahead and log and
        # forward the message. Change the condition to your liking.
        if ($!f3 == "b=2") then {
    
            # write rewritten logmessage to local file
            action( type     = "omfile"
                    file     = "/var/log/so-rewrite-fields.log"
                    template = "rewrite_file"
            )
    
            # just for reference: write the unmodified message to the
            # very same logfile. Drop this for actual processing. It 
            # serves just as a debugging aid.
            action( type = "omfile"
                    file = "/var/log/so-rewrite-fields.log"
            )
    
            # forward rewritten message to another host
            action( type = "omfwd"  
                    target   = "127.0.0.1"  # change to actual destination
                    port     = "514"        # change to actual destination
                    protocol = "udp"        # change to actual destination
                    template = "rewrite_forward"
            )
    
        }
    
        # no further processing:
        stop
    }
    

    Reinicie rsyslog(via sudo systemctl restart rsyslog.service) e experimente:

    # A message that won't be logged because `$!f3 != "b=2"`:
    logger -t so --id=$$ "a=1 b=3 txt=Hello number=$RANDOM"
    
    # A message that will be logged because `$!f3 == "b=2"`:
    logger -t so --id=$$ "a=1 b=2 txt=Hello number=$RANDOM"
    

    A saída da segunda loggerinstrução será:

    Mar 14 21:40:34 stratum9 so[3533]: txt=Hello a=1 number=6484        # rewritten msg
    Mar 14 21:40:34 stratum9 so[3533]: a=1 b=2 txt=Hello number=6484    # original msg
    

    Para alterar o nome do host, basta substituir

    constant(value=" ")
    property(name="hostname")
    constant(value=" ")
    

    nos modelos com

    constant(value=" fromElsewhere ")
    

    Para alterar o syslogtag (o que você chamou de service ), substitua

        constant(value=" ")
        property(name="syslogtag")
        constant(value=" ")
    

    com

    constant(value=" otherService: ")
    

    A saída será então:

    Mar 14 22:05:51 fromElsewhere otherService: txt=Hello a=1 number=11763   # rewritten
    Mar 14 22:05:51 stratum9 so[3533]: a=1 b=2 txt=Hello number=11763       # original
    

    Veja aqui outras propriedades da mensagem.

    Observe que minha abordagem (com mmfields) depende de os campos sempre terem a mesma ordem e não permite facilmente reescrever mensagens como a=1 b=2( b=1 a=2reordenar e alterar pares de valor-chave). Para isso, outro módulo pode ser mais adequado.

    • 7
  2. ognjen
    2019-03-14T11:58:35+08:002019-03-14T11:58:35+08:00

    Tanto quanto eu sei, isso pode ser alcançado usando logstash elasticsearch e Kibana. Estou tentando fazer o mesmo e tive mais ou menos sucesso ao configurar uma pilha de alces. Em seguida, use filtros grok no logstash para dividir a mensagem syslog em diferentes campos e use-os para corresponder a um padrão e enviar alertas. Dê uma olhada neste guia , ele pode lhe dar algumas respostas sobre por onde começar.

    Esse tipo de configuração já possui filtros integrados para coisas como logs mysql ou logs apache ou nginx para começar. Aqui está uma boa visão geral dos recursos e arquitetura da pilha elk. Eu espero que isso ajude.

    • 1

relate perguntas

  • Como posso monitorar o uso de memória?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve