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 json encode datetime类型
Dec 28 Python
Python使用正则表达式抓取网页图片的方法示例
Apr 21 Python
浅谈对yield的初步理解
May 29 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
DataFrame中去除指定列为空的行方法
Apr 08 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python词云库wordcloud的使用方法与实例详解
Feb 17 Python
Python代码中如何读取键盘录入的值
May 27 Python
Python 远程开关机的方法
Nov 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
比较全的PHP 会话(session 时间设定)使用入门代码
2008/06/05 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
python字典序问题实例
2014/09/26 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
Python下载指定页面上图片的方法
2016/05/12 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
Python读取word文本操作详解
2018/01/22 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
如何理解transaction事务的概念
2015/05/27 面试题
关于赌博的检讨书
2014/01/08 职场文书
平安建设汇报材料
2014/12/29 职场文书
网络研修随笔感言
2015/11/18 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
如何用Navicat操作MySQL
2021/05/12 MySQL
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫
win10搭建配置ftp服务器的方法
2022/08/05 Servers