###原文地址
注:本文所有注释的信息,不一定正确,望知
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"]
}
}