Python logging自定义字段输出及打印颜色


Posted in Python onNovember 30, 2020

logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。

logging模块提供了两种记录日志的方式:

1)使用logging提供的模块级别的函数(logging.basicConfig,logging.debug,logging.info...)

2)使用logging模块的组件(loggers,handlers,filters,formatters)

简单示例

import json
import logging


class JsonFilter(logging.Filter):
  #此处定义字段的默认值,如果打印信息时不设置对应字段,则为默认值
  #服务服务名或者服务主机
  server = ""
  #访问ip
  ip = ""
  #访问资源路径
  sourceurl = ""
  #访问方式
  method = ""
  # 访问设备
  devices = ""
  # 访问协议
  Protocols = ""
  #访问结果的HTTP状态码
  result_Httpstatus = ""
  #访问结果的状态码
  result_status = ""
  #访问结果的msg信息
  result_msg = ""
  #访问结果的数据大小
  result_msgsize = ""
  def filter(self, record):
    record.server = self.server
    record.ip = self.ip
    record.sourceurl = self.sourceurl
    record.method = self.method
    record.devices = self.devices
    record.Protocols = self.Protocols
    record.result_Httpstatus = self.result_Httpstatus
    record.result_status = self.result_status
    record.result_msg = self.result_msg
    record.result_msgsize = self.result_msgsize
    return True



if __name__ == '__main__':

  formate = json.dumps({
  "time": "%(asctime)s",
  "levelname": "%(levelname)s",
  "server": "%(server)s",
  "ip": "%(ip)s",
  "sourceurl": "%(sourceurl)s",
  "method": "%(method)s",
  "devices": "%(devices)s",
  "Protocols": "%(Protocols)s",
  "result_Httpstatus": "%(result_Httpstatus)s",
  "result_status": "%(result_status)s",
  "result_msg": "%(result_msg)s",
  "result_msgsize": "%(result_msgsize)s",
  })
  logging.basicConfig(level=logging.DEBUG,format=formate)
  logger = logging.getLogger()
  filter_ = JsonFilter()
  logger.addFilter(filter_)

  filter_.server = '127.0.0.1:8100'
  filter_.ip = '127.0.0.1'
  filter_.sourceurl = 'http://127.0.0.1:8100/test'
  filter_.method = 'Get'
  filter_.devices = 'Chrome'
  filter_.Protocols = 'HTTP'
  filter_.result_Httpstatus = '200'
  filter_.result_status = '1001'
  filter_.result_msg = '增加成功'
  filter_.result_msgsize = '4296'
  logger.info("") #如果你需要在打印字段中设置

一个完整的例子

import logging
import os
from logging import handlers


class JsonFilter(logging.Filter):
  # 此处定义字段的默认值,如果打印信息时不设置对应字段,则为默认值
  # 服务服务名或者服务主机
  server = ""
  # 访问ip
  ip = ""
  # 访问资源路径
  sourceurl = ""
  # 访问方式
  method = ""
  # 访问设备
  devices = ""
  # 访问协议
  Protocols = ""
  # 访问结果的HTTP状态码
  result_Httpstatus = ""
  # 访问结果的状态码
  result_status = ""
  # 访问结果的msg信息
  result_msg = ""
  # 访问结果的数据大小
  result_msgsize = ""
  def filter(self, record):
    record.server = self.server
    record.ip = self.ip
    record.sourceurl = self.sourceurl
    record.method = self.method
    record.devices = self.devices
    record.Protocols = self.Protocols
    record.result_Httpstatus = self.result_Httpstatus
    record.result_status = self.result_status
    record.result_msg = self.result_msg
    record.result_msgsize = self.result_msgsize
    return True


class CommonLog(object):
  """
  日志记录
  """
  def __init__(self, logger, logname='Access_log'):
    self.logname = os.path.join("D:\python protest\protest", '%s' % logname)
    self.logger = logger
    self.logger.setLevel(logging.INFO)
    self.logger.propagate = False
    self.filter_ = JsonFilter()
    self.logger.addFilter(self.filter_)
    self.formatter = logging.Formatter("time:%(asctime)s - levelname:%(levelname)s - server:%(server)s - ip:%(ip)s - sourceurl:%(sourceurl)s - method:%(method)s - devices:%(devices)s - Protocols:%(Protocols)s - result_Httpstatus:%(result_Httpstatus)s - result_status:%(result_status)s - result_msg:%(result_msg)s - result_msgsize:%(result_msgsize)s ")
  def console(self, level, message):
    # 创建一个FileHandler,用于写到本地
    fh = logging.handlers.TimedRotatingFileHandler(self.logname, when='MIDNIGHT', interval=1, encoding='utf-8')
    fh.suffix = '%Y-%m-%d.log'
    fh.setLevel(logging.INFO)
    fh.setFormatter(self.formatter)
    self.logger.addHandler(fh)

    # 创建一个StreamHandler,用于输出到控制台
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    ch.setFormatter(self.formatter)
    self.logger.addHandler(ch)

    if level == 'info':
      self.logger.info(message)
    elif level == 'debug':
      self.logger.debug(message)
    elif level == 'warning':
      self.logger.warning(message)
    elif level == 'error':
      self.logger.error(message)
    # 这两行代码是为了避免日志输出重复问题
    self.logger.removeHandler(ch)
    self.logger.removeHandler(fh)
    # 关闭打开的文件
    fh.close()

  def debug(self, message):
    self.console('debug', message)

  def info(self, message):
    self.console('info', message)

  def warning(self, message):
    self.console('warning', message)

  def error(self, message):
    self.console('error', message)


if __name__ == '__main__':
  logger = logging.getLogger()
  log = CommonLog(logger)
  log.filter_.server = '127.0.0.1:8100'
  log.filter_.ip = '127.0.0.1'
  log.filter_.sourceurl = 'http://127.0.0.1:8100/test'
  log.filter_.method = 'Get'
  log.filter_.devices = 'Chrome'
  log.filter_.Protocols = 'HTTP'
  log.filter_.result_Httpstatus = '200'
  log.filter_.result_status = '1001'
  log.filter_.result_msg = '增加成功'
  log.filter_.result_msgsize = '4296'
  log.info("")

设置日志打印颜色

# coding:utf-8
import logging
import os
from logging.handlers import RotatingFileHandler # 
import colorlog # 控制台日志输入颜色




log_colors_config = {
  'DEBUG': 'cyan',
  'INFO': 'green',
  'WARNING': 'yellow',
  'ERROR': 'red',
  'CRITICAL': 'red',
}


class Log:
  def __init__(self, logname='Access_log'):
    self.logname = os.path.join("D:\python_protest\protest", '%s' % logname)
    self.logger = logging.getLogger()
    self.logger.setLevel(logging.DEBUG)
    self.formatter = colorlog.ColoredFormatter(
    '%(log_color)s[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s',
    log_colors=log_colors_config) # 日志输出格式
  def console(self, level, message):
    # 创建一个FileHandler,用于写到本地
    fh = logging.handlers.TimedRotatingFileHandler(self.logname, when='MIDNIGHT', interval=1, encoding='utf-8')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(self.formatter)
    self.logger.addHandler(fh)

    # 创建一个StreamHandler,用于输出到控制台
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    ch.setFormatter(self.formatter)
    self.logger.addHandler(ch)

    if level == 'info':
      self.logger.info(message)
    elif level == 'debug':
      self.logger.debug(message)
    elif level == 'warning':
      self.logger.warning(message)
    elif level == 'error':
      self.logger.error(message)
    # 这两行代码是为了避免日志输出重复问题
    self.logger.removeHandler(ch)
    self.logger.removeHandler(fh)
    fh.close() # 关闭打开的文件

  def debug(self, message):
    self.console('debug', message)

  def info(self, message):
    self.console('info', message)

  def warning(self, message):
    self.console('warning', message)

  def error(self, message):
    self.console('error', message)


if __name__ == "__main__":
  log = Log()
  log.info("测试1") # 如果你需要在打印字段中设置
  log.debug("测试2") # 如果你需要在打印字段中设置

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
python字典排序实例详解
May 20 Python
python简单猜数游戏实例
Jul 09 Python
python中redis的安装和使用
Dec 04 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
python 简单的调用有道翻译
Nov 25 Python
Python-split()函数实例用法讲解
Dec 18 Python
详解Python中string模块除去Str还剩下什么
Nov 30 #Python
使用django自带的user做外键的方法
Nov 30 #Python
python 实现简易的记事本
Nov 30 #Python
详解pycharm自动import所需的库的操作方法
Nov 30 #Python
Django REST Framework 分页(Pagination)详解
Nov 30 #Python
python代码实现猜拳小游戏
Nov 30 #Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 #Python
You might like
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php模板原理讲解
2013/11/13 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
使用js获取QueryString的方法小结
2010/02/28 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
Swiper自定义分页器使用详解
2017/12/28 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python 绘制可视化折线图
2020/07/22 Python
详解Python 中的容器 collections
2020/08/17 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
企业车辆管理制度
2014/01/24 职场文书
护理不良事件检讨书
2014/02/06 职场文书
春节请假条
2014/04/11 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
审美与表现自我评价
2015/03/09 职场文书
金陵十三钗观后感
2015/06/04 职场文书
法制工作总结2015
2015/07/23 职场文书
大队委员竞选稿
2015/11/20 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
python基础之文件处理知识总结
2021/05/23 Python
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers