现在的位置: 主页 > 公司荣誉 > 文章列表

python logging 最佳实践

作者:程力专用汽车股份有限公司 来源:www.chLiw.com 发布时间:2017-09-13 13:10:06
python logging 最佳实践 起因

我经常跟同事开玩笑,我说在一家公司里面,能把日志这个功能搞清楚的都没有几个。所以写篇文章把我知道的部分知识分享一下。
在我目前看到的日志的文档中,Python的官方的文章是最清晰明了

这个流程图非常重要,希望朋友们能仔细看看。

1. 适用场景 1.1 一般场景

在一般情况下,我们最常用的的handler有两个:

RotatingFileHandler
按设定的文件大小切分日志 TimedRotatingFileHandler
按时间切分日志
以上2个handler都是线程安全的,可以用于多线程的场景,对于多进程则需要考虑其它方法 1.2 多进程

对于多进程的场景,python官方文档推荐我们使用

SocketHandler
使用TCP数据传输日志
可以参考我的文章 python 日志收集服务器 DatagramHandler
使用UDP数据传输日志

在单机上,即日志发送client 和 日志收集server 在同一台机器上,压测结果

type record/second

TCP 6000

TCP 9000

除此之外还可以考虑一下两种方法:
1. python-logstash
使用logstash,打开logstash的UDP或者TCP的服务端口直接接受数据,收到的数据可以入ElasticSearch 或者直接输出到文件中
2. 自定义新的handler 将日志记录存入redis 的某个队列中,站群,再额外启动一个进程,从redis中把数据读出入到文件中

2. 日志的级别

Level Numeric value

CRITICAL 50

ERROR 40

WARNING 30

INFO 20

DEBUG 10

NOTSET 0

一般情况下日志文件只需要分成两个即可
1. all.log
存储 >= INFO 级别的日志
测试环境可以开到DEBUG 级别
可以跟踪业务流程等等
2. error.log
存储 >= ERROR 级别的日志
便于快速排查故障

一个常见的日志初始化模块可以这样书写
logger_helper.py

import logging import sys import time from logging import Logger from logging.handlers import TimedRotatingFileHandler def init_logger(logger_name): if logger_name not in Logger.manager.loggerDict: logger = logging.getLogger(logger_name) logger.setLevel(logging.DEBUG) # handler all handler = TimedRotatingFileHandler('./all.log', when='midnight',backupCount=7) datefmt = %Y-%m-%d %H:%M:%S format_str = [%(asctime)s]: %(name)s %(levelname)s %(lineno)s %(message)s formatter = logging.Formatter(format_str, datefmt) handler.setFormatter(formatter) handler.setLevel(logging.INFO) logger.addHandler(handler) # handler error handler = TimedRotatingFileHandler('./error.log', when='midnight',backupCount=7) datefmt = %Y-%m-%d %H:%M:%S format_str = [%(asctime)s]: %(name)s %(levelname)s %(lineno)s %(message)s formatter = logging.Formatter(format_str, datefmt) handler.setFormatter(formatter) handler.setLevel(logging.ERROR) logger.addHandler(handler) logger = logging.getLogger(logger_name) return logger logger = init_logger(dataservice) if __name__ == '__main__': logger = init_logger('dataservice') logger.error(test-error) logger.info(test-info) logger.warn(test-warn)

只需要在其它模块中引入此模块的logger即可
model.py

from logger_helper import logger def business_code(): # ... ... logger.info(...) # call business code business_code()

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站设计公司 https://www.feimao666.com

上一篇:thinkphp5 数据库 链接 下一篇:最后一页

本周热门文章