import logging, logging.handlers
def main():
ntl = logging.handlers.NTEventLogHandler("Python Logging Test")
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
logger.addHandler(ntl)
logger.error("This is a '%s' message", "Error")
if __name__ == "__main__":
main()
上述Python(2.7.x)腳本在Windows事件查看器中寫入「這是錯誤」消息。當我將它作爲腳本運行時,我會得到預期的輸出結果。如果我通過PyInstaller將腳本轉換爲可執行文件,我會在事件日誌中獲得一個條目,但它說明了完全不同的內容。來自Python可執行文件的NTEventLogHandler
無法找到源(Python日誌記錄測試)中事件ID(1)的說明。本地計算機可能沒有必要的註冊表信息或消息DLL文件來顯示來自遠程計算機的消息。您可以使用/ AUXSOURCE =標誌來檢索此說明;詳細信息請參閱幫助和支持。以下信息是事件的一部分:這是'錯誤'消息。
這是我使用的腳本轉換成可執行的命令:pyinstaller.py --onefile --noconsole my_script.py
雖然命令行參數似乎沒有對這種行爲產生任何影響,這將足以只是調用pyinstaller.py my_script.py
。
我將不勝感激任何幫助瞭解正在發生的事情以及我如何解決這個問題。
最終解決
我不想下去資源黑客的路線,因爲這將是一個艱難的一步實現自動化。相反,我採用的方法是從c:\ Python27 \ Lib \ site-packages \ win32中抓取win32service.pyd
文件,並將其放在我的可執行文件旁邊。然後將腳本修改爲通過win32service.pyd
文件副本的完整路徑,並且這兩個腳本和exe文件都可以使用。最終的腳本包含如下:
import logging, logging.handlers
import os
import sys
def main():
base_dir = os.path.dirname(sys.argv[0])
dllname = os.path.join(base_dir, "win32service.pyd")
ntl = logging.handlers.NTEventLogHandler("Python Logging Test", dllname=dllname)
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
logger.addHandler(ntl)
logger.error("This is a '%s' message", "Error")
if __name__ == "__main__":
main()
這聽起來有點合理。我該如何解決這個問題?手動註冊win32service.pyd?我如何在我的可執行文件中嵌入消息ID?是否有任何文章/教程可以證明這一點,因爲大多數關於日誌的文章只是指向標準的Python類文檔,這沒什麼幫助。 – CadentOrange
看看我的編輯。 – leoluk
感謝您的回答。它指出我在正確的方向。 – CadentOrange