将打印重定向到日志文件

时间:2010-03-25 06:25:21

标签: python logging printing

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

print "running command",cmd
os.system(cmd)

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

9 个答案:

答案 0 :(得分:43)

你应该看看python logging module


编辑:示例代码:

import logging

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

生成名为“logfile”的文件,内容为:

2012-10-18 06:40:03,582 INFO     hello

答案 1 :(得分:41)

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()

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:2)

您可以将sys.stdout替换为与sys.stdout具有相同接口的任何对象,在该对象的写入中您也可以打印到终端和文件。例如看到这个食谱http://code.activestate.com/recipes/119404-print-hook/

答案 4 :(得分:2)

使用日志记录模块重定向stdout和stderr的简单方法是: How do I duplicate sys.stdout to a log file in python?

答案 5 :(得分:2)

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

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

然后用write_log()

替换你的print()函数名

答案 6 :(得分:1)

将您自己的文件放在sys.stdout中,可以通过print捕获文本输出。

答案 7 :(得分:0)

只是关于添加与写入模式的注释。如果要替换日志文件,请将文件模式更改为“ w”。我还不得不注释掉流。然后使用logging.info()输出到指定的文件。

if __name__ == '__main__':
    LOG_FORMAT = '%(asctime)s:%(levelname)s ==> %(message)s'
    logging.basicConfig(
        level=logging.INFO,
        filename="logfile",
        filemode="w",
        format=LOG_FORMAT
        #stream=sys.stdout
    )

答案 8 :(得分:0)

有很多方法可以将输出写入'.log'文件

日志记录是一种跟踪文件运行时发生的事件的方法。也表示发生了某些事件。

import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This is debug message')
logging.info('This is information message')
logging.warning('This is warning message')
logging.error('This is warning message')

用于减少所有事情的另一种方法,使您打印到控制台的所有内容都将保存到“日志”文件中

python abc.py > abc.log

通过使用这种方法,您可以将所有内容写入日志文件