创建日志类并使用
如何使用python自带的 logging 模块实现日志功能
初始化一个logger对象
1)引入模块
import os import logging import sys
2)初始化变量,声明logger对象
log_path = 'logs' #设置log路径 log_file = 'text.txt' #设置log文件名 #设置根路径为起始位置 logger = logging.getlogger(__name__)
3) 生成路径
#生成log指定路径
if os.path.exists(log_path):
pass
else:
os.mkdir(log_path)4)指定logger输出格式
formatter = logging.formatter('%(asctime)s %(levelname)-8s: %(message)s')
file_handler = logging.filehandler("%s/%s" % (log_path, log_file))
# 可以通过setformatter指定输出格式
file_handler.setformatter(formatter)
logger.addhandler(file_handler)5)指定日志文件的输出级别
分为如下几个级别:
_nametolevel = {
'critical': critical,
'fatal': fatal,
'error': error,
'warn': warning,
'warning': warning,
'info': info,
'debug': debug,
'notset': notset,
} 使用setlevel函数指定输出级别 指定之后将只显示级别以上的日志类型
logger.setlevel(logging.debug)
6) 自动分割日志文件
python 提供了两个处理器,方便我们分割文件:
- logging.handlers.rotatingfilehandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
- logging.handlers.timedrotatingfilehandler -> 按照时间自动分割日志文件


timedrotatingfilehandler(filename='logs/info/' +
info_file_name,
when='midnight',
interval=1,
backupcount=7,
encoding='utf-8')
# filename:日志文件名 # when:日志文件按什么维度切分。's'-秒;'m'-分钟;'h'-小时;'d'-天;'w'-周 # 这里需要注意,如果选择 d-天,那么这个不是严格意义上的'天',而是从你 # 项目启动开始,过了24小时,才会从新创建一个新的日志文件, # 如果项目重启,这个时间就会重置。所以这里选择'midnight'-是指过了午夜 # 12点,就会创建新的日志。 # interval:是指等待多少个单位 when 的时间后,logger会自动重建文件。 # backupcount:是保留日志个数。默认的0是不会自动删除掉日志。
when是一个字符串用于描述滚动周期的基本单位,字符串的值及意义如下:
- 's': seconds
- 'm': minutes
- 'h': hours
- 'd': days
- 'w': week day (0=monday)
- 'midnight': roll over at midnight
- interval: 滚动周期,单位有when指定,比如:when='d',interval=1,表示每天产生一个日志文件;
- backupcount: 表示日志文件的保留个数
输入日志内容
#输出debug类型日志
logger.debug("debug")
#多参数传递 输入info类型日志
pam= "dshck"
pam2="cxjkdhc"
logger.info("%s%s"%(pam,pam2))log.py 代码如下
import os
import logging
from logging.handlers import timedrotatingfilehandler
import datetime
import json
log_path = "log"
log_info = '_info.log'
log_error = '_error.log'
class logger:
def __init__(self,prefix_name = "flask"):
if os.path.exists(log_path):
pass
else:
os.mkdir(log_path)
self.prefix = prefix_name
self.info_logger = logging.getlogger("info")
self.error_logger = logging.getlogger("error")
self.format = logging.formatter('[%(asctime)s][%(threadname)s:%(thread)d][task_id:%(name)s]\
[%(filename)s:%(lineno)d]' '[%(levelname)s] : %(message)s')
#指定文件位置文件名以及输出格式
info_file_handler = logging.filehandler("%s/%s%s" % (log_path, prefix_name,log_info))
info_file_handler.setformatter(self.format)
error_file_handler = logging.filehandler("%s/%s%s" % (log_path, prefix_name,log_error))
error_file_handler.setformatter(self.format)
self.info_logger.addhandler(info_file_handler)
self.error_logger.addhandler(error_file_handler)
# 指定日志的最低输出级别
self.info_logger.setlevel(logging.notset)
self.error_logger.setlevel(logging.error)
def debug(self, msg, *args, **kwargs):
self.info_logger.debug(msg, *args, **kwargs)
def info(self, msg, *args, **kwargs):
self.info_logger.info(msg, *args, **kwargs)
def warn(self, msg, *args, **kwargs):
self.info_logger.warning(msg, *args, **kwargs)
def warning(self, msg, *args, **kwargs):
self.info_logger.warning(msg, *args, **kwargs)
def error(self, msg, *args, **kwargs):
self.error_logger.error(msg, *args, **kwargs)
def fatal(self, msg, *args, **kwargs):
self.error_logger.fatal(msg, *args, **kwargs)
def critical(self, msg, *args, **kwargs):
self.error_logger.critical(msg, *args, **kwargs)
# log =logger()
# log.info("jdshskh")
# log.error("hdskck")
# log.debug("1122debug")
# log.warn("warn")
# log.warning("warning")
# log.critical("critical")
# log.fatal("fatal")
log =logger("celery")
log.info("jdshskh")
log.error("hdskck")
log.debug("1122debug")
log.warn("warn")
log.warning("warning")
log.critical("critical")
log.fatal("fatal")开源日志实例
import logging
logger = logging.getlogger()
def setup_logging(logfile, verbose):
"""
设置日志记录到日志文件/控制台。
:param logfile:要写入日志的文件的路径。
:param verbose:如果为true,则启用详细日志记录。
"""
root_logger = logging.getlogger()
default_formatter = logging.formatter('%(asctime)-15s (%(name)s) %(filename)s[line:%(lineno)d] : %(message)s')
if verbose:
loglevel = logging.debug
else:
loglevel = logging.info
root_logger.setlevel(loglevel)
console_log = logging.streamhandler()
console_log.setlevel(loglevel)
console_log.setformatter(default_formatter)
root_logger.addhandler(console_log)
if logfile in ('/dev/log', '/dev/syslog', '/var/run/syslog', '/var/run/log'):
file_log = logging.handlers.sysloghandler(address=logfile, facility='local1')
syslog_formatter = logging.formatter('beeswarm[%(process)d]: %(message)s')
file_log.setformatter(syslog_formatter)
else:
file_log = logging.filehandler(logfile)
file_log.setformatter(default_formatter)
file_log.setlevel(loglevel)
root_logger.addhandler(file_log)
# 日志按天自动创建
"""
time_rotating_file_handler = handlers.timedrotatingfilehandler(filename=logfile, when='s')
#time_rotating_file_handler.setlevel(logging.error)
time_rotating_file_handler.setlevel(logging.info)
time_rotating_file_handler.setformatter(default_formatter)
root_logger.addhandler(time_rotating_file_handler)
"""
if __name__ == '__main__':
setup_logging(args.logfile, args.verbose)
logger.info('initializing beeswarm version {0}'.format(beeswarm.version))
logger.debug('workdir = {0}, config = {1}, customize = {2}, clear_db = {3}, reset_password = {4}, max_sessions = {5}, start_webui = {6}.'.format(args.workdir,
config, args.customize, args.clearsessions, args.resetpw, args.max_sessions, not args.no_webui))
logger.debug('workdir = {0}'.format())
logger.error(...)
logger.warning(...)多日志输出实例
配置文件log_config.py
# -*- coding: utf-8 -*-
import os
import time
import logging.config
cur_path = os.path.dirname(os.path.realpath(__file__)) # log_path是存放日志的路径
log_path = os.path.join(os.path.dirname(cur_path), 'logs')
if not os.path.exists(log_path):
os.mkdir(log_path) # 如果不存在这个logs文件夹,就自动创建一个
def setp_log():
logging_config = {
'version': 1,
'disable_existing_loggers': false,
'formatters': {
# 日志格式
'simple': {
'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcname)s:%(lineno)s] [%(message)s]'},
# 简单格式
'standard': {
#'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcname)s:%(lineno)s] [%(message)s]'
'format': '[%(asctime)s] [%(filename)s:%(lineno)s] [%(message)s]'
},
},
# 定义具体处理日志的方式
'handlers': {
# 控制台输出
'console_handler': {
'level': 'debug',
'class': 'logging.streamhandler',
'formatter': 'simple'
},
# 默认记录所有日志,按日期滚动输出到文件
'info_handler': {
'level': 'info',
'class': 'logging.handlers.rotatingfilehandler',
'filename': os.path.join(log_path, 'all-{}.log'.format(time.strftime('%y-%m-%d'))), # 按日分类
'maxbytes': 1024 * 1024 * 5, # 文件大小
'backupcount': 5, # 备份数
'formatter': 'standard', # 输出格式
'encoding': 'utf-8', # 设置默认编码,否则打印出来汉字乱码
},
# 输出错误日志
'error_handler': {
'level': 'error',
'class': 'logging.handlers.rotatingfilehandler',
'filename': os.path.join(log_path, 'error-{}.log'.format(time.strftime('%y-%m'))), # 按月分类
'maxbytes': 1024 * 1024 * 5, # 文件大小
'backupcount': 5, # 备份数
'formatter': 'standard', # 输出格式
'encoding': 'utf-8', # 设置默认编码
},
},
'loggers': {
'log': {
'handlers': ['console_handler', 'info_handler', 'error_handler'],
'level': 'info',
'propagate': true
},
}
}
logging.config.dictconfig(logging_config)测试代码
aaa.py(加载)
# -*- coding: utf-8 -*-
from log_config import setp_log
setp_log()
import logging
logger = logging.getlogger('log')
logger.info("asdasd")
logger.error("asd")bbb.py(调用)
import logging
logger = logging.getlogger('log')
logger.info("asdasd")
logger.critical("asd123")
logger.error("asd")总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论