Eu tenho um comando de longa duração que gera muita saída no stdout. Eu gostaria de poder reter, por exemplo, apenas os últimos três dias ou o último gibibyte (evitando linhas de corte no meio) e, se possível, em blocos de arquivos não maiores que 20 MiB. Cada parte do arquivo está sendo nomeada com um sufixo numérico ou um carimbo de data / hora.
Algo como:
my-cmd | magic-command --output-file-template=my-cmd-%t \
--keep-bytes=1G \
--keep-time=3d \
--max-chunk-size=20M \
--compress=xz
Escreveria:
my-cmd-2014-09-05T10:04:23Z
Quando chega aos 20 milhões, o compacta e abre um novo, e assim por diante e depois de um tempo começa a excluir os arquivos mais antigos.
Existe um comando desse tipo?
Estou ciente logrotate
e de sua capacidade de gerenciar arquivos gravados por outros aplicativos, mas estou procurando algo mais simples que não envolva a necessidade de configurar um trabalho cron, especificar regras, suspender o processo etc.
fonte
Respostas:
Você pode obter o que deseja via pipelog , que "permite girar ou limpar o log de um processo em execução, canalizando-o através de um intermediário que responde a sinais externos", por exemplo:
Você pode obter o pid
/tmp/spewpipe.pid
e:Mas que você teria que configurar com cron ou algo assim. Há um problema nisso, no entanto. Observe I
gzip spew.log.1
- isso ocorre porque o-x
comando é executado após o log ser rotacionado. Portanto, você terá o problema adicional de sobrescrever aspew.log.1.gz
cada vez, a menos que escreva um script curto para executar o gzip e depois mova o arquivo, e use-o como-x
comando.Divulgação completa: eu escrevi isso, então é claro que funciona perfeitamente . ;) Manterei em mente uma opção de compactação, ou algo que a facilite melhor, para a versão 0.2 (o objetivo pretendido
-x
é um pouco diferente, mas funcionará como acima). A rolagem automatizada também é uma boa ideia ... a primeira versão é intencionalmente mínima, pois resisti à tentação de adicionar recursos que não eram necessários (afinal, não é tão difícil configurar um trabalho cron para isso).Observe que ele se destina à saída de texto ; se houver bytes nulos em potencial, você deve usar
-z
- o que substitui o zero por outra coisa. Essa foi uma troca para simplificar a implementação.fonte
pipelog-0.3
;-). Eu também me deparei com metacpan.org/release/File-Write-Rotate . Observe que os trabalhos cron não ajudarão muito na rotação com base no tamanho do arquivo.O multilog de Dan Bernstein pode aparentemente fazer isso - ou talvez a maioria, enquanto fornece uma saída via descritores de arquivo para o processador! Para compensar a diferença que você gosta - embora as especificações de tamanho 20M / 1G possam levar algum tempo, pois parece que 16M é o seu limite externo por log. O que se segue é, na maioria das vezes, uma seleção de copiar e colar no link acima, embora o link também detalhe outras opções, como registro de data e hora por linha, mantendo [outros] outros arquivos contendo apenas o padrão de correspondência de linhas mais recente e mais .
Interface
... script consiste em qualquer número de argumentos. Cada argumento especifica uma ação. As ações são executadas em ordem para cada linha de entrada.
Selecionando linhas
Cada linha é selecionada inicialmente. A acção...
... desmarca a linha se o padrão corresponder à linha. A acção...
seleciona a linha se o padrão corresponder à linha.
... padrão é uma cadeia de estrelas e não estrelas. Corresponde a qualquer concatenação de cadeias correspondidas por todas as estrelas e não estrelas na mesma ordem. Uma não estrela corresponde a si mesma. Uma estrela antes do final do padrão corresponde a qualquer sequência que não inclua o próximo caractere no padrão. Uma estrela no final do padrão corresponde a qualquer sequência.
Logs girados automaticamente
Se dir começa com um ponto ou barra, a ação ...
... anexa cada linha selecionada a um log chamado dir . Se dir não existir,
multilog
crie-o.O formato do log é o seguinte:
dir é um diretório que contém alguns arquivos de log antigos, um arquivo de log chamado current e outros arquivos para
multilog
acompanhar suas ações.Cada arquivo de log antigo tem um nome começando com @ , continuando com um carimbo de data / hora preciso, mostrando quando o arquivo foi concluído e terminando com um dos seguintes códigos:
A acção...
... define o tamanho máximo do arquivo para ações dir subsequentes .
multilog
decidirá que a corrente é grande o suficiente se a corrente tiver bytes de tamanho . (multilog
também decidirá que a corrente é grande o suficiente se vir uma nova linha dentro de 2000 bytes do tamanho máximo do arquivo; tenta finalizar os arquivos de log nos limites da linha.) O tamanho deve estar entre 4096 e 16777215. O tamanho máximo padrão do arquivo é 99999.Nas versões 0.75 e acima: Se
multilog
receber um sinal ALRM , ele imediatamente decide que a corrente é grande o suficiente, se a corrente não for vazia.(Nota: Eu suspeito que o
zsh
schedule
componente interno possa ser facilmente persuadido a enviar umALRM
em intervalos especificados, se necessário.)A acção...
... define o número de arquivos de log para ações de diretório subseqüentes . Depois de renomear atual , se
multilog
vê num ou arquivos de log mais velhos, ele remove o arquivo de log antigo com o menor timestamp. num deve ser pelo menos 2. O número padrão de arquivos de log é 10.A acção...
... define um processador para ações dir subsequentes .
multilog
alimentará a corrente através do processador e salvará a saída como um arquivo de log antigo em vez de atual .multilog
também salvará qualquer saída gravada pelo processador no descritor 5 e tornará essa saída legível no descritor 4 quando executar o processador no próximo arquivo de log. Para garantir a confiabilidade, o processador deve sair diferente de zero se houver algum problema ao criar sua saída;multilog
irá executá-lo novamente. Observe que o processador em execução pode bloquear qualquer entrada de alimentação do programamultilog
.fonte
O melhor que pude encontrar até agora como uma aproximação que não envolva escrever grandes partes de código é este
zsh
código:Aqui, divida e gire em no máximo 51 arquivos grandes de 20MiB.
fonte
btrfs
também pode ser montado comcompress-force=zlib
.Aqui está um script python hackeado para fazer algo como o que você está solicitando:
fonte
exec
é python como a primeira coisa em vez de usar o hashbangpython
ouenv python
?