Nota: Em vez do código PHP abaixo, se você quisesse rastrear todas as confirmações do git (e não apenas aquelas com o PHP), seria possível configurar um hook pós-commit com saída similar.
Depois de escrever a pergunta, deparei-me com este guia realmente simples . Com base nisso, eis o que fiz:
Crie um diretório de log e defina permissões
Eu não testei isso sem definir permissões, mas suponho que seja necessário.
sudo mkdir /var/log/gitweb
sudo chown: www-data /var/log/gitweb
Função de registro git do PHP
Esta linha de código é executada sempre que eu executo git commit
no código php. As novas linhas são substituídas por uma string personalizada, de modo que cada commit esteja em sua própria linha (até onde eu sei, o Logwatch só pode operar linha a linha). Isso será substituído novamente por novas linhas ao analisar com o Logwatch.
shell_exec('(git log -1 --date=iso --name-status | awk 1 ORS="[NEWLINE_HERE]" ; echo) >> /var/log/gitweb/gitweb.log');
Grupo de arquivos de log do Logwatch
# /etc/logwatch/conf/logfiles/gitweb.conf
LogFile = gitweb/*.log
Archive = gitweb/*.gz
*ExpandRepeats
Não tenho certeza do que * ExpandRepeats faz, mas estava no guia ao qual eu me vinculei.
Serviço de Logwatch
# /etc/logwatch/conf/services/gitweb.conf
Title = "Git commits"
LogFile = gitweb
Analisador de Logwatch
Isso faz duas coisas:
- Filtragem de tempo (apenas imprime linhas / confirmações com a data correta)
- Converte a string custrom de volta para novas linhas (veja o código PHP acima)
Eu sei absolutamente zero perl (eu olhei para outros scripts do Logwatch para ajuda), então eu peço desculpas se isso é um sacrilégio contra todas as coisas perl-y.
use Logwatch ':dates';
my $filter = TimeFilter('%Y-%m-%d %H:%M:%S');
while (defined(my $ThisLine = <STDIN>)) {
if ($ThisLine =~ /$filter/) {
$ThisLine =~ s/\[NEWLINE_HERE\]/\n/g;
print $ThisLine;
}
}
exit(0);
Configurar rotação de log
# /etc/logrotate.d/gitweb
/var/log/gitweb/*log {
daily
# keep 10 old logs
rotate 10
# don't do anything if the log is missing
missingok
# don't do anything if the log is empty
notifempty
# zip the archived logs
compress
}