Como o copytruncate realmente funciona? [fechadas]

2

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 o logrotate trunca o arquivo, quando o syslog-NG já abriu o arquivo para o registro? Não é a contenção de recursos? O syslog-NG fecha o arquivo imediatamente, quando não tem nada para registrar?

    
por overexchange 15.10.2018 / 09:49

1 resposta

1

Truncar um arquivo de log realmente funciona porque os escritores abrem os arquivos para gravação usando O_APPEND.

Na página de manual aberta (2) :

O_APPEND: The file is opened in append mode. Before each write(2), the file offset is positioned at the end of the file, as if with lseek(2). The modification of the file offset and the write operation are performed as a single atomic step.

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 àquela salva antes da conclusão da operação de gravação anterior. / p>

Isso faz um acréscimo funcionar após uma operação de truncamento, gravando a próxima linha de log no início do arquivo novamente, sem a necessidade de reabrir o arquivo.

(O mesmo recurso do O_APPEND também possibilita ter vários escritores anexando ao mesmo arquivo, sem prejudicar as atualizações uns dos outros).

Os registradores também escrevem uma linha de log usando uma única operação write (2), para impedir que uma linha de log seja quebrada em dois durante uma operação de gravação truncada ou concorrente.

Observe que loggers como syslog, syslog-ng ou rsyslog normalmente não precisam usar copytruncate , pois eles têm suporte para reabrir os arquivos de log, geralmente enviando-lhes um SIGHUP. O suporte do logrotate para copytruncate existe para atender a outros registradores que normalmente são anexados a arquivos de log, mas que não necessariamente têm uma boa maneira de reabrir o arquivo de log (portanto, a rotação por renomeação não funciona nesses casos.)

Por favor, note também que copyrotate tem uma condição de corrida inerente, na medida em que é possível que o gravador acrescente uma linha ao arquivo de log logo após o logrotate terminar a cópia e antes de ter emitido a operação de truncamento. Essa condição de corrida faria com que perdesse as linhas de log para sempre. É por isso que os registros em rotação usando copytruncate geralmente não são recomendados, a menos que seja a única maneira possível de fazê-lo.

    
por 15.10.2018 / 18:51