之前运行程序用print在控制台输出信息,关闭程序后这些信息就丢失了。当我想比较两种参数设置下的程序性能时,就非常不方便。使用logging模块的一大好处是可以便捷地将这些信息记录到本地文件(同时输出到控制台也是可以的),以便后续处理。
这里贴上我自己测试用的代码,具体细节可以参考http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html
将信息记录到本地文件
#test_logging.py
import logging
if __name__ == "__main__":
logging.basicConfig(filename="test.log",filemode="w",level=logging.DEBUG,
format="%(filename)s [line:%(lineno)d] %(message)s")
name = "mengmengz07"
s = "good morning~ :{}".format(name)
logging.info(s)
logging.debug(s)
test.log中的结果
test_logging.py [line:13] good morning~:mengmengz07
将信息输出到控制台
在logging.basicConfig中不声明filename,filemode即可
#test_logging.py
import logging
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG,
format="%(filename)s [line:%(lineno)d] %(message)s")
name = "mengmengz07"
s = "good morning~:{}".format(name)
logging.info(s)
控制台输出:
test_logging.py [line:13] good morning~:mengmengz07
将信息记录在本地文件,并输出到控制台
#test_logging.py
import logging
if __name__ == "__main__":
logging.basicConfig(filename="test.log",filemode="w",level=logging.DEBUG,
format="%(filename)s [line:%(lineno)d] %(message)s")
console =logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter("[%(levelname)s]line:%(lineno)d %(message)s")
console.setFormatter(formatter)
logging.getLogger().addHandler(console)
name = "mengmengz07"
s = "good morning~:{}".format(name)
logging.info(s)
logging.debug(s)
test.log中的结果
test_logging.py [line:13] good morning~:mengmengz07
test_logging.py [line:14] good morning~:mengmengz07
控制台输出:
[INFO]line:13 good morning~:mengmengz07
2022年更新:
logging模块的好处还在于不用删除调试代码!
import logging
logging.basicConfig(level=logging.INFO, format="[%(filename)s, line %(lineno)d] %(message)s")
省略若干代码
logging.info("你想要输出的info,和print的格式一样")
logging.debug("你想要输出的debug,和print的格式一样")
通过修改logging.basicConfig里的level,就可以控制哪些级别以上的信息会被输出。级别排序是critical > error > warning > info > debug。如果level=logging.INFO,那么logging.debug对应的信息都不会被打印出来。只会打印出logging.info对应的信息。
这样就非常方便了,当我们发布程序的时候,不需要手动删掉那些调试代码,只需要把longging.basicConfig里的level设高。调试的时候,把logging.basicConfig里的level设低。