gostaríamos de entender copytruncate
antes de girar o arquivo usando logrotate
com a configuração abaixo:
/app/syslog-ng/custom/output/all_devices.log {
size 200M
copytruncate
dateext
dateformat -%Y%m%d-%s
rotate 365
sharedscripts
compress
postrotate
/app/syslog-ng/sbin/syslog-ng-ctl reload
endscript
}
RHEL 7.x, 8 GB de RAM, 4 VCpu
Pergunta:
Como logrotate
truncar o arquivo, quando o syslog-NG já abriu o arquivo para log? Não é a contenção de recursos? O syslog-NG fecha o arquivo imediatamente, quando não tem nada para registrar?
Truncando um arquivo de log realmente funciona porque os escritores abrem os arquivos para escrita usando O_APPEND.
Na página de manual open(2) :
Como mencionado, a operação é atômica, portanto, sempre que uma gravação for emitida, ela será anexada ao deslocamento atual correspondente ao final do arquivo, não ao salvo antes da conclusão da operação de gravação anterior.
Isso faz com que um acréscimo funcione após uma operação de truncar, gravando a próxima linha de log no início do arquivo novamente, sem a necessidade de reabrir o arquivo.
(O mesmo recurso de O_APPEND também possibilita que vários gravadores sejam anexados ao mesmo arquivo, sem atrapalhar as atualizações uns dos outros.)
Os loggers também gravam uma linha de log usando uma única operação write(2), para evitar que uma linha de log seja dividida em duas durante uma operação de gravação truncada ou simultânea.
Observe que loggers como syslog, syslog-ng ou rsyslog normalmente não precisam ser usados
copytruncate
, pois têm suporte para reabrir os arquivos de log, geralmente enviando um SIGHUP. O suporte do logrotate paracopytruncate
existe para atender a outros loggers que normalmente anexam aos arquivos de log, mas que não necessariamente têm uma boa maneira de reabrir o arquivo de log (portanto, a rotação renomeando não funciona nesses casos).Observe também que
copyrotate
tem uma condição de corrida inerente, pois é possível que o gravador acrescente uma linha ao arquivo de log logo após logrotate terminar a cópia e antes de emitir a operação de truncar. Essa condição de corrida faria com que perdesse essas linhas de log para sempre. É por isso que a rotação de logscopytruncate
geralmente não é recomendada, a menos que seja a única maneira possível de fazê-lo.