13.11 给简å�•è„šæœ¬å¢žåŠ æ—¥å¿—åŠŸèƒ½Â¶
问题¶
ä½ å¸Œæœ›åœ¨è„šæœ¬å’Œç¨‹åº�ä¸å°†è¯Šæ–ä¿¡æ�¯å†™å…¥æ—¥å¿—文件。
解决方案¶
打�日志最简�方�是使用 logging 模�。例如:
import logging
def main():
# Configure the logging system
logging.basicConfig(
filename='app.log',
level=logging.ERROR
)
# Variables (to make the calls that follow work)
hostname = 'www.python.org'
item = 'spam'
filename = 'data.csv'
mode = 'r'
# Example logging calls (insert into your program)
logging.critical('Host %s unknown', hostname)
logging.error("Couldn't find %r", item)
logging.warning('Feature is deprecated')
logging.info('Opening file %r, mode=%r', filename, mode)
logging.debug('Got here')
if __name__ == '__main__':
main()
上�五个日志调用(critical(), error(), warning(), info(), debug())以��方�表示��的严�级别。
basicConfig() 的 level �数是一个过滤器。
所有级别低于æ¤çº§åˆ«çš„æ—¥å¿—消æ�¯éƒ½ä¼šè¢«å¿½ç•¥æŽ‰ã€‚
æ¯�个loggingæ“�作的å�‚数是一个消æ�¯å—符串,å�Žé�¢å†�跟一个或多个å�‚数。
æž„é€ æœ€ç»ˆçš„æ—¥å¿—æ¶ˆæ�¯çš„æ—¶å€™æˆ‘们使用了%æ“�作符æ�¥æ ¼å¼�化消æ�¯å—符串。
è¿�行这个程åº�å�Žï¼Œåœ¨æ–‡ä»¶ app.log ä¸çš„内容应该是下é�¢è¿™æ ·ï¼š
CRITICAL:root:Host www.python.org unknown
ERROR:root:Could not find 'spam'
å¦‚æžœä½ æƒ³æ”¹å�˜è¾“出ç‰çº§ï¼Œä½ å�¯ä»¥ä¿®æ”¹ basicConfig() 调用ä¸çš„å�‚数。例如:
logging.basicConfig(
filename='app.log',
level=logging.WARNING,
format='%(levelname)s:%(asctime)s:%(message)s')
最�输出��如下:
CRITICAL:2012-11-20 12:27:13,595:Host www.python.org unknown
ERROR:2012-11-20 12:27:13,595:Could not find 'spam'
WARNING:2012-11-20 12:27:13,595:Feature is deprecated
上é�¢çš„æ—¥å¿—é…�置都是硬编ç �到程åº�ä¸çš„ã€‚å¦‚æžœä½ æƒ³ä½¿ç”¨é…�置文件,
å�¯ä»¥åƒ�下é�¢è¿™æ ·ä¿®æ”¹ basicConfig() 调用:
import logging
import logging.config
def main():
# Configure the logging system
logging.config.fileConfig('logconfig.ini')
...
创建一个下é�¢è¿™æ ·çš„æ–‡ä»¶ï¼Œå��å—å�« logconfig.ini :
[loggers]
keys=root
[handlers]
keys=defaultHandler
[formatters]
keys=defaultFormatter
[logger_root]
level=INFO
handlers=defaultHandler
qualname=root
[handler_defaultHandler]
class=FileHandler
formatter=defaultFormatter
args=('app.log', 'a')
[formatter_defaultFormatter]
format=%(levelname)s:%(name)s:%(message)s
å¦‚æžœä½ æƒ³ä¿®æ”¹é…�置,å�¯ä»¥ç›´æŽ¥ç¼–辑文件logconfig.iniå�³å�¯ã€‚
讨论¶
尽管对于 logging 模�而已有很多更高级的�置选项,
�过这里的方案对于简�的程�和脚本已�足够了。
å�ªæƒ³åœ¨è°ƒç”¨æ—¥å¿—æ“�作å‰�先执行下basicConfig()å‡½æ•°æ–¹æ³•ï¼Œä½ çš„ç¨‹åº�就能产生日志输出了。
å¦‚æžœä½ æƒ³è¦�ä½ çš„æ—¥å¿—æ¶ˆæ�¯å†™åˆ°æ ‡å‡†é”™è¯¯ä¸ï¼Œè€Œä¸�是日志文件ä¸ï¼Œè°ƒç”¨ basicConfig() æ—¶ä¸�ä¼ æ–‡ä»¶å��å�‚æ•°å�³å�¯ã€‚例如:
logging.basicConfig(level=logging.INFO)
basicConfig() 在程åº�ä¸å�ªèƒ½è¢«æ‰§è¡Œä¸€æ¬¡ã€‚å¦‚æžœä½ ç¨�å�Žæƒ³æ”¹å�˜æ—¥å¿—é…�置,
就需�先获� root logger ,然�直接修改它。例如:
logging.getLogger().level = logging.DEBUG
需�强调的是本节�是演示了 logging 模�的一些基本用法。
它�以�更多更高级的定制。
关于日志定制化一个很好的资�是 Logging Cookbook