您的位置:首页 > 编程语言

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

2017-12-06 20:29 483 查看
写一个关于logging的实践项目,以加深对上一篇博客知识的学习:

以下是对logging 类的定义

import os,os.path as osp
import 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 TimeRotatingFileHandler
logging.basicConfig.format="[%(asctime)s][%(module)s.%(funcNames)s]%(message)s" # 设置每行日志默认的前缀

DEFAULT_LEVEL=logging.INFO
DEFAULT_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_level

def update_default_logging_dir(default_logging_dir):
global DEFAULT_LOGGING_DIR
DEFAULT_LOGGING_DIR=default_logging_dir

4000
def 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 osp
import argparse
import logging
import numpy as np
import json

sys.path.insert(0, 'lib')
from gcforest.utils.log_utils import get_logger, update_default_level, update_default_logging_dir
from 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 args

if __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"])


下一节会讲一下,命令行参数的解析过程。放学!回家!~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: