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采用socket模拟TCP通讯的实现方法
Nov 19 Python
在Django框架中设置语言偏好的教程
Jul 27 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
Python实现决策树C4.5算法的示例
May 30 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
Django 内置权限扩展案例详解
Mar 04 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
Python中bisect的用法及示例详解
Jul 20 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
Laravel 加载第三方类库的方法
2018/04/20 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
php写app用的框架整理
2019/09/29 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
javascript整除实现代码
2010/11/23 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
分享Python字符串关键点
2015/12/13 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
python的re正则表达式实例代码
2018/01/24 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
python利用微信公众号实现报警功能
2018/06/10 Python
Python中求对数方法总结
2020/03/10 Python
python如何保存文本文件
2020/06/07 Python
学习党章思想汇报
2014/01/07 职场文书
社区平安建设方案
2014/05/25 职场文书
装修活动策划方案
2014/08/27 职场文书
受伤赔偿协议书
2014/09/24 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
2015年公司新年寄语
2014/12/08 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
酒店宣传语大全
2015/07/13 职场文书
2016年入党心得体会范文
2016/01/23 职场文书
小学科学课教学反思
2016/02/23 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
python如何读取.mtx文件
2021/04/22 Python