Rotazione del registro di produzione di Ruby on Rails


172

Qual è il modo migliore per abilitare la rotazione dei log in un'app di produzione Ruby on Rails?

Usando logrotate sul server di hosting o esiste una serie di opzioni da utilizzare durante l'inizializzazione del logger dall'app?


Vedo che c'è già una risposta su questo, ma volevo chiedere qual è il tuo ambiente. Uso io stesso il metodo syslog + logrotate, ma ovviamente il tipo di ambiente (sia dedicato che condiviso; che tipo * ix OS sta ospitando, o è un altro, ecc.) Avrebbe qualche rilevanza qui.
ylluminate

Risposte:


203

Opzione 1: syslog + logrotate

È possibile configurare i binari per utilizzare gli strumenti di registro dei sistemi.

Un esempio in config / environment / production.rb .

# Use a different logger for distributed setups
config.logger = SyslogLogger.new

In questo modo, accedi a syslog e puoi utilizzare gli strumenti logrotate predefiniti per ruotare i log.

Opzione 2: registri normali di Rails + logrotate

Un'altra opzione è semplicemente configurare logrotate per raccogliere i log lasciati dalle rotaie. Su Ubuntu e Debian questo sarebbe, ad esempio, in un file chiamato /etc/logrotate.d/rails_example_com.

/path/to/rails.example.com/tmp/log/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

Come indicato di seguito, in Rails si consiglia di utilizzare copytruncateper evitare di riavviare l'app Rails.

Modifica: rimossi "script condivisi / endscript" poiché non vengono utilizzati qui e causano problemi in base al commento. E rimosso create 640 root admcome da commento suggerito.


3
Per usare logrotate, la riga "config.logger = SyslogLogger.new" in config / environment / production.rb dovrebbe rimanere commentata o dovrebbe essere senza commenti?
robertwbradford,

2
Dovrebbe rimanere commentato, in modo che i file di registro siano scritti (ad esempio): /var/www/myrailsapp/current/log/production.log
Luca Spiller

3
Se si utilizza la logrotatesoluzione, vale la pena @ risposta di Amit-Saxena - suggerisce l'uso di copytruncatesopra della createdirettiva.
Tom Harrison,

3
Quando usi copytruncate, createnon ha alcun effetto, quindi dovresti probabilmente rimuoverlo dal tuo esempio
Michaël Witrant

3
Potrebbe anche essere necessario aggiungere la riga su your_rails_user your_rails_groupcon il proprietario e il gruppo dei file di registro (ovvero quelli del processo Rails / Passenger) o (versioni recenti di?) Logrotate potrebbero lamentarsi delle autorizzazioni.
oseiskar,

56

Se stai usando logrotate, puoi scegliere una delle opzioni mostrate sotto inserendo un file conf nella directory /etc/logrotate.d/.

# Rotate Rails application logs based on file size
# Rotate log if file greater than 20 MB
/path/to/your/rails/applicaton/log/*.log {
    size=20M
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

O

# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  copytruncate
}

Si noti che copytruncate crea una copia di backup del registro corrente e quindi cancella il file di registro per continuare a scrivere. L'alternativa è usare create che eseguirà la rotazione rinominando il file corrente e quindi creando un nuovo file di registro con lo stesso nome del vecchio file. Consiglio vivamente di usare copytruncate a meno che tu non sappia che devi creare. Il motivo è che Rails potrebbe continuare a puntare al vecchio file di registro anche se il suo nome è cambiato e potrebbe essere necessario riavviare per individuare il nuovo file di registro. copytruncate evita questo mantenendo lo stesso file del file attivo.


Ma non dovrei riavviare i binari ogni volta che logrotate viene eseguito?
lzap,

2
Tronca il file di registro originale in posizione dopo aver creato una copia, invece di spostare il vecchio file di registro e opzionalmente crearne uno nuovo, può essere utilizzato quando ad alcuni programmi non è possibile dire di chiudere il suo file di registro e quindi potrebbe continuare a scrivere (aggiungendo) a il file di registro precedente per sempre. Si noti che c'è un intervallo di tempo molto piccolo tra la copia del file e il suo troncamento, quindi alcuni dati di registrazione potrebbero andare persi. Quando viene utilizzata questa opzione, l'opzione di creazione non avrà alcun effetto, poiché il vecchio file di registro rimane in posizione.
lzap,

1
Non è necessario riavviare i binari se si utilizza copytruncate perché punta ancora allo stesso file di registro.
amit_saxena,

La configurazione richiede di indicare quando ruotare i registri? come "settimanale" o "dimensione = 20 M"? O puoi ometterlo, nel caso in cui desideri eseguire solo logrotate manualmente?
Damainman,

1
Non sono sicuro di aver compreso correttamente la tua domanda, ma devi specificare un criterio per la rotazione automatica del registro. Se non vuoi che sia automatico, non mettere il file nella directory /etc/logrotate.d/, conservalo altrove. È quindi possibile eseguire logrotate --force $CONFIG_FILEspecificando il percorso del file di configurazione per eseguirlo manualmente.
amit_saxena,

31

Per Rails 5, questo è ciò che dovevo fare per limitare le dimensioni del registro e non modificare l'output del server nella console:

Secondo la documentazione , se si desidera limitare le dimensioni della cartella di registro, inserirla nel proprio file di ambiente ('development.rb' / 'production.rb').

config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)

Con questo, i tuoi file di registro non cresceranno mai più di 50 Mb. È possibile modificare le dimensioni in base alle proprie preferenze. "1" nel secondo parametro indica che verrà conservato 1 file di registro storico, quindi avrai fino a 100 Mb di registri: il registro corrente e il blocco precedente di 50 Mb.

Fonte di questa soluzione .


2
Il primo argomento è il nome del file, semplicemente parlando, cioè "log / development.log". Quindi preferirei un modo più lungo, ma trasparente. Invece di config.paths['log'].firstmettereiRails.root.join('log', "#{Rails.env}.log")
Mikhail Chuprynski,

1
@ZiaUlRehmanMughal Sì, funziona con Rails 4. Sto usando Rails 4.2.3, con una configurazione come questa: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS,

1
Per semplificare la lettura, vale la pena ricordare che è possibile fare affidamento sulle estensioni di byte ActiveSupport: 50.megabytesè la stessa di 50 * 1024 * 1024, ma molto più facile da capire. Vedi le estensioni core di ActiveSupport per maggiori dettagli.
Pierre-Adrien Buisson,

1
Sono tornato qui dopo aver cercato su Google (vita del programmatore: D). Mi chiedevo se possiamo configurare questa linea per ruotare tutti i file di registro nella cartella dei registri? Apparentemente questa riga ruoterà solo la prima riga.
Zia Ul Rehman Mughal,

Nota che questo ruoterà solo il tuo file log / production.log come Rails.application.config.paths['log'].firstrestituirà esattamente questo file
valachi

5

Per Rails 5 , se si desidera la rotazione giornaliera del registro, è necessario solo questo:

  config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')

Secondo la documentazione , è possibile utilizzare daily, weeklyo monthly.


2

Per ogni registro: registro Rails, registro Rpush, ... È possibile utilizzare in questo modo nel file di configurazione del servizio:

 config.log_file = 'log/rpush.log'
 config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)

Significa: salva solo 1 file di registro precedente dopo la divisione. La dimensione del registro principale non supera mai i 20 MB.


-9

Abilita l'invio dei log al log usando rails logglier come segue nel mio file environment / production.rb. la versione delle rotaie è la 4.1.0

RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end

Per favore, suggeriscimi qualcosa che
devo

La versione di Rails è la 4.1.0 e la versione di Ruby è la 2.1.1
riya khana,
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.