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

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日志系统的四大组件

在这里插入图片描述
其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
在这里插入图片描述

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")
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python logger 是一个内置的日志记录模块,它可以帮助我们在程序中记录和管理日志信息。使用 Python logger,我们可以将程序的运行状态、错误信息等输出到日志文件或者控制台。 要使用 Python logger,我们首先需要导入 logging 模块。然后,我们可以创建一个 logger 对象,并设置它的日志级别、输出格式等属性。接下来,我们可以使用 logger 对象进行日志记录,包括调用不同级别的方法,如 debug、info、warning、error 等。 下面是一个简单的示例: ```python import logging # 创建一个 logger 对象 logger = logging.getLogger('my_logger') # 设置日志级别 logger.setLevel(logging.DEBUG) # 创建一个文件处理器 file_handler = logging.FileHandler('my_log.log') # 设置文件处理器的日志级别 file_handler.setLevel(logging.DEBUG) # 创建一个控制台处理器 console_handler = logging.StreamHandler() # 设置控制台处理器的日志级别 console_handler.setLevel(logging.INFO) # 创建一个日志格式器 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 设置文件处理器和控制台处理器的格式化器 file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) # 将处理器添加到 logger 对象中 logger.addHandler(file_handler) logger.addHandler(console_handler) # 记录日志 logger.debug('This is a debug message') logger.info('This is an info message') logger.warning('This is a warning message') logger.error('This is an error message') ``` 在上面的示例中,我们创建了一个名为 'my_logger' 的 logger 对象,并设置了它的日志级别为 DEBUG。然后,我们创建了一个文件处理器和一个控制台处理器,并设置它们的日志级别分别为 DEBUG 和 INFO。接着,我们创建了一个日志格式器,并将它设置给文件处理器和控制台处理器。最后,我们使用 logger 对象记录了不同级别的日志信息。 通过使用 Python logger,我们可以更好地跟踪程序的运行状态和调试信息,从而方便地进行错误排查和日志分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值