Python中logger日志模块详解

这篇博客详细介绍了Python的logging模块使用,包括基本的日志记录、输出到文件、控制台输出、日志回滚、异常处理以及多模块日志管理和通过JSON配置日志。内容涵盖设置日志级别、处理器、格式器以及如何处理不同级别的日志信息,展示了如何在不同场景下灵活管理日志。
摘要由CSDN通过智能技术生成

###原文地址

注:本文所有注释的信息,不一定正确,望知

import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s') ## 当这里的logging.DEBUG的时候就会输出4条信息
logger = logging.getLogger(__name__)  ## 这里是通过相应的实例化的方法

logger.info('Start print log')
logger.debug('Do something')
logger.warning('Something maybe fail.')
logger.info('Finish')
import logging
## 将相应的日志信息输出到文件当中的。
logger = logging.getLogger(__name__)  ## 加载日志名称,相当于定义一个日志对象
logger.setLevel(level = logging.INFO)  ## 设置日志的水平的等级是info,只有info下面的数据才能够输出
handler = logging.FileHandler("log.txt")  ## 是来创建一个log日志文件对象的。
handler.setLevel(logging.INFO)  ## 这个文件的日志等级是info
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ##输出时间,日志名称,日志等级,和所对应的消息
handler.setFormatter(formatter)  ## 然后是把这个handler设置为这里面的格式。
logger.addHandler(handler)

logger.info('Start print log')
logger.debug('Do something')
logger.warning('Something maybe fail.')
logger.info('Finish')
## 同时将日志信息输出到屏幕中

import logging


logger = logging.getLogger(__name__)  ## 这里是来创建一个日志对象 其实就是等同于创建一个对象的
logger.setLevel(level = logging.INFO) ## 日志对象的水平是INFO
handler = logging.FileHandler("log.txt")  ## 是来创建这样一个日志文件
handler.setLevel(logging.INFO)  ## 日志文件的水平是INFO
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  ## 日志文件的输出的格式
handler.setFormatter(formatter)  ## 然后是把这些文件来设置为这样的输出的格式

console = logging.StreamHandler()  ## 在控制台上按照数据流的方式进行输出的。
console.setLevel(logging.INFO) ## 设置日志的输出的等级

logger.addHandler(handler)
logger.addHandler(console)

logger.info('Start print log')
logger.debug('Do something')
logger.warning('Something maybe fail.')
logger.info('Finish')
##  这样是来备份多个日志文件的。
import logging
from logging.handlers import RotatingFileHandler  ## 实现日志的回滚的。
logger = logging.getLogger(__name__)  ##  创建logger的日志的对象的,这里是相当于来创建一个对象的。
logger.setLevel(level = logging.INFO)  ## 日志的等级是INFO
#定义一个RotatingFileHandler,最多备份3个日志文件,每个日志文件最大1K
rHandler = RotatingFileHandler("log.txt",maxBytes = 1*1024,backupCount = 3)  ## 来备份日志文件大小是1024 ,是定义3个日志文件
rHandler.setLevel(logging.INFO)  ## 把这设置添加日志回滚文件所设置的等级的。
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rHandler.setFormatter(formatter)  ## 设置日志回滚文件所设置的格式

console = logging.StreamHandler()  ## 然后是控制台来输出相应的回滚流的。
console.setLevel(logging.INFO)
console.setFormatter(formatter)

logger.addHandler(rHandler)
logger.addHandler(console)

logger.info('Start print log')
logger.debug('Do something')
logger.warning('Something maybe fail.')
logger.info('Finish')
## 处理日志的异常的返回信息和捕获traceback
import logging
logger = logging.getLogger(__name__)  ## 首先是来等同于定义一个日志的对象的
logger.setLevel(level = logging.INFO)  ## 设置日志对象所对应的等级
handler = logging.FileHandler("log.txt")  ## 所对应的日志文件,我们是会来生成这样一个日志文件的。
handler.setLevel(logging.INFO)  ## 日志所对应的等级
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  ## 设置日志所输出的格式的
handler.setFormatter(formatter)  ## 设置以后,然后是来输出这样的格式的。

console = logging.StreamHandler()  ## 调用的日志在控制台的来进行输出的
console.setLevel(logging.INFO)

logger.addHandler(handler)   ## 是来输出相应文件的
logger.addHandler(console)  ## 这里是在控制台上进行输出的

logger.info('Start print log')
logger.debug('Do something')
logger.warning('Something maybe fail.')
try:
    open('sklearn.txt','rb') ## 这里是按照以二进制的方式来读取文件
except (SystemExit,KeyboardInterrupt):
    raise
except Exception:
    logger.error('Faild to open sklearn.txt from logger.error”,exc_info = True')  ## 这里是来抛出相应的异常信息

logger.info('Finish')

## 多个模块来使用logging
import logging
from subModule import subModule  ## 原来这里定义的是一个子模块
logger = logging.getLogger("mainModule") ## 生成相应的调用对象,其实不是对象,但是我们这里把它当成对象的
logger.setLevel(level = logging.INFO) ## 这个日志文档所对应的的等级是INFO
handler = logging.FileHandler("log.txt")  ## 这里是来定义的一个日志文件
handler.setLevel(logging.INFO)  ## 其中日志文件所对应的过录条件是INFO
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  ##这里是来对应的相应的格式的
handler.setFormatter(formatter)  ## 然后是日志文件里面对应的所输出的格式


console = logging.StreamHandler()  ## 定义一个控制台,在控制台上将对应的信息来进行输出
console.setLevel(logging.INFO)  ## 设置过滤的等级的
console.setFormatter(formatter)  ## 来设置出相应的过滤输出的格式的

logger.addHandler(handler)  ## 然后是这样就是能对相应的数据进行输出了
logger.addHandler(console)

logger.info('creating an instance of subModule.subModuleClass')
a = subModule.SubModuleClass()  ## 这里是来创建一个实例的子模块所对应的对象的。
logger.info('calling subModule.subModuleClass.doSomething')  ## 这里是来创建一个日志
a.doSomething()
logger.info('done with subModule.subModuleClass.doSomething')
logger.info('calling subModule.some_function')
subModule.som_function()
logger.info('done with subModule.some_function')

这里是上一个例子所导入子模块

import logging
## 任意以mainModule开头的logger都是他子logger
module_logger = logging.getLogger('mainModule.sub')  ## 定义一个调用的对象,定义调用的子对象的过程的。
class SubModuleClass(object):
    def init(self):
        self.logger = logging.getLogger('mainModule.sub.module')  ## 这里是来对模块进行初始化的过程的。
        self.logger.info('creating an instance in SubModuleClass')
    def doSomething(self):
        self.logger.info('do something in SubModule')
        a = []
        a.append(1)
        self.logger.debug("list a = " + str(a))
        self.logger.info('finish something in SubModuleClass')

def som_function():
    module_logger.info('call function some_function')

通过json文件来配置日志信息

import json
import logging.config
import os
## 其中默认是这个路径,默认的过滤等级是INFO
def setup_logging(default_path = './trainer/logging.json',default_level = 'logging.INFO',env_key = 'LOG_CFG'):
    path = default_path   ##  来得到相应的路径的
    value = os.getenv(env_key,None)  ## 返回的是环境变量所对应的位置的。
    if value:   ## 如果是存在这样的路径的
        path = value   ##  那么我们就把这个路径值path
    if os.path.exists(path):  ##  如果我们是存在这样的路径的时候
        with open(path,'r') as f:  ## 我们就是以只读的方式来打开这个文件
            config = json.load(f)   ## 然后把这个路径的下的文件给加载出来
            logging.config.dictConfig(config)  ## 把这个配置文件来转换为字典所对应的形式的。
    else:
        logging.basicConfig(level = 'default_level')  ## 然后是对应的如果不存在的情况的。

def func():
    logging.info('start func')

    logging.info('exec func')

    logging.info('end func')

if __name__ == "__main__":
    setup_logging(default_path = './trainer/logging.json')  ##  首先我们是来初始化这个函数,把相应的默认路径传过去
    func()

json文件

{
 "version":1,
 "disable_existing_loggers":false,
 "formatters":{
 "simple":{
 "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
 }
 },
 "handlers":{
 "console":{
 "class":"logging.StreamHandler",
 "level":"DEBUG",
 "formatter":"simple",
 "stream":"ext://sys.stdout"
 },
 "info_file_handler":{
 "class":"logging.handlers.RotatingFileHandler",
 "level":"INFO",
 "formatter":"simple",
 "filename":"info.log",
 "maxBytes":"10485760",
 "backupCount":20,
 "encoding":"utf8"
 },
 "error_file_handler":{
 "class":"logging.handlers.RotatingFileHandler",
 "level":"ERROR",
 "formatter":"simple",
 "filename":"errors.log",
 "maxBytes":10485760,
 "backupCount":20,
 "encoding":"utf8"
 }
 },
 "loggers":{
 "my_module":{
 "level":"ERROR",
 "handlers":["info_file_handler"],
 "propagate":"no"
 }
 },
 "root":{
 "level":"INFO",
 "handlers":["console","info_file_handler","error_file_handler"]
 }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值