python logger 日志记录训练信息或异常信息

Loggger

  • 1.日志概念
  • 2 logging模块简介
    • 2.1 logging模块的日志级别
    • 2.2 logging模块的使用方式介绍
  • 3. 使用logging提供的模块级别的函数记录日志

1.日志概念

日志是一种可以追踪软件运行时所发生事件的方法,事件有严重性级别(level)。

2 logging模块简介

2.1 logging模块的日志级别

logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会导致日志级别的混乱。

日志等级(level) 描述:
DEBUG 最详细的日志信息,典型应用场景是 问题诊断
INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息

上面日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的。

2.2 logging模块的使用方式介绍

logging模块提供了两种记录日志的方式:

  • 第一种方式是使用logging提供的模块级别的函数
  • 第二种方式是使用Logging日志系统的四大组件

python logger 日志记录训练信息或异常信息_第1张图片
其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
python logger 日志记录训练信息或异常信息_第2张图片

3. 使用logging提供的模块级别的函数记录日志

  • 建立训练日志
import argparse
def parse_args():
    parser = argparse.ArgumentParser(description='Train face network')
    # general
    parser.add_argument('--data-dir', default='./dataset/imdb_wiki_utk', help='training set directory')
    #次数要改,保存模型名称
    parser.add_argument('--prefix', default='./model_train/r50', help='directory to save model.')
    parser.add_argument('--pretrained', default='', help='pretrained model to load')
    parser.add_argument('--ckpt', type=int, default=2,
                        help='checkpoint saving option. 0: discard saving. 1: save when necessary. 2: always save')
    parser.add_argument('--loss-type', type=int, default=4, help='loss type')
    parser.add_argument('--verbose', type=int, default=2000,
                        help='do verification testing and model saving every verbose batches')
    parser.add_argument('--max-steps', type=int, default=0, help='max training batches')
    parser.add_argument('--end-epoch', type=int, default=1000, help='training epoch size.')
    #parser.add_argument('--network', default='r50', help='specify network')
    parser.add_argument('--network', default='r50', help='specify network')
    parser.add_argument('--image-size', default='112,112', help='specify input image height and width')
    parser.add_argument('--version-input', type=int, default=1, help='network input config')
    parser.add_argument('--version-output', type=str, default='GAP', help='network embedding output config')
    parser.add_argument('--version-act', type=str, default='prelu', help='network activation config')
    parser.add_argument('--multiplier', type=float, default=1.0, help='')
    #学习率
    parser.add_argument('--lr', type=float, default=0.01, help='start learning rate') #第一版:0.01
    #训练步数
    parser.add_argument('--lr-steps', type=str, default='50000,80000,100000', help='steps of lr changing')
    parser.add_argument('--wd', type=float, default=0.0005, help='weight decay')
    parser.add_argument('--bn-mom', type=float, default=0.9, help='bn mom')
    parser.add_argument('--mom', type=float, default=0.9, help='momentum')
    #batch_size
    parser.add_argument('--per-batch-size', type=int, default=64, help='batch size in each context')
    parser.add_argument('--rand-mirror', type=int, default=1, help='if do random mirror in training')
    parser.add_argument('--cutoff', type=int, default=0, help='cut off aug')
    parser.add_argument('--color', type=int, default=0, help='color jittering aug')
    parser.add_argument('--ce-loss', default=False, action='store_true', help='if output ce loss')
    parser.add_argument('--net-blocks', default=[2,8,16,4], help='fmobileface set')
    args = parser.parse_args()
    return args
    
def logger_info(args):  # 建立日志
    logger = logging.getLogger()  # 用getLogger()方法得到一个日志记录器
    # logger.setLevel(logging.INFO)  # 用setLevel()方法设置日志级别,logging.INFO代表代码正常运行时的日志
    logger.setLevel(logging.INFO)  # 设置成debug模式

    command_handler = logging.StreamHandler()  # 显示日志:用logging.StreamHandler()得到一个显示管理对象
    command_handler.setLevel(logging.INFO)
    logger.addHandler(command_handler)  # 调用记录器的addHandler()方法添加显式管理对象

    file_handler = logging.FileHandler('./log/{}.log'.format(args.network))  # 在指定目录下保存train.log
    file_handler.setLevel(logging.INFO)
    logger.addHandler(file_handler)  # 添加文件管理对象

    # formatter = logging.Formatter('%(asctime)s - %(module)s.%(funcName)s.%(lineno)d - %(levelname)s - %(message)s')
    # file_handler.setFormatter(formatter)
    # command_handler.setFormatter(formatter)

    # logger.info(args)  # 调用记录器的info()方法,将日志打印并保存
    # 记录一条日志
    return logger.info(args)


def main():
    # time.sleep(3600*6.5)
    global args
    args = parse_args()
    logger_info(args)
    # print(args)
    train_net(args)

if __name__ == '__main__':
    main()
  • 建立debug日志
def logger_info():  # 建立日志
    logger = logging.getLogger()  # 用getLogger()方法得到一个日志记录器
    # logger.setLevel(logging.INFO)  # 用setLevel()方法设置日志级别,logging.INFO代表代码正常运行时的日志
    logger.setLevel(logging.DEBUG)   #设置成debug模式
    
    command_handler = logging.StreamHandler()  # 显示日志:用logging.StreamHandler()得到一个显示管理对象
    command_handler.setLevel(logging.DEBUG)  
    logger.addHandler(command_handler)  # 调用记录器的addHandler()方法添加显式管理对象
    
    file_handler = logging.FileHandler('./debug.log')  # 在指定目录下保存train.log
    file_handler.setLevel(logging.DEBUG)
    logger.addHandler(file_handler)  # 添加文件管理对象
    
    formatter = logging.Formatter('%(asctime)s - %(module)s.%(funcName)s.%(lineno)d - %(levelname)s - %(message)s')  
    file_handler.setFormatter(formatter)  
    command_handler.setFormatter(formatter)  
    
    # logger.info(args)  # 调用记录器的info()方法,将日志打印并保存
        # 记录一条日志
    return logger
try:
    raise Exception('time out')
except:    
    logger = logger_info()
    logger.exception("Exception Logged")

你可能感兴趣的:(程序·)