一些关于logging部分的代码笔记以及讲解

来源:互联网 发布:windows 10桌面太亮 编辑:程序博客网 时间:2024/05/23 01:14

写一个关于logging的实践项目,以加深对上一篇博客知识的学习:

以下是对logging 类的定义

import os,os.path as ospimport time# 使用 time 模块的 strftime 方法来格式化日期def strftime(t=None):    return time.strftime("%Y%m%d-%H%M%S",time.localtime(t or time.time()))# 下面是logging类的定义import logging from logging.handlers import TimeRotatingFileHandlerlogging.basicConfig.format="[%(asctime)s][%(module)s.%(funcNames)s]%(message)s" # 设置每行日志默认的前缀DEFAULT_LEVEL=logging.INFODEFAULT_LOGGING_DIR=osp.join("logs","gcforest")  # 设置日志默认的目录,当然后面还可以有所变化fh=None   # 默认日志句柄的设置# 以下是句柄初始化,通过日志路径(logging_path)来初始化句柄,并设置句柄的格式(logging.Formatter)def init_fh():    global fh    if fh is not None:       return     if DEFAULT_LOGGING_DIR is not None       return    if not osp.exists(DEFAULT_LOGGING_DIR):       os.mkdirs(DEFAULT_LOGGING_DIR)    logging_path=osp.join(DEFAULT_LOGGING_DIR,strftime()+".log")     fh=logging.FileHandler(logging_path)    formatter=logging.Formatter("[%(asctime)s][%(module)s.%(funcNames)s]%(message)s")    fh.setFormatter(formatter)def updata_dafault_level(default_level):    global DEFAULT_LEVEL    DEFAULT_LEVEL=default_leveldef update_default_logging_dir(default_logging_dir):    global DEFAULT_LOGGING_DIR    DEFAULT_LOGGING_DIR=default_logging_dirdef get_logger(name="gcforest",level=None):    level=level or DEFAULT_LEVEL    logger=logging.getlogger(name)    logger.setLevel(level)    init_fh()    if fh is not None:       logger.addHandler(fh)    return logger

以下是对logger在具体代码中的使用

import sys, os, os.path as ospimport argparseimport loggingimport numpy as npimport jsonsys.path.insert(0, 'lib')from gcforest.utils.log_utils import get_logger, update_default_level, update_default_logging_dirfrom gcforest.utils.config_utils import load_json# 读取命令行的参数,供main函数进行解析def parse_args():    parser = argparse.ArgumentParser()    parser.add_argument('-model', dest='model', type=str, help='gcfoest Net Model File',                        default="models/mnist/forest/tree500-depth100-3folds.json")    parser.add_argument('-save_outputs', dest='save_outputs', action="store_true", help="Save outputs")    parser.add_argument('-log_dir', dest='log_dir', type=str, default=None, help='Log file directory')    args = parser.parse_args()    return argsif __name__ == '__main__':    args = parse_args()    config = load_json(args.model)    update_default_level(logging.DEBUG)    if args.log_dir is not None:        update_default_logging_dir(args.log_dir)    from gcforest.fgnet import  FGTrainConfig    from gcforest.datasets import get_dataset# 只需要在代码相应的地方生成logger实例,就可以通过实例名.info输出要打印的日志信息    LOGGER = get_logger("tools.train_fg") # 返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例    LOGGER.info("tools.train_fg")  # 这是日志具体输出的信息,对应于 %(message)s    LOGGER.info("\n" + json.dumps(config, sort_keys=True, indent=4, separators=(',', ':')))#这也是日志具体的输出信息    train_config = FGTrainConfig(config["train"])

下一节会讲一下,命令行参数的解析过程。放学!回家!~~~~~

原创粉丝点击