Mantieni le dimensioni del file di registro fisse senza logrotate


13

Esiste un modo per mantenere fisse le dimensioni del file di registro senza ruotarlo di un nuovo file vuoto ed eliminare (o archiviare) il vecchio file. Ad esempio, se imposto la dimensione massima del file di registro su 1 MB, dopo che la dimensione del file aumenta oltre tale limite verrà automaticamente bloccata, il testo viene aggiunto su "coda" e la parte più vecchia del testo viene espulsa per mantenere la dimensione del file 1 MB .


usa logrotate, quindirm -f *.tar.gz.*
Marco Ceppi,

1
C'è un motivo particolare per cui non si desidera ruotare il registro o utilizzare logrotate? Esattamente cosa vuoi che accada? Archiviare il vecchio registro su 1M e avviarne uno nuovo? L'inizio della tua domanda non è del tutto compatibile con la fine.
David Thornley,

cosa significa " pop-out" ?
Tshepang,

Risposte:


4

Potresti scrivere un piccolo script bash per farlo. Basta adattare il file a un determinato conteggio di byte usando tail -ce sovrascrivendo il file.

da man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

3
Sono relativamente sicuro che una volta "sovrascritto il file" la registrazione non riprenderà automaticamente sul nuovo file.
Stephen Jazdzewski,

0

La tua unica soluzione potrebbe essere quella di scrivere il tuo file system spazio utente o contribuire a uno esistente. Guarda l'elenco parziale di Filesystem in Userspace

Se non hai le competenze per contribuire, offri una pubblicità di progetto o $$$ o entrambi, per aggiungerla per te.

Vorrei avere il tempo di farlo, ho sempre desiderato qualcosa di esattamente così.


0

Puoi fare qualcosa di simile usando un FIFO, che è una specie di file di dimensioni pari a zero byte.

Tuttavia, si noti che se nulla è in LETTURA da questo file, il processo syslog potrebbe bloccarsi e smettere di scrivere su TUTTI i file di registro. Non sono sicuro che questo comportamento sia stato modificato con le versioni più recenti di Ubuntu / CentOS.

Un esempio qui

Per un altro esempio, prova qualcosa del genere.

Crea il tuo FIFO:

sudo mkfifo /var/log/everything.fifo

E aggiungi questo a (r) syslog.conf, quindi riavvia syslog:

*.*     |/var/log/everything.fifo

Quindi visualizzare FIFO da una finestra:

cat /var/log/everything.fifo

E in un'altra finestra, invia alcune cose a syslog:

logger Test1
logger Test2
logger Test3

Dovresti vedere le righe "Test *" nell'output di cui catsopra.

Questa funzionalità può essere ottima per il debug, soprattutto se non ti interessa conservare i dati più a lungo. Ad esempio, se vuoi vedere solo tutto tranne lo spam del firewall, puoi fare qualcosa del genere:

grep -vi "kernel: .* on wan" /var/log/everything.fifo

0

Ecco la mia seconda risposta. Questo è un bel trucco.

Utilizzare watch (1) per eseguire ripetutamente tail --bytes=1024(gli ultimi 1024 byte del file di registro, grazie a @jjclarkson per quella risposta).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

E quindi visualizzare il file con:

less --raw-control-chars /tmp/messages.watch

La differenza tra watche un ciclo while è che watchaggiornerà /tmp/messages.watch solo se ci fossero cambiamenti in / var / log / messaggi.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

E beh, immagino che potresti inserire un testciclo while in modo che tail venga eseguito solo se / var / log / message è stato aggiornato, ma non lo capirò ora.


0
 * prune: ritaglia la cima di un elenco di file descritto in
 * file / etc / default / prune. Progettato per essere eseguito periodicamente
 * da cron, l'idea è di abbreviare automaticamente il registro
 * file che crescono per sempre. Questo file contiene un elenco di
 * file (nome percorso completo) e il numero di blocchi che
 * dovrebbe essere mantenuto. Per conservare un po 'di sanità mentale, potare la volontà
 * ritaglia il file dopo la nuova riga successiva. Il file
 * / etc / default / prune dovrebbe essere simile a:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messaggi 200
 * / usr / adm / sup_log 5
 *
 * La voce crontab su infoswx per la prugna è simile a:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Compilare con: cc -O -o prune prune.c
 *
 * Le seguenti definizioni possono essere modificate secondo i propri gusti
 * e la dimensione del blocco di sistema.
 *
 * Ray Davis infoswx! Bees 25/09/85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=en&ie=UTF-8&q=prune+log+file&pli=1

Molti demoni (la maggior parte? Tutti?) Riapriranno i loro file di registro se viene inviato un segnale HUP (ad esempio dallo stesso cron job che esegue la prugna)


0

Sono sicuro che il poster originale ha trovato una soluzione dopo 8 anni. Eccone un altro per gli altri che potrebbero leggere questa discussione ...

curtail limita le dimensioni dell'output di un programma e conserva gli ultimi 200 MB di output con il seguente comando:

run_program | curtail -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

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.