Logging日志
什么时候用到日志?
- 可预知的情况,写日志
- 不可预知情况,写日志
基础版
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
import logging
# 1. 对日志进行配置
logging.basicConfig(
filename='error.log', # 日志文件
format='%(asctime)s : %(message)s', # 写日志时,文件的格式。
datefmt='%Y-%m-%d %H:%M:%S %p',
level=20 # 级别,以后只有大于20的级别时,才能真正日志内容写入到文件中。
)
# 2.写日志
"""
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
"""
logging.debug("你好呀") # 10,你好呀
logging.info("中午好") # 10,你好呀
logging.error("你傻呀") # 40,你傻呀
默认这种形式不支持在文件中写入日志:
import logging
import traceback
# 1. 对日志进行配置
logging.basicConfig(
filename='v10.log', # 日志文件
format='%(asctime)s : %(message)s', # 写日志时,文件的格式。
datefmt='%Y-%m-%d %H:%M:%S %p',
level=20 # 级别,以后只有大于20的级别时,才能真正日志内容写入到文件中。
)
# 2. 对日志进行配置(不生效,因为已配置过后生成在内存,不再支持设置)
logging.basicConfig(
filename='v100.log', # 日志文件
format='%(asctime)s : %(message)s', # 写日志时,文件的格式。
datefmt='%Y-%m-%d %H:%M:%S %p',
level=20 # 级别,以后只有大于20的级别时,才能真正日志内容写入到文件中。
)
logging.error("沙雕")
对象版(支持多文件)
-
Formatter,格式化。
-
FileHandler,维护文件,专门用于往文件中写内容。
-
Logger,定义级别,大于这个级别才调用 FileHandler 去写内容。
-
写日志
logger = Logger() logger.error("内容") # 10 "xxx"
示例1:
import logging
# 定义 Formatter
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
# 定义 FileHandler
handler_object = logging.FileHandler('v2.log', 'a', encoding='utf-8')
handler_object.setFormatter(fmt)
# 定义 Logger
logger_object = logging.Logger('s1', level=logging.INFO) # 20
logger_object.addHandler(handler_object)
# ===>写日志<====
logger_object.error("大sb") # 40>20则写入日志
示例2:
import logging
# 定义 Formatter
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
# 定义 FileHandler
handler_object = logging.FileHandler('v2.log', 'a', encoding='utf-8')
handler_object.setFormatter(fmt)
handler_object2 = logging.FileHandler('v22.log', 'a', encoding='utf-8')
handler_object2.setFormatter(fmt)
# 定义 Logger
logger_object = logging.Logger('s1', level=logging.INFO) # 20
logger_object.addHandler(handler_object)
logger_object.addHandler(handler_object2)
# 写日志
logger_object.error("大sb")
配置版
示例1:简单配置
import logging.config
# 1. 定义字典
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": True, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
'demo': {
"class": 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': 'demo.log',
# 'maxBytes': 10240, # 根据文件大小拆分日志
# 'backupCount': 30, # 5
"encoding": "utf-8"
}
},
'loggers': {
'nb': {
'handlers': ['console', 'demo'],
'level': "INFO", # >=20 则触发日志
'propagate': False
}
}
}
# 2. 根据自定对logging进行配置
logging.config.dictConfig(LOGGING_CONFIG)
# 3. 写日志
logger_object = logging.getLogger("nb")
logger_object.info('6666666666')
示例2:多文件配置
import logging.config
# 1. 定义字典
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": True, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} {threadName} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
'simple': {
'format': '%(asctime)s %(levelname)s %(message)s',
'style': '%',
"datefmt": '%Y-%m-%d',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'run': {
# 运行日志,按天自动分割
"class": 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
'filename': "run.log",
'when': 'D', # 根据天拆分日志
'interval': 1, # 1天
'backupCount': 3, # 保留备份
"encoding": "utf-8"
},
'error': {
# 错误日志,按照文件大小分割
"class": 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': 'error.log',
'maxBytes': 1024 * 1025 * 50, # 根据文件大小拆分日志 50M
'backupCount': 5,
"encoding": "utf-8"
},
},
'loggers': {
'run': {
'handlers': ['run'],
'level': "INFO", # >=20 则触发日志
'propagate': True
},
'error': {
'handlers': ['console', 'error'],
'level': "ERROR", # >=20 则触发日志
'propagate': False
}
},
'root': {
'handlers': ['console', ],
'level': 'DEBUG',
'propagate': True
}
}
# 2. 根据自定对logging进行配置
logging.config.dictConfig(LOGGING_CONFIG)
# 3. 写日志
# root = logging.getLogger()
# root.info("测试测试")
# run = logging.getLogger('run')
# run.info("测试测试")
# run = logging.getLogger('error')
# run.info("有信息了")
# run.error("错误了")
示例3:过滤
import logging
class CallbackFilter(logging.Filter):
def __init__(self, callback):
self.callback = callback
def filter(self, record):
if self.callback(record):
return True
return False
class DynamicFilter(logging.Filter):
def filter(self, record):
# record,包含了日志相关的对象 logging.LogRecord
# print(record, type(record))
if not record.msg:
return False
return True
import logging.config
# 1. 定义字典
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": True, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} {threadName} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
'simple': {
'format': '%(asctime)s %(levelname)s %(message)s',
'style': '%',
"datefmt": '%Y-%m-%d',
},
},
"filters": {
"dy": {
"()": "utils.DynamicFilter"
},
"call": {
"()": "utils.CallbackFilter",
"callback": lambda record: len(record.msg) > 4
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'run': {
# 运行日志,按天自动分割
"class": 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
'filters': ["dy", 'call'],
'filename': "run.log",
'when': 'D', # 根据天拆分日志
'interval': 1, # 1天
'backupCount': 3, # 保留备份
"encoding": "utf-8"
},
'error': {
# 错误日志,按照文件大小分割
"class": 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': 'error.log',
'maxBytes': 1024 * 1025 * 50, # 根据文件大小拆分日志 50M
'backupCount': 5,
"encoding": "utf-8"
},
},
'loggers': {
'run': {
'handlers': ['run'],
'level': "INFO", # >=20 则触发日志
'propagate': True
},
'error': {
'handlers': ['console', 'error'],
'level': "ERROR", # >=20 则触发日志
'propagate': False
}
},
'root': {
'handlers': ['console', ],
'level': 'DEBUG',
'propagate': True
}
}
# 2. 根据自定对logging进行配置
logging.config.dictConfig(LOGGING_CONFIG)
# 3. 写日志
run = logging.getLogger('run')
run.info("测试测xxxxx")
Django
###########
# LOGGING #
###########
import os
BASE_LOG_DIR = BASE_DIR / 'log'
BASE_LOG_DIR.mkdir(exist_ok=True)
# The callable to use to configure logging
LOGGING_CONFIG = "logging.config.dictConfig"
# Custom logging configuration.
# 1. 定义字典
LOGGING = {
"version": 1,
"disable_existing_loggers": False, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} {threadName} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
'simple': {
'format': '%(asctime)s %(levelname)s %(message)s',
'style': '%',
"datefmt": '%Y-%m-%d',
},
},
# "filters": {
# "dy": {
# "()": "django.utils.log.RequireDebugFalse"
# },
# "call": {
# "()": "django.utils.log.CallbackFilter",
# "callback": lambda record: len(record.msg) > 4
# }
# },
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'run': {
# 运行日志,按天自动分割
"class": 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
# 'filters': ["dy", 'call'],
'filename': os.path.join(BASE_LOG_DIR, 'run.log'),
'when': 'D', # 根据天拆分日志
'interval': 1, # 1天
'backupCount': 3, # 保留备份
"encoding": "utf-8"
},
'error': {
# 错误日志,按照文件大小分割
"class": 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': os.path.join(BASE_LOG_DIR, 'error.log'),
'maxBytes': 1024 * 1025 * 50, # 根据文件大小拆分日志 50M
'backupCount': 5,
"encoding": "utf-8"
},
},
'loggers': {
'run': {
'handlers': ['run'],
'level': "INFO", # >=20 则触发日志
'propagate': True
},
'error': {
'handlers': ['console', 'error'],
'level': "ERROR", # >=40 则触发日志
'propagate': False
}
},
'root': {
'handlers': ['console', ],
'level': 'DEBUG',
'propagate': True
}
}
logger = logging.getLogger("error")
logger.error("...")
logger = logging.getLogger("run")
logger.info("...")
logger = logging.getLogger()
logger.info("...")
标签:-%,logging,handlers,run,error,Logging,日志
From: https://www.cnblogs.com/sherwin1995/p/17178876.html