我有一个网络服务器,其中包含一个包含网站的 git 存储库。我使用 PHP 制作了一个 CMS,其中 PHP 在文件更改时自动提交到 git。我想git log --name-status
使用 Logwatch 跟踪这些提交(最好以接近显示添加/删除文件的形式)。我读过有关创建自定义 Logwatch 服务的内容,但 Logwatch 对我来说真的很新鲜,这并没有真正让我有任何进展。
答案1
笔记:如果您想跟踪所有 git 提交(而不仅仅是使用 PHP 提交的提交),而不是下面的 PHP 代码,应该可以设置具有类似输出的提交后挂钩。
写完问题后我发现这个非常简单的指南。基于此,这就是我所做的:
创建日志目录并设置权限
我没有在没有设置权限的情况下对此进行测试,但我认为这是需要的。
sudo mkdir /var/log/gitweb
sudo chown: www-data /var/log/gitweb
PHP git 日志功能
git commit
每当我在 php 代码中运行时,就会运行这行代码。换行符被替换为自定义字符串,以便每次提交都在自己的行上(据我所知,Logwatch 只能逐行操作)。当使用 Logwatch 解析时,这将被替换为换行符。
shell_exec('(git log -1 --date=iso --name-status | awk 1 ORS="[NEWLINE_HERE]" ; echo) >> /var/log/gitweb/gitweb.log');
Logwatch日志文件组
# /etc/logwatch/conf/logfiles/gitweb.conf
LogFile = gitweb/*.log
Archive = gitweb/*.gz
*ExpandRepeats
不太确定 *ExpandRepeats 的作用,但它在我链接的指南中。
测井服务
# /etc/logwatch/conf/services/gitweb.conf
Title = "Git commits"
LogFile = gitweb
日志观察解析器
这有两件事:
- 时间过滤(它只打印具有正确日期的行/提交)
- 将自定义字符串转换回换行符(请参阅上面的 PHP 代码)
我对 perl 的了解绝对为零(我查看了其他 Logwatch 脚本以寻求帮助),所以如果这是对 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);
设置日志轮换
# /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
}