Estou realmente lutando para entender como logrotate
funciona ao executar um comando dentro de um arquivo shell próprio e como isso não acontece.
O comando em questão é:
rclone -L -vv --log-file "/home/mike/tmp/qqq.log" sync "/media/mike/W10 D drive/My Documents/" remote:MyDocuments_M17A_from_Linux
O que eu gostaria:
Eu gostaria que este arquivo qqq.log fosse verificado com bastante frequência, digamos a cada 10 min., para ver se ele excedeu um determinado tamanho, digamos 1 MB. E se tiver, para girar o arquivo. rclone
com a -vv
opção produz uma saída copiosa, deliberadamente (ou seja, tentar entender para obter logrotate funcionando para este caso de uso).
Há um tutorial moderadamente útil aqui , mas ainda me deixa no escuro:
Como você pretende configurar a rotação de logs de seus próprios processos que não são do sistema? Você pretende colar linhas na parte inferior de
/etc/logrotate.conf
? Isto é o que eu fiz (em "# logs específicos do sistema podem ser configurados aqui"):/home/mike/tmp/qqq.log { notifempty size 1M daily create 0664 root root rotate 3 }
mais tarde: agora percebo que você também pode colocar arquivos individuais
/etc/logrotate.d
- sem grande complexidade lá.Será que por padrão
logrotate
só roda uma vez por dia, em virtude do arquivo/etc/cron.daily/logrotate
?Isso significa que, se eu quiser uma verificação muito mais frequente, talvez deva configurar um
cron
trabalho para fazer isso, executando (neste exemplo) a cada 10 minutos?Você está destinado a executar
logrotate <config file>
como root? Faço esta pergunta porque tentei tanto como root quanto como usuário. O usuário não parecia funcionar.
Um link para um guia para iniciantes para esse tipo de configuração, que não pode ser tão incomum, seria útil. Eu pesquisei, mas a maior parte do que encontrei não fornece um guia passo a passo.
logrotate
pode ser executado como um usuário comum, sem privilégios administrativos, para alternar os logs desse usuário.Eu removi seu
daily
critério porque você queria apenas uma verificação baseada em tamanho, e isso limitaria qualquer ação possível a apenas uma vez por dia (a primeira vez a cada dia quelogrotate
é executada, conforme acontece). Substituícreate
pormissingok
para que seja seurclone
trabalho real criar o arquivo de saída em vez delogrotate
.Em seguida, coloque o
logrotate
comando nocrontab
arquivo do seu usuário:Usando este exemplo, a saída do comando será gravada em
.crontab.log
, e você provavelmente desejará que umalogrotate
entrada seja alternada ou redefinida mensalmente.Como você está produzindo seus próprios arquivos de log e requer um corte de tamanho mais em tempo real, você deve dar uma olhada no utilitário Rotalogs do Apache aqui .
Ele funciona lendo stdin e corta o arquivo de log com base nos argumentos da linha de comando.
por exemplo.
O logrotate , por outro lado, verifica os arquivos de log quando é executado, e geralmente os sistemas são configurados para executar o logrotate (via cron) uma vez por dia. A configuração dos subsistemas geralmente é feita soltando o arquivo de configuração
/etc/logrotate.d
e sim, geralmente é executado como root.Edit: @mike roedor
logrotate
é executado (pelo cron ou manualmente) e, em seguida, verifica as estatísticas do arquivo de log como visto no sistema de arquivos, então aciona uma rotação dependendo de sua configuração.rotatelogs
lê sua entrada padrão continuamente anexando a um arquivo de log, então, quando o tempo ou o tamanho do arquivo de log atinge um ponto de disparo, ele fecha o arquivo de log atual, cria um novo arquivo de log (com o nome apropriado) e continua a anexar ao novo arquivo de log.Isso tem uma influência sobre como você inicia o programa que gera a saída, ele precisa gravar na saída padrão e, em seguida, você canaliza isso em rotalogs.
por exemplo
Irá dar-lhe uma rotação circular através de 10 limas, cortadas a cada 60 segundos
Usando
rclone
, eu esperaria--log-file "/dev/stdout"
que ele gravasse na saída padrão.[editar 2] @mike roedor
Eu não estou familiarizado com o rclone, se ele grava em stdout ou stderr e se alguma coisa ele grava, mas existem maneiras de contornar isso, mesmo
--log-file=/dev/stdout
que não funcione.Este StackOverflow Q/Answer , entre outros, explica o redirecionamento e a tubulação. Mas, para resumir, é possível redirecionar apenas stderr ou mesclado com stdout em um pipe.
Exemplo de bash:
Mesclar stderr com stdout no pipe
Apenas stderr em pipe, stdout em otherfile (que pode ser /dev/null ou até mesmo um hífen
-
que fecha stdout).Esses exemplos usam a sintaxe bash mais antiga, o bash v4 tem uma variante moderna menos detalhada.