日志是一种可以追踪软件运行时所发生事件的方法,事件有严重性级别(level)。
logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会导致日志级别的混乱。
日志等级(level) 描述:
DEBUG 最详细的日志信息,典型应用场景是 问题诊断
INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
上面日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的。
logging模块提供了两种记录日志的方式:
其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
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()
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")