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中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python中的面向对象编程详解(上)
Apr 13 Python
Python实现控制台进度条功能
Jan 04 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
python获取点击的坐标画图形的方法
Jul 09 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
QML使用Python的函数过程解析
Sep 26 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
golang特有程序结构入门教程
Jun 02 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
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
php二维码生成
2015/10/19 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
js中document.write的那点事
2014/12/12 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
python 将大文件切分为多个小文件的实例
2019/01/14 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
宝宝周岁宴答谢词
2014/01/26 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
争先创优心得体会
2014/09/12 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
教务处教学工作总结
2015/08/10 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android