Como Gerenciar Arquivos de Log com o Logrotate no Ubuntu 22.04

Introdução

O Logrotate é uma utilidade do sistema que gerencia a rotação automática e a compressão de arquivos de log. Se os arquivos de log não forem rotacionados, comprimidos e periodicamente podados, eles eventualmente poderiam consumir todo o espaço em disco disponível em um sistema.

O Logrotate é instalado por padrão no Ubuntu 22.04 e está configurado para lidar com as necessidades de rotação de log de todos os pacotes instalados, incluindo o rsyslog, o processador de log do sistema padrão.

Neste artigo, vamos explorar a configuração padrão do Logrotate e, em seguida, configurar a rotação de log para uma aplicação personalizada fictícia.

Pré-requisitos

Este tutorial pressupõe que você tenha um servidor Ubuntu 22.04, com um usuário sudo habilitado, conforme descrito em Configuração Inicial do Servidor com Ubuntu 22.04.

O Logrotate está disponível em muitas outras distribuições Linux também, mas a configuração padrão pode ser bastante diferente. Outras seções deste tutorial ainda serão aplicáveis, desde que sua versão do Logrotate seja semelhante à do Ubuntu 22.04. Siga o Passo 1 para determinar a versão do seu Logrotate.

Faça login no seu servidor como seu usuário sudo para começar.

Passo 1 — Confirmando a Versão do Logrotate

O Logrotate é instalado por padrão no Ubuntu. No entanto, se você precisar instalá-lo, execute os seguintes comandos para atualizar sua lista de pacotes e obter o pacote:

  1. sudo apt update
  2. sudo apt install logrotate

Se estiver usando um servidor não Ubuntu, primeiro certifique-se de que o Logrotate esteja instalado solicitando informações de versão:

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

Se o Logrotate estiver instalado, mas o número da versão for significativamente diferente, você pode ter problemas com algumas das opções de configuração exploradas neste tutorial. Consulte a documentação para sua versão específica do Logrotate lendo sua página manual (man):

  1. man logrotate

Você também pode consultar a versão online da documentação do Logrotate. Em seguida, vamos examinar a estrutura de configuração padrão do Logrotate no Ubuntu.

Passo 2 — Explorando a Configuração do Logrotate

As informações de configuração do Logrotate geralmente podem ser encontradas em dois lugares no Ubuntu:

  • /etc/logrotate.conf: Este arquivo contém algumas configurações padrão e configura a rotação para alguns logs que não são de propriedade de nenhum pacote do sistema. Ele também usa uma instrução include para puxar configurações de qualquer arquivo no diretório /etc/logrotate.d.
  • /etc/logrotate.d/: Aqui é onde qualquer pacote que você instalar que precise de ajuda com rotação de logs colocará sua configuração do Logrotate. Em uma instalação padrão, você já deve ter arquivos aqui para ferramentas principais do sistema como apt, dpkg, rsyslog e assim por diante.

Por padrão, o logrotate.conf configurará rotações de log semanais, com arquivos de log de propriedade do usuário root e do grupo syslog, com quatro arquivos de log sendo retidos de cada vez (rotate 4), e novos arquivos de log vazios sendo criados após o atual ser rotacionado (create).

Vamos dar uma olhada no arquivo de configuração do Logrotate de um pacote em /etc/logrotate.d. cat o arquivo para a utilidade de pacote apt:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

Este arquivo contém blocos de configuração para dois arquivos de log diferentes no diretório /var/log/apt/: term.log e history.log. Ambos têm as mesmas opções. Qualquer opção não definida nesses blocos de configuração herdará os valores padrão ou aqueles definidos em /etc/logrotate.conf. Qualquer configuração em um arquivo do logrotate substituirá os valores padrão do logrotate, que são configurados em /etc/logrotate.conf. As opções definidas para os logs do apt são:

  • rotate 12: mantenha doze arquivos de log antigos. Isso substitui a configuração padrão de rotate 4.
  • monthly: faça a rotação uma vez por mês. Isso substitui a configuração padrão de weekly.
  • compress: comprima os arquivos rotacionados. Isso utiliza o gzip por padrão e resulta em arquivos com a extensão .gz. O comando de compressão pode ser alterado usando a opção compresscmd.
  • missingok: não exiba uma mensagem de erro se o arquivo de log estiver ausente.
  • notifempty: não faça a rotação do arquivo de log se ele estiver vazio.

Esses arquivos de configuração também herdam o comportamento padrão de create, que instrui o Logrotate a criar novos logs após a rotação. Isso poderia ser substituído com nocreate, embora isso efetivamente desabilitasse a maioria das outras funcionalidades.

Há muitas outras opções de configuração disponíveis. Você pode ler sobre todas elas digitando man logrotate na linha de comando para abrir a página de manual do Logrotate.

Em seguida, vamos configurar um arquivo de configuração para lidar com os logs de um serviço fictício chamado seu-aplicativo.

Passo 3 — Configurando um Exemplo de Configuração

Para gerenciar arquivos de log usando o logrotate para aplicativos fora dos serviços de sistema pré-empacotados e pré-configurados, temos duas opções:

  1. Crie um novo arquivo de configuração do Logrotate e coloque-o em /etc/logrotate.d/. Isso será executado diariamente como o usuário root juntamente com todos os outros trabalhos padrão do Logrotate.
  2. Crie um novo arquivo de configuração e execute-o fora da configuração padrão do Logrotate do Ubuntu. Isso só é realmente necessário se você precisar executar o Logrotate como um usuário não root, ou se quiser rotacionar logs com mais frequência do que diariamente (uma configuração hourly em /etc/logrotate.d/ seria ineficaz, porque a configuração do Logrotate do sistema só é executada uma vez por dia).

Vamos percorrer estas duas opções com alguns exemplos de configuração.

Adicionando Configuração ao /etc/logrotate.d/

Queremos configurar a rotação de logs para um servidor web fictício que coloca um access.log e error.log em /var/log/your-app/. Ele é executado como o usuário e grupo www-data.

Para adicionar uma configuração para os arquivos de log your-app em /etc/logrotate.d/, primeiro abra um novo arquivo no diretório /etc/logrotate.d usando o nano ou seu editor preferido:

  1. sudo nano /etc/logrotate.d/your-app

Adicione as seguintes linhas ao seu novo arquivo de configuração:

/etc/logrotate.d/your-app
/var/log/your-app/*.log {
	daily
	missingok
	rotate 14
	compress
	notifempty
	create 0640 www-data www-data
	sharedscripts
	postrotate
		systemctl reload your-app
	endscript
}

Algumas das novas diretivas de configuração neste arquivo são:

  • create 0640 www-data www-data: isso cria um novo arquivo de log vazio após a rotação, com as permissões especificadas (0640), proprietário (www-data), e grupo (também www-data).
  • sharedscripts: essa flag significa que qualquer script adicionado à configuração é executado apenas uma vez por execução, em vez de para cada arquivo rotacionado. Como o caminho /var/log/your-app/*.log inclui um curinga *, esta configuração corresponderia a qualquer número de arquivos de log no diretório your-app. Sem a opção sharedscripts, o script especificado em postrotate seria executado cada vez que o logrotate processa um arquivo de log sem esta opção.
  • postrotate para endscript: este bloco contém um script para ser executado após o arquivo de log ser rotacionado. Neste caso, estamos recarregando nosso exemplo de aplicativo. Isso às vezes é necessário para fazer com que sua aplicação mude para o novo arquivo de log recém-criado.
    Observe que postrotate é executado antes que os logs sejam comprimidos. A compressão pode levar muito tempo, e seu software deve mudar imediatamente para o novo arquivo de log. Para tarefas que precisam ser executadas após os logs serem comprimidos, use o bloco lastaction em vez disso.

Para salvar e sair do nano, pressione Ctrl+X, e quando solicitado, Y e então Enter. Você pode testar o arquivo de configuração fazendo uma execução simulada:

  1. sudo logrotate /etc/logrotate.conf --debug

Este comando chama o logrotate, aponta para o arquivo de configuração padrão e ativa o modo de depuração.

As informações serão impressas sobre quais arquivos de log o Logrotate está manipulando e o que faria com eles. Se tudo parecer bem, você terminou. O trabalho padrão do Logrotate será executado uma vez por dia e incluirá sua nova configuração.

Em seguida, tentaremos uma configuração que não use a configuração padrão do Ubuntu.

Passo 4 — Criando uma Configuração Independente do Logrotate

Neste exemplo, temos um aplicativo sendo executado como nosso usuário sammy, gerando logs que são armazenados em /home/sammy/logs/. Queremos rotacionar esses logs a cada hora, então precisamos configurar isso fora da estrutura /etc/logrotate.d fornecida pelo Ubuntu.

Primeiro, vamos criar um arquivo de configuração em nosso diretório doméstico. Abra-o em um editor de texto:

  1. nano /home/sammy/logrotate.conf

Em seguida, cole a seguinte configuração:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

Salve e feche o arquivo. Encontramos todas essas opções nos passos anteriores, mas vamos resumir: esta configuração irá rotacionar os arquivos a cada hora, comprimindo e mantendo vinte e quatro logs antigos e criando um novo arquivo de log para substituir o rotacionado.

Você precisará personalizar a configuração para atender à sua aplicação, mas este é um bom começo.

Para testar se a configuração está funcionando, vamos criar um arquivo de log. Primeiro, cd para o diretório pessoal do usuário usando o comando cd ~. Em seguida, crie um diretório para os logs usando o comando mkdir. Por fim, crie um arquivo vazio no diretório logs usando o comando touch. Execute os seguintes comandos na ordem para concluir essas etapas:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

Agora que temos um arquivo de log em branco no local certo, vamos executar o comando logrotate.

Como os logs são de propriedade do usuário sammy, não precisamos usar sudo. No entanto, precisamos especificar um arquivo de estado. Este arquivo registra o que o logrotate encontrou e quaisquer ações que ele executou da última vez que foi executado, para que saiba o que fazer na próxima vez. Esse rastreamento de estado é tratado para nós ao usar a configuração padrão do /etc/logrotate.conf. O arquivo de estado é armazenado em /var/lib/logrotate/status. Como não estamos usando a configuração padrão, precisaremos configurar manualmente o local do arquivo de estado.

Vamos fazer o Logrotate colocar o arquivo de estado diretamente em nosso diretório pessoal para este exemplo. Ele pode ser colocado em qualquer lugar acessível e conveniente. Execute o seguinte comando para usar o /home/sammy/logrotate.conf que você criou e para registrar o estado que o logrotate encontra:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating

A flag --verbose imprimirá informações detalhadas sobre o que o Logrotate está fazendo. Neste caso, não foi feita nenhuma rotação. Esta é a primeira vez que o Logrotate encontra este arquivo de log e ele tem zero horas de idade, então não deve ser rotacionado.

Se examinarmos o arquivo de estado usando o utilitário cat, notaremos que o Logrotate registrou algumas informações sobre a execução:

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

O Logrotate observou os logs que ele viu e quando os considerou pela última vez para rotação. Se executarmos o mesmo comando uma hora depois, o log será rotacionado conforme esperado.

Se você quiser forçar o Logrotate a rotacionar o arquivo de log quando ele não o faria normalmente, use a opção --force:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

Isso é útil ao testar postrotate e outros scripts.

Finalmente, precisamos configurar um trabalho cron para executar o Logrotate a cada hora. Abra o crontab do seu usuário:

  1. crontab -e

Isso abrirá um arquivo de texto. Se for a primeira vez que você usa o cron, poderá ser solicitado a escolher um editor de texto padrão. Se você não tiver uma preferência, recomendamos o nano para novos usuários. Pode haver alguns comentários já no arquivo que explicam a sintaxe do cron. Mova o cursor para baixo para uma nova linha em branco no final do arquivo e adicione o seguinte:

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

Esta tarefa será executada no 14º minuto de cada hora, todos os dias. Ela executa praticamente o mesmo comando logrotate que executamos anteriormente, embora tenhamos expandido logrotate para seu caminho completo de /usr/sbin/logrotate para garantir segurança. É uma boa prática usar caminhos completos ao escrever trabalhos cron. Para saber mais sobre o cron, você pode revisar nossos outros tutoriais.

Salve o arquivo e saia. Isso instalará o crontab e nossa tarefa será executada no horário especificado.

Se revisarmos nosso diretório de logs em cerca de uma hora, devemos encontrar o arquivo de log rotacionado e comprimido access.log.1.gz (ou .2.gz se você executou o Logrotate com a flag --force).

Conclusão

Neste tutorial, verificamos nossa versão do Logrotate, exploramos a configuração padrão do Logrotate no Ubuntu e configuramos dois tipos diferentes de configurações personalizadas. Para saber mais sobre as opções de linha de comando e configuração disponíveis para o Logrotate, você pode ler a página do manual executando man logrotate no seu terminal ou visitando a documentação online.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04