Php

如何讓 Logwatch 跟踪 git 送出

  • January 7, 2015

我有一個帶有 git repo 的網路伺服器,其中包含一個網站。我使用 PHP 製作了一個 CMS,其中 PHP 在文件更改時自動送出到 git。我想git log --name-status使用 Logwatch 跟踪這些送出(最好以接近顯示添加/刪除文件的形式)。我已經閱讀了有關創建自定義 Logwatch 服務的資訊,但 Logwatch 對我來說真的很新,而且這並沒有真正讓我有任何收穫。

**注意:**如果您想跟踪所有 git 送出(而不僅僅是使用 PHP 送出的那些),而不是下面的 PHP 程式碼,應該可以設置一個具有類似輸出的 post-commit 掛鉤。


剛寫完這個問題,我就遇到了這個非常簡單的指南。基於此,這就是我所做的:

創建日誌目錄並設置權限

在沒有設置權限的情況下,我沒有對此進行測試,但我認為它是必需的。

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

日誌觀察解析器

這做了兩件事:

  • 時間過濾(它只列印具有正確日期的行/送出)
  • 將 cusstrom 字元串轉換回換行符(參見上面的 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
}

引用自:https://unix.stackexchange.com/questions/177611