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

作者:-零 时间:2023-09-03 17:04:25 

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") # 如果你需要在打印字段中设置

来源:https://www.cnblogs.com/-wenli/p/13402244.html

标签:Python,logging,自定义,字段
0
投稿

猜你喜欢

  • javascript创建数组的最简代码

    2013-09-01 21:43:04
  • SQL实现查询某字段的值为空的记录

    2024-01-18 13:44:56
  • springboot配置文件抽离 git管理统 配置中心详解

    2021-05-24 08:17:18
  • 教你如何在CI框架中使用 .htaccess 隐藏url中index.php

    2023-11-14 11:49:57
  • 解决pycharm回车之后不能换行或不能缩进的问题

    2023-06-11 10:45:40
  • 超级链接中MailTo的语法

    2008-08-29 13:00:00
  • Python爬虫分析汇总

    2022-08-28 06:19:38
  • Python基于百度API识别并提取图片中文字

    2023-02-06 13:51:25
  • Python求正态分布曲线下面积实例

    2021-01-28 18:20:07
  • 详解Python判定IP地址合法性的三种方法

    2021-12-02 14:35:10
  • vue.js删除动态绑定的radio的指定项

    2024-05-09 09:51:48
  • SQL Server中两种修改对象所有者的方法

    2009-01-15 13:10:00
  • 基于Vue3实现印章徽章组件的示例代码

    2023-07-02 16:54:28
  • MYSQL METADATA LOCK(MDL LOCK)MDL锁问题分析

    2024-01-15 04:45:54
  • php 常用类整理

    2024-05-09 14:46:57
  • 利用Python编写简易版德州扑克小游戏

    2021-02-03 06:00:59
  • Python实现一个优先级队列的方法

    2022-12-03 14:44:54
  • MySQL 创建主键,外键和复合主键的语句

    2024-01-20 05:40:51
  • 详解Python 定时框架 Apscheduler原理及安装过程

    2021-06-16 15:15:09
  • 详解pandas获取Dataframe元素值的几种方法

    2022-12-28 07:30:01
  • asp之家 网络编程 m.aspxhome.com