與外部團隊合作 Python 專案。無法開放直接遠端連線到該台伺服器,但是開發團隊需要可以看到 Python SimpleHTTPServer 網站伺服器的 log,方便開發與除錯。以下是解決方式之一:
Python 網站伺服器指令跑在 Windows 命令列執行工具軟體 ConEmu 。因為 ConEmu 會將網站伺服器的 log 即時儲存到檔案。再透過 PHP 等程式讀取 log 檔可以對外顯示。
[警告] Python 文件提到 SimpleHTTPServer 因為只有做基本的資安檢查,不適合放到正式產品環境。
1. Windows 作業系統命令列執行工具軟體 ConEmu ,每開一個標籤 (tab) 視窗,會自動建立一個 log 檔案,儲存該標籤視窗下的指令與輸出訊息。路徑在 ConEmu 所在目錄下的 Logs 子目錄內 (%ConEmuDir%\Logs\) 可以到 Settings -> Features 修改路徑。(我修改成 C:\ConEmu_Logs\ )
2. 新開一個標籤視窗,輸入啟動 Python SimpleHTTPServer 的指令
3. 利用 PHP 程式讀取 log 檔,顯示在網頁上。參考 How to Tail a File with PHP | DevDungeon 網頁,利用 tail 指令顯示檔案結尾 (加上 -f 選項代表當 log 檔案有新資料進來時,也會輸出)、以及使用 PHP fgets 函數讀檔不會 lock 檔案的特性顯示 log 檔案內容。
原本 PHP 程式碼
(1) 原本文章限定使用 Linux 系統,因為 Windows 沒有 tail 指令,所以需要事先安裝 Cygwin 才能有 Windows 版本的 tail 指令。 (2) tail 指令預設只顯示檔案最後的 10 行,透過 --lines=50 改成顯示檔案最後的 50 行,可以自行替換數字。
PHP 程式碼改成
(1) 先開一個空白的標籤視窗
(2) 再開新的標籤視窗輸入啟動 Python SimpleHTTPServer 的指令,最後開的標籤視窗可以確保 ConEmu log 檔案日期是最新的。
tail -n 1 顯示上列指令結果的最後一行
雖然都是手動輸入指令,但是可以少幾個步驟。
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 顯示上列指令結果的最後一行
雖然都是手動輸入指令,但是可以少幾個步驟。
相關資料
- python - Save logs - SimpleHTTPServer - Stack Overflow 其他解法沒試過 供參考
- 20.19. SimpleHTTPServer — Simple HTTP request handler — Python 2.7.15 documentation
- [分享] Cygwin 入門 - BASH on Windows [論壇 - Ubuntu 程式設計] | Ubuntu 正體中文站
- ls command in Linux/Unix | list files/directories
留言
張貼留言