如何让 Logwatch 跟踪 git 提交

如何让 Logwatch 跟踪 git 提交

我有一个网络服务器,其中包含一个包含网站的 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
}

相关内容