Linux: come inviare nuove righe nei file di registro al syslog remoto?


8

Abbiamo diverse applicazioni che stanno generando i propri file di registro in testo normale, che vorrei inoltrare a un server syslog remoto per la registrazione centralizzata. Non ho accesso a rootqueste macchine, né posso riconfigurare syslogper reindirizzare l'output su una macchina remota.

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

Preferibilmente qualcosa progettato con un occhio per un ingombro ridotto, un demone di sfondo che continua a funzionare, che può tenere il passo con molte linee, ecc. - Quali soluzioni sono attualmente disponibili?


3
Hai visto il modulo di input del file di testo per rsyslog?
yoonix,

@yoonix: No non l'ho fatto, ma lo farò :)
Michael Martinez il

3
Uhm, syslog può inviare a server syslog remoti. Configura il tuo syslog locale per l'invio a un server remoto. Quindi accedi al tuo syslog locale tramite le chiamate syslog standard o usando il logger o qualcosa del genere.
Zoredache,

4
Perché non scrivi i tuoi file di registro in una pipe denominata e hai un demone in ascolto che li invia sulla loro strada serverfault.com/questions/189477/…
user9517

3
Non dovresti modificare l'app, basta mettere una pipa con lo stesso nome del file di registro in cui l'app sta scrivendo.
user9517

Risposte:


13

Hai già rifiutato "script bash di altre persone", ma questa è una soluzione abbastanza comune: un uso creativo del loggercomando può seguire un file e inviarne il contenuto altrove.
Personalmente non lo farei comunque in un ambiente di produzione.


Un'opzione migliore che richiede meno hacking di scripting rsyslogde il modulo di input di file di testo come yoonix menzionato - Questa è una soluzione abbastanza decente anche se c'è un potenziale per le linee perse durante una rotazione dei file e se sei su un sistema Linux con rsyslogpoiché il tuo demone syslog non richiede molto lavoro aggiuntivo.

syslog-ngsupporta anche una fonte di input di file con funzionalità simili a rsyslog's.


La soluzione migliore per IMHO , sebbene richieda la modifica dell'applicazione che genera questi registri, è quella di accedere direttamente a syslog. Non si desidera eseguire passaggi intermedi, file, ecc syslog.: È SYStem LOGger e le cose che scrivono log su una piattaforma Unix dovrebbero inviarle a syslog.
L'implementazione di questo è, sfortunatamente, lasciata come esercizio per il lettore (e lo sviluppatore dell'applicazione) e potrebbe non essere possibile se i tuoi sviluppatori sono inesistenti, pigri o incompetenti ....


7
@MichaelMartinez Dovresti modificare la rsyslogconfigurazione attualmente in esecuzione sul sistema. NON dovresti eseguire due demoni syslog. Non essere scortese, ma è necessario smettere di provare a fare qualcosa di sbagliato *: ogni soluzione adeguata a questo scenario richiede azioni amministrative (root) sul server o modifiche dell'app. Dovrai affrontare quella realtà e affrontare qualsiasi gruppo all'interno della tua organizzazione abbia radice sui sistemi in questione, altrimenti questa domanda è fuori tema (stai cercando di aggirare le politiche della tua organizzazione) ....
voretaq7

5
@Michael Tutto ciò ci dice che qualcuno sta cercando di forzare la squadra sbagliata a implementare la correzione.
Andrew B,

4
@MichaelMartinez imho, che suona come una strada abbastanza veloce per indebolire i livelli di debito tecnico.
Sirex,

2
@Sirex. Sia come sia, è la via delle cose. Lavoro in un'organizzazione che impiega decine di migliaia di persone, la maggior parte delle quali sono tecniche (ingegneri, sviluppatori, operatori, ecc.)
Michael Martinez,

5
Suppongo. In genere ho scoperto a lungo termine che non ci sono medaglie nelle vittorie di battaglie autoinflitte. Quando il debito tecnico arriva al punto, ha un impatto ironico sul business, le persone che hanno lavorato diligentemente per evitare l'elefante nella stanza tendono a finire con il trasporto della lattina, secondo la mia esperienza. Quindi direi di coprirti il ​​culo e convincere qualcuno a concordare nello scrivere gli aspetti negativi di questo.
Sirex,

6

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

Ad esempio, crea una configurazione con il file (o i file) che desideri monitorare e le informazioni del tuo 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

+1. se l'utilizzo dell'input di file di rsyslog non è un'opzione, logstash è la cosa migliore da fare. In molti modi è meglio a lungo termine.
Sirex,

Non ho familiarità con questo. Se fa quello che mi serve, mi farebbe risparmiare il problema di hackerare coreutils e util-linux.
Michael Martinez,

sì, la configurazione sarà simile a questa: pastebin.com/xeC9hxD3
Sirex

sembra uno strumento molto interessante, ma sicuramente eccessivo per quello che mi serve qui. logstash è un servizio proprio, con interfaccia web, richiede java, ecc. Continuerò a utilizzare il mio filelogger che è leggero, di dimensioni ridotte, ottimizzato per le prestazioni. ... Ma grazie per aver suggerito il logstash perché posso vederne la necessità in altre situazioni in futuro!
Michael Martinez,

Sì, è uno strumento jruby confezionato in vaso. La gui è in realtà un kibana che è impacchettato in esso per semplicità ma in realtà è un progetto separato, quindi non è necessario solo per analizzare i messaggi. Fondamentalmente è un coltellino svizzero di disboscamento. Definisci input e output e nel mezzo puoi opzionalmente grok i log, il che dà loro un contesto. - È probabile che l'IT sia eccessivo per te, a meno che tu non voglia anche utilizzare elasticsearch nei tuoi dati di registro.
Sirex,

4

Ho messo insieme tail.ce logger.cin un unico, piccolo ingombro programma compilato (binario) che è leggero, veloce e stabile. Finché ha accesso in lettura ai file di registro, funziona senza il privilegio di root.

Ho anche apportato alcuni miglioramenti al logger nativo e ho aggiunto una nuova funzionalità (facoltativa) di inserimento di una stringa di testo all'inizio di ogni riga di registro prima che venga inviata al server di registro. Il risultato è un programma che può essere eseguito da solo, senza la necessità di utilizzare shell shell (cioè non è necessario tail logfile | logger). Funzionerà per sempre fino a quando non viene esplicitamente ucciso o non si verifica un errore durante la scrittura sul socket di rete. Continua anche a funzionare se il file di registro viene ruotato o scompare (continuerà a cercare di vedere se il file riappare).

È facile da usare: basta dargli uno o più file di registro da monitorare e ogni volta che una nuova riga viene scritta nel file, invierà una copia di quella linea al server syslog locale o remoto specificato. Più la stringa di testo aggiuntiva se si utilizza tale opzione.

In realtà ho finito il programma a dicembre, ma stavo aspettando che Yahoo prendesse il copyright e lo rendesse disponibile, cosa che ora hanno fatto. (L'ho scritto come parte del mio lavoro in Yahoo).

informazioni sul programma filelogger e link per il download:


@slm: ho riscritto come da lei richiesto
Michael Martinez,

Molto utile, grazie Michael. Qualche possibilità lo impacchetterai per debian apt-get install?
joelparkerhenderson,

@joelparkerhenderson. Ciao Joel. Sfortunatamente, probabilmente non perché non lavoro con Debian. Hai provato a copiare il file binario sul tuo sistema e vedere se funziona?
Michael Martinez,

1

Esistono diversi modi per affrontarlo. Ma molto, molto prima cosa da fare è: trasmettere i log utilizzando syslog per sé .

Syslog (e molti sostituti di syslog) dispongono di funzionalità integrate per inoltrare la registrazione a un altro server syslog a un indirizzo diverso. Puoi farlo facilmente modificando il file di configurazione e aggiungendo l'indirizzo a cui inoltrare la struttura. Ad esempio, aggiungendo questa riga a:

*.*    @192.168.1.1

... inoltrerebbe tutte le strutture alla macchina al 192.168.1.1, che (si spera) ha il servizio in esecuzione. L'esempio che do qui è per rsyslog, che è il server stock syslog di Debian, anche se dovrebbe funzionare per molti altri. Consultare la documentazione per l'implementazione di syslog con man sysloge vedere cosa dice "inoltro".

Il server remoto syslog può essere quello che ti piace. Esistono anche prodotti, come Splunk , che aggregano felicemente questi registri in un'unica vista con un pannello Web, ricerca, notifiche guidate dagli eventi, ecc. Ecc. Puoi vedere di più qui: http://www.splunk.com/ Se che non soddisfa le tue esigenze, puoi usare qualcos'altro. Esistono anche server syslog che eseguiranno il dump in un database SQL!

Certo, potresti scrivere il tuo script / programma / servizio per farlo per te, ma perché reinventare la ruota quando è fatta sia per te che già per te?


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

  1. si desidera aggregare i registri dell'applicazione
  2. non hai accesso a root
  3. le tue applicazioni scaricano testo da qualche parte
  4. le tue applicazioni non sanno come scrivere nel syslog locale
  5. non hai il controllo del codice sorgente dell'applicazione

Quindi affrontiamo ciascuno in sequenza:

  1. syslog doveva aggregare i log insieme. Puoi usare tutto ciò che ti piace, ma c'è un motivo per cui è in circolazione da molto tempo. È ben collaudato, con debug, ben documentato, noto e per la maggior parte delle piattaforme * nix supportate quasi universalmente in un modo o nell'altro.
  2. non è necessario l'accesso rootper configurare la registrazione. Abbiamo solo bisogno di accedere all'API syslog. rootnon è un requisito per scrivere nel syslog; in tal caso, tutti quei servizi che eliminano i privilegi non sarebbero in grado di scrivere la diagnostica nei file di registro.
  3. Ri: discariche di testo, questo è normale. tuttavia, dovresti essere in grado di utilizzare una subshell per reindirizzare l'output di STDERR e STDOUT a un programma che chiama l'API syslog. Questa non è scienza missilistica, è tutt'altro che fragile, ed è ben documentata. In effetti, è uno dei motivi per cui esiste anche il reindirizzamento dell'output. Un semplice comando che potrebbe essere lanciato in un singolo script di shell sarebbe:

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

  4. se hai la possibilità di modificare il codice sorgente della tua applicazione, dovresti scrivere uno shunt in esso per scaricare l'output del testo in syslog invece che in un semplice file di testo. Questo non dovrebbe essere troppo difficile; tutto ciò che fai è prendere le linee che emetteresti e avvolgerle con una chiamata. Però....

  5. potresti non avere affatto accesso al codice sorgente, quindi non puoi farlo. Ciò significa che qualcosa come il n. 3 sopra funzionerebbe bene.


due motivi: (1) semplicemente perché, come già accennato, non c'erano root o sudo nelle caselle in questione. (2) Lo stesso "logger" può inoltrare al server remoto, ma ha un limite di 400 caratteri per riga di log, che non è appropriato per i log di Apache. Ad ogni modo, ho già messo insieme una soluzione personalizzata che fa esattamente ciò di cui avevo bisogno (e migliora anche il "logger"). Vedi la mia risposta qui per "filelogger"
Michael Martinez,

4. Syslog non è solo un flusso di file che posso aprire e scrivere testo. Lo shunt che scrivo dovrebbe aprire un socket alla porta UDP su cui ascolta il syslog?
Noumenon,

1
@Noumenon, non sono del tutto chiaro sulle tue intenzioni, ma suppongo che tu voglia inviare l'output del programma nel registro di sistema, cosa che può essere fatta con il comando logger. linux.die.net/man/1/logger
Avery Payne,

@AveryPayne Così Runtime.exec("logger ...") OK, grazie.
Noumenon,

0

Sto rispondendo alla mia domanda.

swatch potrebbe aver funzionato, ma non sono riuscito a far funzionare il modulo Sys :: Syslog di perl sull'host e il / usr / bin / logger installato sull'host non supporta la registrazione sul 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 il quale il programma logger supporta la registrazione remota. Al momento del test, è emerso che esiste un limite imposto al numero di caratteri consentiti sulla riga di registro. Scavando nel codice sorgente ho trovato un limite di 400 caratteri codificato. (Se non mi credi, esegui "stringhe / usr / bin / logger | grep 400" su qualsiasi sistema Linux).

Questo limite non è accettabile per il tipo di registrazione apache (compresi nodejs), quindi ho modificato il codice e aumentato il limite a 4096. Mentre ero lì, ho anche aggiunto una nuova opzione da riga di comando che consente di inserire un facoltativo stringa di testo all'inizio di ogni riga del registro. L'ho fatto perché i log di nodejs non includono il nome host come si potrebbe vedere in apache.

A questo punto, ho potuto eseguire uno script di shell con "tail -F -n 0 [logfile] | ./modified_logger ...." e ha funzionato. Ma avevo delle preoccupazioni su come eseguire questo da supervisione (daemontools) o anche in background, perché se l'uno o l'altro lato del tubo termina, allora c'è il rischio che l'intero tubo finisca. Ho anche avuto preoccupazioni (anche se non testate) per le prestazioni.

così ho deciso di combinare la funzionalità tail con la funzionalità logger in un unico binario eseguibile che avrebbe aggirato la necessità di usare pipe Unix o programmi esterni. L'ho fatto hackerando tail.c da gnu coreutils e incorporando ciò di cui ho bisogno nel programma di logger modificato.

Il risultato è un nuovo binario (dimensione 117k) che chiamo "filelogger" e che monitora continuamente uno o più file e registra ogni nuova linea in un syslog locale o remoto, tramite UDP o TCP. Esso funziona magicamente. Sono stato in grado di fare un po 'di benchmarking e registra circa 17.000 linee (1,8 MB) in circa 3 secondi attraverso le sottoreti con un vlan e un paio di switch fisici tra loro, su un server remoto che esegue syslog-ng.

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

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

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

"-A" è la nuova opzione che ho aggiunto. In questo caso, inserisco il nome host locale all'inizio di ogni riga di registro.

Questa soluzione era esattamente il tipo di soluzione che stavo cercando quando ho posto la domanda e, come si è scoperto, non esisteva fino a quando non l'ho fatta io. :)


Probabilmente lo renderò disponibile su sourceforge ad un certo punto. I suoi vantaggi sono che è un ingombro molto ridotto, leggero, facile da usare e ottimizzato per le prestazioni. Una volta letto il testo del messaggio, tutta l'elaborazione viene eseguita nel buffer di memoria, quindi trasferita direttamente al socket.
Michael Martinez,


4
Sto cercando di non essere dura, ma io sto andando a essere franchi: questa soluzione non esisteva, perché è terribile. Invece di interfacciarti con gli altri gruppi della tua organizzazione e implementare una soluzione sana e standard hai lanciato un hack con un codice totalmente non supportato che ora devi testare / eseguire il debug / continuare. È ignorato facilmente 50 + anni di esperienza che ti dice "non fare così" - spero per il tuo bene questo non saltare in aria in faccia, ma non si è assolutamente, indiscutibilmente facendo è sbagliato qui ...
voretaq7

1
si. giusto .... Ecco come l'open source va avanti, amico. Se tutti lo facessero a modo tuo, non ci sarebbero progressi. Come pensi che sia nato GNU, Linux e tutto ciò che è basato su di esso? Le persone fanno esattamente il genere di cose che ho fatto qui. Se ti fa sentire meglio, intendo il mio codice nel nostro sistema di gestione dei pacchetti, dove tutti qui nell'organizzazione sono liberi di usarlo, distribuirlo e migliorarlo, se lo desiderano.
Michael Martinez,

Cordiali saluti, non è una soluzione terribile. Al contrario è uno strumento molto utile. Durante la ricerca di soluzioni online la scorsa settimana, mi sono imbattuto in altre persone che chiedevano dove potevano trovare questa esatta funzionalità.
Michael Martinez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.