Linux: come submit nuove righe nei file di log al syslog remoto?

Abbiamo diverse applicazioni che stanno generando i propri file di log di text normale, che vorrei inoltrare a un server syslog remoto per la logging centralizzata. Non ho accesso alla root su queste macchine, né posso riconfigurare il syslog per redirect l'output a una macchina remota.

Ho trovato alcune soluzioni in linea, ma sono per lo più script di collaborazione casalinghi di persone e sto cercando qualcosa di più robusto che sia adatto per l'implementazione in un ambiente di produzione potenzialmente ad alto volume.

  • Perché il filter logstash syslog_pri non può visualizzare la priorità nei messaggi syslog
  • l'inoltro di rsyslog udp tronca a 2048 caratteri
  • Come mantenere l'host sorgente di log utilizzando logstash
  • Ordine syslog strano
  • ELK Stack (Logstash, Elasticsearch e Kibana) con il server syslog remoto concorrente?
  • Linux: logwatch (8) è troppo rumoroso. Come posso controllare il livello di rumore?
  • Preferibilmente qualcosa progettato con un occhio per un piccolo footprint, daemon di background che continua a funzionare, che può tenere il passo con molte linee, ecc. – Quali soluzioni sono attualmente disponibili?

    5 Solutions collect form web for “Linux: come submit nuove righe nei file di log al syslog remoto?”

    Hai già rifiutato "gli script di bash di altre persone", ma questa è una soluzione abbastanza comune: un uso creativo del command logger può seguire un file e inviarlo altrove.
    Io personalmente non farò questo in un ambiente di produzione però.


    Un'opzione migliore che richiede less hackery di scripting sta utilizzando rsyslogd e il module di input di text come yoonix menzionato – Questa è una soluzione abbastanza decente sebbene ci sia un certo potenziale per le righe perse durante una rotazione dei file e se sei su un sistema Linux con rsyslog come il tuo demone syslog non c'è molto lavoro aggiuntivo richiesto.

    syslog-ng support anche una sorgente di input di file con funzionalità simili a rsyslog .


    IMHO la soluzione migliore – seppure quella che richiede la modifica dell'applicazione che genera questi registri – è accedere direttamente al syslog. Non si desidera passare attraverso passaggi intermedi, file, ecc. – syslog è il SYStem LOGger e le cose che scrivono registri su una piattaforma Unix devono essere inviate a syslog.
    L'implementazione di questo è, purtroppo, lasciata come un esercizio per il lettore (e lo sviluppatore di applicazioni) e potrebbe non essere ansible se i tuoi sviluppatori sono inesistenti, pigri o incompetenti ….

    È ansible utilizzare logstash con l'input di file e l'output syslog .

    Ad esempio, creare una configuration con il file (o file) che si desidera monitorare e le informazioni sul server syslog.

    file-to-syslog.conf:

     input { file { path => "/var/log/kern.log" } } output { syslog { facility => "kernel" host => "syslog.example.com" port => 514 severity => "informational" } } 

    Il logstash di avvio con

     java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf 

    Ho hackato insieme tail.c e logger.c in un singolo programma piccolo compilato (binario) che è leggero, veloce e stabile. Fintanto che ha l'accesso in lettura ai file di registro, funziona senza bisogno di privilegio di root.

    Ho anche fatto un paio di miglioramenti al logger nativo e ho aggiunto una nuova funzionalità (facoltativa) per inserire una string di text all'inizio di each row di registro prima che venga inviata al server di registro. Il risultato è un programma che può essere eseguito da solo, senza bisogno di utilizzare i tubi shell (cioè non necessitano di tail logfile | logger ). Funzionerà per sempre finché non viene uccisa esplicitamente o si incontra un errore che scrive alla presa di networking. Funziona persino se il file di registro viene ruotato o persino scompare (continuerà a cercare di vedere se il file riappare).

    È facile da usare: basta dare uno o più file di registro per monitorare e each volta che una nuova row viene scritta al file, invierà una copia di quella row al server syslog locale o remoto specificato. Più la string di text supplementare se si utilizza tale opzione.

    Ho effettivamente terminato il programma in dicembre, ma ero in attesa di Yahoo di prendere copyright e renderlo disponibile, che hanno fatto ora. (Lo scrissi come parte del mio lavoro a Yahoo).

    informazioni sul programma di filelogger e il link di download:

    • Blog post su filelogger
    • GitHub Repo per filelogger

    Sto rispondendo alla mia domanda.

    swatch potrebbe aver funzionato, ma non sono riuscito a get il module Sys :: Syslog perl per lavorare sull'host e il / usr / bin / logger installato sull'host non support la logging a server remoto (util-linux-ng- 2.17.2).

    Quindi, la prima cosa che ho fatto è stato scaricare il codice sorgente per util-linux-2.20.1 per cui il programma di logger support il logging remoto. Al momento della verifica, è emerso che esiste un limite imposto al numero di caratteri consentiti sulla linea di registro. Scavando nel codice sorgente ho trovato un limite di 400 caratteri hard-coded. (Se non mi credi, esegui "stringhe / usr / bin / logger | grep 400" su qualsiasi sistema Linux).

    Questo limite non è accettabile per il tipo apache di logging (inclusi i nodes), quindi ho modificato il codice e ho aumentato il limite a 4096. Mentre ero a questo punto, ho anche aggiunto una nuova opzione di row di command che consente di inserire un opzionale string di text all'inizio di each row di registro. Ho fatto questo perché i log di nodejs non includono il nome host come si potrebbe vedere in apache.

    A questo punto, potrei eseguire uno script di shell con "tail -F -n 0 [logfile] ./modified_logger …." e funzionava. Ma ho avuto alcune preoccupazioni per gestire questo da supervise (daemontools) o anche in background, perché se uno o gli altri lati del pipe terminano, allora c'è il rischio che l'integer pipe terminerà. Ho anche avuto preoccupazioni (anche se non testate) circa le performance.

    così ho deciso di combinare la funzionalità di coda con la funzionalità di logger in un singolo binario eseguibile che ignorerebbe la necessità di utilizzare i tubi Unix oi programmi esterni. Lo ho fatto per hacking tail.c da gnu coreutils e incorporando quello che mi serve nel programma modificato del logger.

    Il risultato è un nuovo binario (size 117k) che chiamo "filelogger" e che controlla continuamente uno o più file e registra each nuova linea a un syslog locale o remoto, sia tramite UDP o TCP. Funziona come un fascino. Ho potuto fare un piccolo benchmarking e registro circa 17.000 righe (1,8MB) in circa 3 secondi tra le sottoreti con un vlan e un paio di switch fisici tra di loro, a un server remoto che esegue syslog-ng.

    per eseguire il programma, eseguire qualcosa di simile al seguente (in primo piano, in background o supervisionato da daemontools):

    ./filelogger -t 'accesso' -d -p local1.info -n [loghost remoto] -u / tmp / ignorato -a $ (hostname) / tmp / myfile1 / tmp / myfile2 …

    / tmp / myfile1 e / tmp / myfile2 sono i file che vengono monitorati.

    La "-a" è la nuova opzione che ho aggiunto. In questo caso inserisco il nome host locale all'inizio di each row di registro.

    Queste soluzioni erano esattamente il tipo di soluzione che cercavo quando ho chiesto la domanda e, come si è scoperto, non esisteva finché non l'ho fatta. 🙂

    Ci sono diversi modi per affrontare questo problema. Ma la cosa molto, prima cosa che dovresti fare è: inoltrare i registri usando il syslog stesso .

    Syslog (e molte sostituzioni per il syslog) dispone di strutture incorporate per inoltrare la logging ad un altro server syslog in un indirizzo diverso. Puoi facilmente farlo cambiando il file di configuration e aggiungendo l'indirizzo per inoltrare la struttura. Ad esempio, aggiungendo questa row a:

     *.* @192.168.1.1 

    … trasmetterà tutti gli impianti alla macchina al 192.168.1.1, che (speriamo) ha il servizio in esecuzione. L'esempio che dà qui è per rsyslog, che è il server syslog di riserva su Debian, anche se dovrebbe funzionare per molti altri. Consultare la documentazione per l'implementazione di syslog con l' man syslog e vedere cosa dice su "inoltro".

    Il server syslog remoto può essere quello che ti piace. Ci sono anche prodotti, come Splunk , che aggregano felicemente questi registri in una singola visualizzazione con un dashboard web, ricerca, notifiche gestite da events, ecc. Puoi vedere di più qui: http://www.splunk.com/ Se che non soddisfa le tue esigenze, puoi utilizzare qualcos'altro. Ci sono anche server syslog che dump in un database SQL!

    Certo, potresti scrivere il tuo script / programma / servizio per farlo per te, ma perché ricreare la ruota quando è fatta per te e già dato a te?


    Modifica: Così sono tornato indietro e riletto la domanda e ho notato diversi commenti. Suona come:

    1. si desidera aggregare i registri delle applicazioni
    2. non si ha accesso alla radice
    3. le tue applicazioni dimenticheranno il text da qualche parte
    4. le tue applicazioni non sanno come scrivere al syslog locale
    5. non hai il controllo sul codice sorgente dell'applicazione

    Quindi, affrontiamo ciascuno in sequenza:

    1. il syslog whereva aggregare i registri insieme. Puoi utilizzare qualsiasi cosa ti piace, ma c'è un motivo per cui è passato da molto tempo. È ben testato, ben debug, ben documentato, noto e per le piattaforms più * nix quasi universalmente supportte in un solo sapore.
    2. non abbiamo bisogno dell'accesso alla root per impostare la logging. Abbiamo solo bisogno dell'accesso all'API syslog. root non è un requisito per scrivere al syslog; se questo fosse il caso, tutti i servizi che rilasciano i privilegi non sarebbero in grado di scrivere la diagnostica nei file di registro.
    3. Re: discariche di text, questo è normale. tuttavia, dovresti essere in grado di utilizzare una sottostruttura per pipare l'output di STDERR e STDOUT in un programma che chiama l'API syslog. Questa non è una scienza a razzo, è lontano dall'essere fragile e è ben documentata. Infatti, è una delle ragioni che esiste anche il reindirizzamento dell'output. Un semplice command che potrebbe essere lanciato in un singolo script di shell sarebbe:

      (my-application 2> & 1 | my-syslog-shunt) &

    4. se si ha la possibilità di modificare il codice sorgente dell'applicazione, è necessario scrivere un shunt per espellere l'output di text in syslog anziché un file di text normale. Questo non dovrebbe essere troppo difficile; tutto quello che fai è prendere le righe che avreste prodotto e avvolgerle con una chiamata. Però….

    5. potrebbe non avere alcuna accessibilità al codice sorgente, in modo da non farlo. Ciò significa che qualcosa come il # 3 sopra functionrebbe bene.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.