如何讓遠端可以查看 Python SimpleHTTPServer 的 log

與外部團隊合作 Python 專案。無法開放直接遠端連線到該台伺服器,但是開發團隊需要可以看到 Python SimpleHTTPServer 網站伺服器的 log,方便開發與除錯。以下是解決方式之一:

Python 網站伺服器指令跑在 Windows 命令列執行工具軟體 ConEmu 。因為 ConEmu 會將網站伺服器的 log 即時儲存到檔案。再透過 PHP 等程式讀取 log 檔可以對外顯示。

PHP icon by Icons8

[警告] Python 文件提到 SimpleHTTPServer 因為只有做基本的資安檢查,不適合放到正式產品環境。

解決步驟


1. Windows 作業系統命令列執行工具軟體 ConEmu ,每開一個標籤 (tab) 視窗,會自動建立一個 log 檔案,儲存該標籤視窗下的指令與輸出訊息。路徑在 ConEmu 所在目錄下的 Logs 子目錄內 (%ConEmuDir%\Logs\) 可以到 Settings -> Features 修改路徑。(我修改成 C:\ConEmu_Logs\ )

2. 新開一個標籤視窗,輸入啟動 Python SimpleHTTPServer 的指令

## 先切換到網站目錄
cd c:\home\project\htdocs
## 啟動網站伺服器,使用的 port 是 8080
c:\Python36\python.exe -m http.server 8080 --cgi

3. 利用 PHP 程式讀取 log 檔,顯示在網頁上。參考 How to Tail a File with PHP | DevDungeon 網頁,利用 tail 指令顯示檔案結尾 (加上 -f 選項代表當 log 檔案有新資料進來時,也會輸出)、以及使用 PHP fgets 函數讀檔不會 lock 檔案的特性顯示 log 檔案內容。

原本 PHP 程式碼
$handle = popen("tail -f /etc/httpd/logs/access.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer<br/>\n";
    ob_flush();
    flush();
}
pclose($handle);

(1) 原本文章限定使用 Linux 系統,因為 Windows 沒有 tail 指令,所以需要事先安裝 Cygwin 才能有 Windows 版本的 tail 指令。 (2) tail 指令預設只顯示檔案最後的 10 行,透過 --lines=50 改成顯示檔案最後的 50 行,可以自行替換數字。

PHP 程式碼改成

$handle = popen("C:/cygwin64/bin/tail.exe -f --lines=50 c:/ConEmu_Logs/ConEmu-2018-12-29-p8740.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer<br/>\n";
    ob_flush();
    flush();
}
pclose($handle);

4. 每當 SimpleHTTPServer 當掉 (經驗上每隔幾天會發生),需要將 ConEmu 標籤視窗整個關閉。但是開新的 ConEmu 標籤視窗,會衍生出新的問題,要去 PHP 手動修改新產生的 ConEmu log 檔案的路徑。想到的方式是

(1) 先開一個空白的標籤視窗

(2) 再開新的標籤視窗輸入啟動 Python SimpleHTTPServer 的指令,最後開的標籤視窗可以確保 ConEmu log 檔案日期是最新的。
## 先切換到網站目錄
cd c:\home\project\htdocs
## 啟動網站伺服器,使用的 port 是 8080
c:\Python36\python.exe -m http.server 8080 --cgi
(3) 回到第 (1) 步驟,在舊的標籤視窗輸入指令,將最新的 ConEmu log 檔名儲存到另一個檔案 ( C:\apache\htdocs\python_log_file_name.txt ),可以讓 PHP 程式讀取,就可以不用手動修改 log 檔案路徑。
c:\cygwin64\bin\mintty /bin/bash -lc "ls -Art /cygdrive/c/ConEmu_Logs/ | tail -n 1 > /cygdrive/c/apache/htdocs/python_log_file_name.txt"
ls -Art /cygdrive/c/ConEmu_Logs/ 代表依照檔案修改時間順序舊到新,顯示 C:\ConEmu_Logs\ 檔案清單

tail -n 1 顯示上列指令結果的最後一行

雖然都是手動輸入指令,但是可以少幾個步驟。

相關資料




留言