将打印重定向到日志文件

web*_*org 29 python printing logging

好的.我已经完成了我的第一个python程序.它有大约1000行代码.在开发期间,我print在运行命令之前放置了大量语句,os.system() 例如,

print "running command",cmd
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)

现在我已经完成了这个计划.我考虑过对它们进行评论,但重定向所有这些不必要的打印(我无法删除所有print语句 - 因为有些语句为用户提供有用的信息)到日志文件中会更有用吗?任何技巧或提示.

小智 49

你应该看看python日志记录模块


编辑:示例代码:

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG, filename="logfile", filemode="a+",
                        format="%(asctime)-15s %(levelname)-8s %(message)s")
    logging.info("hello")
Run Code Online (Sandbox Code Playgroud)

使用内容生成名为"logfile"的文件:

2012-10-18 06:40:03,582 INFO     hello
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案实际上根本不回答"如何重定向输出"的问题!转到该页面 - 搜索(徒劳)有关如何将日志记录重定向到文件的任何提示.实际的解决方案是在logging.config的页面上 - 但是我无法在那里找到它.http://onlamp.com/pub/a/python/2005/06/02/logging.html可能是一个更好的例子. (14认同)
  • 你是对的,它位于该页面的底部,但由于错误我改进了你的答案,所以它成功了! (5认同)
  • @TomSwirly位于页面底部:http://docs.python.org/library/logging.handlers.html#module-logging.handlers的链接为您提供了一个页面,其中解释了`FileHandler` (3认同)
  • @TomSwirly和该页面也解释了`basicConfig` (2认同)

Mic*_*ael 45

Python允许您捕获并分配sys.stdout - 如上所述 - 执行此操作:

import sys
old_stdout = sys.stdout

log_file = open("message.log","w")

sys.stdout = log_file

print "this will be written to message.log"

sys.stdout = old_stdout

log_file.close()
Run Code Online (Sandbox Code Playgroud)

  • 你也可以这样做 - sys.stdout = sys .__ stdout__ - 而不是使用old_stdout. (12认同)
  • @007brendan,假设 `sys.stdout` *开始*为 `sys.__stdout__`。这不是一个很好的假设,其他人可能会出于这样的目的或为了更理智的用途而重定向“sys.stdout”,例如*整个应用程序的* stdout 确实不应该是“sys.__stdout__”的系统。 (2认同)

Mik*_*ham 9

  • 下一次,如果不是使用print语句而是logging从头开始使用模块,那么你会更高兴.它提供了你想要的控件,你可以让它写入stdout,而它仍然在你想要的地方.

  • 这里有很多人建议重定向stdout.这是一个丑陋的解决方案.它改变了全局性 - 更糟糕的是 - 它为这个模块的使用而改变了它.我会更快地创建一个正则表达式,将所有内容更改print fooprint >>my_file, foo设置my_file为stdout或我选择的实际文件.

    • 如果你有任何其他部分的应用程序实际上依赖于写入stdout(或将来会发生但你还不知道),这会打破它们.即使你不这样做,它也会让你阅读你的模块看起来就像它做了一件事,如果你错过了一个小排列顶部它实际上做了另一件事.
    • 雪佛龙印刷品非常丑陋,但并不像暂时改变sys.stdout过程那样难看.
    • 从技术上讲,正则表达式替换不能正确执行此操作(例如,如果您在多行字符串文字内,它可能会产生误报).然而,它很容易工作,只要留意它.
  • os.system几乎总是不如使用该subprocess模块.后者不需要调用shell,不以通常不需要的方式传递信号,并且可以以非阻塞方式使用.


小智 5

您可以创建日志文件并准备写入。然后创建一个函数:

def write_log(*args):
    line = ' '.join([str(a) for a in args])
    log_file.write(line+'\n')
    print(line)
Run Code Online (Sandbox Code Playgroud)

然后用 write_log() 替换你的 print() 函数名