import logging
# 初始化
logger = logging.getLogger("test")
# 返回一个logger实例,如果没有指定name,返回root logger。
#只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。
# 这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。
getLogger() 方法后面最好加上所要日志记录的模块名字,在formatter日志格式中的%(name)s 对应的是这里的模块名.
2. 设置级别:
# 设置日志级别
logger.setLevel(level=“DEBUG”)
Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志.
3. 实例化 Handler
常用的是 StreamHandler 和 FileHandler 一个将日志打印在CMD窗口上, 一个将日志记录在文件上
fh = logging.FileHandler(LOG_FILE, maxBytes=1024 * 1024, backupCount=5,
encoding='utf-8'") # 添加encoding 解决输出文件乱码问题
fh.setLevel(logging.DEBUG)
sh = logging.StreamHandler()
sh.setLevel(logging.ERROR)
formatter = logging.Formatter(“%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s”)
sh.setFormatter(formatter)
fh.setFormatter(formatter)
import logging
import os
class Logger(object):
def __init__(self, log_level="DEBUG", sh_log_level=None, fh_log_level=None, write_mode="w", log_path=None):
"""
实例化一个logger对象,根据传入参数以不同方式输出日志
1,使用默认参数,仅在控制台输出DEBUG登记信息
2.给sh_log_level传入日志等级,在控制台输出加入格式后的日志信息
3.给fh_log_level传入日志等级,在文件中输出加入格式后的日志信息
:param log_level:初始化日志等级
:param log_path:输出日志文件路径,若无指定路径则将log文件夹生成在入口文件目录中.
:param fh_log_level:控制台输出日志等级
:param sh_log_level:文件输出日志等级
:param write_mode:日志写入方式 "w"覆盖 "a"追加
"""
# 创建一个logger
self.logger = logging.getLogger()
self.logger.setLevel(log_level)
self.write_mode = write_mode
level_list = ['CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'NOTSET', ]
# 定义handler的输出格式
self.formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 创建一个filehandler,用于写入日志文件
if fh_log_level in level_list:
if log_path is None:
log_path = os.path.join(os.getcwd(), "log")
os.makedirs(log_path, exist_ok=True)
log_name = os.path.join(log_path, "running.log")
fh = logging.FileHandler(log_name, mode=self.write_mode, encoding="utf-8")
fh.setLevel(fh_log_level)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)
# 再创建一个streamhandler,用于输出到控制台
if sh_log_level in level_list:
sh = logging.StreamHandler()
sh.setLevel(sh_log_level)
sh.setFormatter(self.formatter)
self.logger.addHandler(sh)
`
注意:代码21行处实例化logger时最好将 level 设成 “DEBUG” 或 “NOTSET”, 若设置等级过高,后面33行,39行setlevel 时,如果设置的级别低于21行的 level ,则无法获取低于21行 level 的日志信息使用
在主函数中实例化Logger对象,传入对应的参数.
# –*– coding: utf-8 –*–
# @Time : 2018/12/19 21:47
# @Author : Damon_duan
# @FileName : main.py
from log_class import Logger
import logging
# 实例化
logger = Logger("DEBUG", sh_log_level="INFO", fh_log_level="DEBUG", write_mode="a")
logging.debug("0000000000")
logging.info("1111111111111")
logging.warning("2222222222222")
logging.error("3333333333")
运行结果:
控制台显示
2018-12-19 22:42:22,464 - main.py[line:12] - INFO: 1111111111111
2018-12-19 22:42:22,464 - main.py[line:13] - WARNING: 2222222222222
2018-12-19 22:42:22,464 - main.py[line:14] - ERROR: 3333333333
文件中内容:
2018-12-19 22:39:58,810 - main.py[line:11] - DEBUG: 0000000000
2018-12-19 22:39:58,810 - main.py[line:12] - INFO: 1111111111111
2018-12-19 22:39:58,810 - main.py[line:13] - WARNING: 2222222222222
2018-12-19 22:39:58,810 - main.py[line:14] - ERROR: 3333333333
logging模块保证在同一个python解释器内,多次调用logging.getLogger(‘log_name’)都会返回同一个logger实例,即使是在多个模块的情况下。所以典型的多模块场景下使用logging的方式是在main模块中配置logging,这个配置会作用于多个的子模块,然后在其他模块中直接通过getLogger获取Logger对象即可。
如使用上面代码在main中实例了logger,只需在其他模块中 import logging随后在模块中就可以使用 logging.level 进行调用
代码及运行结果如下:
test01.py
# –*– coding: utf-8 –*–
# @Time : 2018/12/19 22:51
# @Author : Damon_duan
# @FileName : test01.py
import logging
def test():
logging.info("子模块test中log信息")
main.py
# –*– coding: utf-8 –*–
# @Time : 2018/12/19 21:47
# @Author : Damon_duan
# @FileName : main.py
from log_class import Logger
import logging
import test01
# 实例化
logger = Logger("DEBUG", sh_log_level="INFO", fh_log_level="DEBUG", write_mode="a")
logging.debug("0000000000")
logging.info("1111111111111")
test01.test()
logging.warning("2222222222222")
logging.error("3333333333")
运行结果:
2018-12-19 22:54:27,847 - main.py[line:13] - INFO: 1111111111111
2018-12-19 22:54:27,848 - test01.py[line:9] - INFO: 子模块test中log信息
2018-12-19 22:54:27,848 - main.py[line:15] - WARNING: 2222222222222
2018-12-19 22:54:27,848 - main.py[line:16] - ERROR: 3333333333
关于 logging 模块总结先到此,随着后续深入学习和工作中实际使用,会继续丰富本篇内容,因能力有限如本文中出现理解或书写错误,请不吝指出.