Python logging自定义字段输出及打印颜色
作者:-零 发布时间:2023-09-03 17:04:25
标签:Python,logging,自定义,字段
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


猜你喜欢
- 本例子程序展示了长白山火山气体地球化学2002年观测数据中CO2和He两种气体元素深度的时间序列。程序中用到了常用的时间序列python数据
- 前言这期文章我就为大家介绍关于python的艺术美——画图神器在数学中有一种美,叫几何美,我们又称为
- 如果你还在为python的各种urllib和urlibs,cookielib 头疼,或者还还在为python模拟登录和抓取数据而抓狂,那么来
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q
- 支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行
- 1. python中创建新的csv文件(1). 使用csv.writer()创建:代码如下:import csvheaders = [
- 环境 centos7 python3pytesseract只是tesseract-ocr的一种实现接口。所以要先安装tesseract-oc
- python框架有很多,例如:Flask,Django,FastAPI 等。本文将使用 Flask 来编写 API 接口。安装Flask首先
- 1.安装Oracle Client连接到Oracle的前提是在SQL Server服务器上安装Oracle Client。Oracle Cl
- 关于英文的写作有一本十分著名的书,The Elements of Style(风格要素),编写程序也有一本The Elements of P
- 基本介绍图像的全景拼接,即“缝合”两张具有重叠区域的图来创建一张全景图。其中用到了计算机视觉和图像处理技术有:关键点检测、局部不变特征、关键
- 本文内容是在《Python核心编程2》上看到的,感觉很有用便写出来,给大家参考参考!浅拷贝首先我们使用两种方式来拷贝对象,一种是切片,另外一
- python实现rsa加密实例详解一 代码import rsakey = rsa.newkeys(3000)#生成随机秘钥privateKe
- 简述在大多数此类教程中都会不遗余力的介绍如何使用数据库。今天我们对数据库暂且不表,而是来关注另一个在web应用中很重要的特性:如
- 如果你是一位前端开发工程师,对“跨平台”一词应该不会感到陌生。像常见的前端框架:比如React、Vue、Angular,它们可以做网页端,也
- 这篇文章主要介绍了python实现简单日志记录库glog的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 不知道做网络程序的朋友是否重视COOKIES作用域对于多域名或 主域与WWW二级域名同时共用一站点,设置Cookies的作用域,让整个网站用
- 现在需要一个写文件方法,将selenium的脚本运行结果写入test_result.log文件中首先创建写入方法def write_resu
- 这本来是翻译Estelle Weyl的《15 JavaScript Gotchas》,里面介绍的都是在JavaScript编程实践中平时容易
- MySQL有多种方法导入多个.sql文件(里面是sql语句),常用的有两个命令:mysql和source。但是这两个命令的导入效率差别很大,