2009-09-18 14 views
10

Sto pensando di utilizzare syslog nelle mie applicazioni rails. Il processo è descritto nella this blog post:Utilizzo dell'applicazione syslog in rails

  1. Aggiungi gem 'SyslogLogger' al Gemfile
  2. Aggiungere require 'syslog_logger' in cima config/environments/production.rb
  3. scommentare Anche la linea config.logger = nello stesso file.

Nella scatola di produzione ho 4 applicazioni di scorrimento in esecuzione con passeggero. Se passo a utilizzare syslogger per tutte e 4 le mie applicazioni, allora temo che i messaggi di log di tutte e 4 le applicazioni andranno a un singolo file e i messaggi di log saranno interlacciati. Certo, posso usare splunk ma prima volevo controllare se fosse possibile per me ottenere un file di log per ciascuna delle mie applicazioni di rotaie. Sarebbe auspicabile per la mia situazione.

È possibile?

risposta

2

Sì, per impostazione predefinita, quasi tutti gli Unix syslogds scriveranno i messaggi indicati nella funzione user o local* nello stesso file. Tuttavia, ogni syslogd noto consentirà di specificare i file di registro in base alle singole strutture, in modo da poter avere il primo registro delle applicazioni su local1.*, il secondo su local2.* e così via.

Inoltre, recenti demoni syslog come syslog-ng consentire per i messaggi di spaccare in file diversi per valutare il messaggio contro un'espressione regolare (scrivere stringhe che hanno railsapp_1 in loro per /var/log/railsapp_1.log e così via log).

Quindi, configurare il syslogd in modo appropriato e si è fatto (i dettagli scabrosi di cambiamento che la configurazione dovrebbe essere chiesto il serverfault.com se le pagine man del sistema non consentono di farlo.)

5

@ risposta di citare copre un opzione per distinguere le app. Tuttavia, la struttura dei messaggi syslog ha in realtà 2 campi che lo rendono ancora più semplice: hostname e tag (più comunemente noto e utilizzato come nome del programma).

hostname viene impostato dal daemon syslog di sistema prima di inoltrare il messaggio a un server centralizzato. Sarà lo stesso per tutte le app sullo stesso sistema, ma potrebbe essere utile man mano che passi oltre 1 server.

Il più interessante è tag. L'app definisce tag quando crea un'istanza di SyslogLogger. Per esempio:

SyslogLogger.new('app1') 

classe Il registratore invierà al sistema syslogd come app1, e che appaiono sia nel file di registro locale e tutte le destinazioni a distanza di syslog (senza bisogno di modificare il messaggio di log in sé). L'impostazione predefinita è rails. Tutti i moderni demoni syslog possono filtrare in base a tag; vedere program() per syslog-ng e $programname per rsyslog.

Inoltre, vale la pena notare che lo SyslogLogger sta essenzialmente avvolgendo le funzioni C openlog() e syslog(), quindi in pratica tutte le configurazioni del post-log si verificano sul daemon di sistema.In generale ciò è auspicabile, ma a volte è possibile che l'app Rails effettui il log direttamente su una destinazione specifica (come per semplificare la distribuzione automatizzata, modificare attributi non consentiti da syslog() o eseguire in ambienti senza accesso al daemon di sistema).

Ci siamo imbattuti in un paio di questi casi e abbiamo effettuato un rimpiazzo di sostituzione Logger che genera i pacchetti UDP stesso. La gemma remote_syslog_logger è on GitHub.

Problemi correlati