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 将脚本转换为可执行文件,我会在事件日志中看到一个条目,但它显示的内容完全不同。
找不到 Source ( Python Logging Test ) 中事件 ID ( 1 ) 的描述。本地计算机可能没有必要的注册表信息或消息 DLL 文件来显示来自远程计算机的消息。您可以使用 /AUXSOURCE= 标志来检索此描述;有关详细信息,请参阅帮助和支持。以下信息是事件的一部分:这是一条“错误”消息。
这是我用来将脚本转换为可执行文件pyinstaller.py --onefile --noconsole my_script.py
的命令:尽管命令行参数似乎对此行为没有任何影响,只需调用pyinstaller.py my_script.py
.
在了解正在发生的事情以及如何解决此问题方面,我将不胜感激。
最终解决方案
我不想走资源黑客路线,因为这将是自动化的困难步骤。相反,我采用的方法是win32service.pyd
从 c:\Python27\Lib\site-packages\win32 获取文件并将其放在我的可执行文件旁边。然后修改脚本,将完整路径传递给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()