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,自定义,字段
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
javascript创建数组的最简代码
2013-09-01 21:43:04
SQL实现查询某字段的值为空的记录
2024-01-18 13:44:56
![](https://img.aspxhome.com/file/2023/7/96227_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/2/75962_0s.jpg)
超级链接中MailTo的语法
2008-08-29 13:00:00
Python爬虫分析汇总
2022-08-28 06:19:38
![](https://img.aspxhome.com/file/2023/5/114775_0s.png)
Python基于百度API识别并提取图片中文字
2023-02-06 13:51:25
![](https://img.aspxhome.com/file/2023/6/84946_0s.jpg)
Python求正态分布曲线下面积实例
2021-01-28 18:20:07
![](https://img.aspxhome.com/file/2023/6/81496_0s.jpg)
详解Python判定IP地址合法性的三种方法
2021-12-02 14:35:10
vue.js删除动态绑定的radio的指定项
2024-05-09 09:51:48
![](https://img.aspxhome.com/file/2023/2/127172_0s.png)
SQL Server中两种修改对象所有者的方法
2009-01-15 13:10:00
基于Vue3实现印章徽章组件的示例代码
2023-07-02 16:54:28
![](https://img.aspxhome.com/file/2023/4/139814_0s.png)
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
![](https://img.aspxhome.com/file/2023/8/90528_0s.jpg)
Python实现一个优先级队列的方法
2022-12-03 14:44:54
MySQL 创建主键,外键和复合主键的语句
2024-01-20 05:40:51
详解Python 定时框架 Apscheduler原理及安装过程
2021-06-16 15:15:09
![](https://img.aspxhome.com/file/2023/1/127811_0s.png)
详解pandas获取Dataframe元素值的几种方法
2022-12-28 07:30:01