def init_logger(): # 创建 scrapy 日志记录器 logger = logging.getLogger('scrapy') logger.setLevel(logging.INFO) # 设置日志的格式化对象 # 要求收集日志的时间、等级名称、发生所在的函数名及行号 fmt_str = '%(asctime)s %(levelname)s %(funcName)s %(lineno)s: %(message)s' formatter = Formatter(fmt=fmt_str, datefmt='%Y-%m-%d %H:%M:%S') handler1 = StreamHandler() handler1.setLevel(logging.INFO) handler1.setFormatter(formatter) handler2 = FileHandler('errors.log', encoding='utf-8') handler2.setLevel(logging.ERROR) handler2.setFormatter(formatter) handler3 = HTTPHandler(host='10.12.152.218:5000', url='/log/', method='POST') # handler3.setFormatter(formatter) handler3.setLevel(logging.ERROR) # 将处理器添加到日志记录器中 logger.addHandler(handler1) logger.addHandler(handler2) logger.addHandler(handler3)
def test4(self): # formatter、handler、logger 之间关系? # handler 对象可以添加formatter # logger 可以添加多个 handler, 如果没有handler,默认会添加 StreamHandler # 常用的Handler有哪些 # 1) StreamHandler -> 控制台打印输出的处理器 # 2) FileHandler -> 日志文件输出的处理器 # 3)HttpHandler -> 网络上传日志的处理器 logger = logging.getLogger('disen') # user_id 是自定义格式变量 log_format_str = '< %(user_id)s >[ %(asctime)s ]-%(levelname)s: %(message)s' log_format_date = '%Y-%m-%d %H:%M:%S' # 实例化handler - 标准输出的 handler1 = logging.StreamHandler() # 设置handler的日志等级、格式 handler1.setLevel(logging.INFO) handler1.setFormatter( logging.Formatter(fmt=log_format_str, datefmt=log_format_date)) logger.addHandler(handler1) handler2 = logging.FileHandler('handler.log') handler2.setFormatter( logging.Formatter(fmt=log_format_str, datefmt=log_format_date)) handler2.setLevel(logging.WARN) # 文件处理器只记录 警告信息 logger.addHandler(handler2) # 创建上传日志的处理器 # 上传日志信息中的所有信息 httpHandler = HTTPHandler(host='10.12.155.80:5000', url='/upload_log/', method='POST') httpHandler.setLevel(logging.ERROR) logger.addHandler(httpHandler) # 1. 检查每个消息的等级,再判断当前日志记录器是否处理 # 2. 在日志的记录器中 获取它的所有处理器handler # 3. 根据消息的等级,分别由不同的处理器处理消息。 extra_info = {'user_id': '1000001'} logger.info('hi, info', extra=extra_info) logger.warning('hi, warning', extra=extra_info) logger.error('hi, error', extra=extra_info) logger.critical('hi, critical', extra=extra_info)
def config_log(): fmt = Formatter(fmt='%(asctime)s %(name)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S') io_handler = StreamHandler() io_handler.setLevel(logging.DEBUG) io_handler.setFormatter(fmt) file_handler = FileHandler('edu_logs.log') file_handler.setLevel(logging.WARN) file_handler.setFormatter(fmt) http_handler = HTTPHandler(host='localhost:5000', url='/log', method='POST') http_handler.setLevel(logging.ERROR) http_handler.setFormatter(fmt) # 上传的数据不需要formatter logger.setLevel(logging.DEBUG) logger.addHandler(io_handler) logger.addHandler(file_handler) logger.addHandler(http_handler)
def test_log(self): logger = logging.getLogger() fileHandler = TimedRotatingFileHandler('logs/content.log') fileHandler.setLevel( logging.INFO ) # NOTSET -> DEBUG -> INFO -> WARNING -> ERROR -> FATAL formatter = Formatter('%(asctime)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S') fileHandler.setFormatter(formatter) iohandler = StreamHandler() iohandler.setLevel(logging.DEBUG) logger.addHandler(fileHandler) logger.addHandler(iohandler) # 将日志上传到日志服务器 # host 服务器的ip和port # url 请求路径,以 / 开始 # method 默认 为GET httpHandler = HTTPHandler(host='127.0.0.1:5000', url='/upload_log', method='POST') httpHandler.setFormatter(formatter) # 只有error 的信息才会上传到日志服务器 httpHandler.setLevel(logging.ERROR) logger.addHandler(httpHandler) logger.setLevel(logging.DEBUG) logger.info('this is a test log python file!') logger.error('this is error msg for python file!') logger.debug('this is dubug msg !') # this msg is hiddern!
# 1.1 设置记录器的日志等级(FATAL 50、ERROR 40、WARN 30, INFO 20, DEBUG 10, NOSET 0) # 注: 等级高的, 不会获取等级低的日志 logger.setLevel(logging.INFO) # 2. 设置日志的格式 fmt_str = '[ %(asctime)s %(levelname)s ] %(message)s' format = logging.Formatter(fmt=fmt_str, datefmt='%Y-%m-%d %H:%M:%S') # 3. 设置日志的处理器 Handler # - StreamHandler 控制台输出流 # - FileHandler 日志文件输出 # - HttpHandler 网络请求的日志上传处理器 handler = logging.StreamHandler() file_handler = TimedRotatingFileHandler('test.log') # 按时间分隔的日志文件 file_handler.setLevel(logging.WARN) # 设置处理的日志等级 http_handler = HTTPHandler(host='10.35.166.35:5000', url='/upload_log/', method='POST') http_handler.setLevel(logging.ERROR) logger.addHandler(handler) logger.addHandler(file_handler) logger.addHandler(http_handler) # 程序中发出不同等级的日志的消息 logger.info('第一个普通消息的测试') logger.debug('日志等级低的消息不会被处理') logger.warning('警告日志会被写入文件中,同时控制台显示 ') logger.critical('严重错误日志信息,被上传到日志服务器, 同时控制台显示')
def addHttpLog(url): http_handler = HTTPHandler(url, "/data/log", method='POST') http_handler.setLevel(logging.ERROR) logger.addHandler(http_handler)
fromaddr='*****@*****.**', toaddrs='*****@*****.**', subject='日志邮箱通知') # 配置邮件验证用户和口令(或授权码) handler3.username = '******' handler3.password = '******' # QQ邮箱发件时验证的“授权码” handler3.setLevel(logging.FATAL) # 创建上传日志请求的处理器HTTPHandler # 上传日志的接口: http://10.35.162.97:5000/log/ # 接口的方法: post # 响应的数据是json handler4 = HTTPHandler(host='10.35.162.97:5000', url='/log/', method='POST') handler4.setLevel(logging.INFO) # 创建格式化对象 , 并添加到处理器 formatter = logging.Formatter('[ <%(asctime)s> %(name)s %(levelname)s ] %(message)s') handler1.setFormatter(formatter) handler2.setFormatter(formatter) handler3.setFormatter(formatter) handler4.setFormatter(formatter) # 无效的,默认情况下将所有的日志信息上传到服务器 # 将处理器添加到日志记录器 logger.addHandler(handler1) logger.addHandler(handler2) # logger.addHandler(handler3) logger.addHandler(handler4)