unix logrotate especifica o tamanho do bloco

2

Como posso especificar o tamanho do arquivo de saída desejado após a rotação? Por exemplo, vamos dizer que eu quero executar o logrotate quando o arquivo de log atingir 10MB e eu quero dividir este log em pedaços que são 1MB no máximo. Eu encontrei opções "tamanho", mas isso define o limite acima do qual o logrotate é executado e não o tamanho do pedaço desejado. Obrigado

    
por Wakan Tanka 06.06.2013 / 16:37

1 resposta

5

logrotate por si só não suporta a divisão do log / s rotacionado, somente a compressão.

Você pode conseguir o comportamento desejado escrevendo um script próprio que lide com a divisão, e chame isso como um script postrotate na sua configuração de logrotate para aquele arquivo / s específico.

update : baseado no seu comentário ("já é muito tarde para dividir arquivos, porque eles serão divididos pelo logrotate"), parece que você ainda tem a ideia de que o logrotate está fazendo a divisão de arquivos . Isso não está correto, o que realmente acontece é que o logrotate renomeia o arquivo existente e cria um novo arquivo vazio com o nome original.

Um exemplo:

/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                reload rsyslog >/dev/null 2>&1 || true
        endscript
}

Quando o logrotate é executado:

  • renomeia / var / log / syslog para /var/log/syslog.1
  • cria um novo arquivo vazio / var / log / syslog.
  • renomear um arquivo não tem efeito em nenhum processo que tenha um identificador de arquivo aberto; portanto, depois de fazer isso, o processo rsyslog ainda está gravando no arquivo antigo, syslog.0. Normalmente, a maneira de contornar isso é recarregar os processos que gravam no arquivo, que é o que acontece no script postrotate. O rsyslog é instruído a recarregar, fecha seu identificador de arquivo existente em /var/log/syslog.0 e abre um novo identificador de arquivo usando o nome do arquivo / var / log / syslog, o novo arquivo vazio criado pelo logrotate.

Espero que você tenha uma melhor compreensão do que o logrotate está fazendo agora.

update 2 : abordarei seus comentários aqui, pois as opções de formatação na seção de comentários são limitadas.

So when I understand right in the post processing part it is necessary to reload rsyslog to enshure that old file descriptor (before rotation) will be closed and new file descriptor (after rotation) will be opened (because of: mv syslog syslog.1)?

100% correto. Depois que o logrotate move o arquivo, o rsyslog ainda está escrevendo para o descritor de arquivo antigo. Um processo executa E / S no descritor de arquivo, o nome só é interessante quando se executa a abertura inicial no arquivo.

I thought that logrotate has some mechanism to achieve this automatically.

Não, daí a necessidade de fazê-lo em um script pós-roteiro. Lembre-se de que nem todo log é necessariamente feito por um processo que mantém um descritor de arquivo aberto. Se você tem um processo que abre um arquivo, grava nele e depois fecha (o descritor de arquivo) repetidamente, então você não precisa mexer com nada no postrotate.

PS: Did you mean "syslog.0" not "syslog" in the following senetence: "the rsyslog process is still writing to the old file, syslog.0."? Becuse "old" log is /var/log/syslog not /var/log/syslog.0. Thank you

Não. Quero dizer que ainda está escrevendo para o descritor de arquivo existente, cujo logrotate foi renomeado para syslog.0. Ao lidar com processos como o rsyslog, lembre-se sempre de que o nome do arquivo só é relevante no ponto em que o rsyslog o abre, ou seja, quando cria o descritor de arquivo. Depois disso, você pode renomear, mover e até mesmo excluir o arquivo, e o processo continua executando E / S no descritor de arquivos sem impedimentos.

    
por 06.06.2013 / 16:45