logging不打印

关键在于设置根logger的logging的级别,要在一开始设定g

# 关键!!
logging.basicConfig(level=logging.DEBUG)
# 或者下面这个
logging.getLogger().setLevel(logging.DEBUG)

基本的场景

参考

Logging Cookbook

一些基本的操作/概念:

  1. logger才有.info, .error等命令,具体来说,logging.info, logging.error等都是调用默认的logger输出,获取新的logger可以通过logging.getLogger
  2. logger设定的级别是指超过该级别的才会被输出到logger对应的输出流中,比如logger设定的level是logging.INFO,那么logging.debug的信息并不会被看到
  3. 同一个logger可以设定不同的输出流(通过logger.addHandlerHandler),输出到不同位置
  4. Handler里面设置的级别同样是用于过滤信息的,这么做就可以实现不同级别的信息输出到不同的地方

同时打印到console和文件中

if not os.path.exists('./logs/'):
    os.makedirs('./logs')
# 输出到文件
fh = logging.FileHandler('./logs/logs_per_day.log', mode='w')
fh.setLevel(logging.DEBUG)
# 输出到控制台
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
logger = logging.getLogger('logs')
logger.addHandler(fh)
logger.addHandler(console)

设定不同的logger,输出不同的信息

下面第一个logger主要用于主要的输出,第二个logger则用于记录和jobid相关的信息


if not os.path.exists('./logs/'):
    os.makedirs('./logs')
fh = logging.FileHandler('./logs/logs_per_day.log', mode='w')
fh.setLevel(logging.DEBUG)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
logger = logging.getLogger('logs')
logger.addHandler(fh)
logger.addHandler(console)

job_logger = logging.getLogger('task_jobid_csv')
job_logger.setLevel(logging.DEBUG)
fh2 = logging.FileHandler('./res/logs/task_jobid_csv.log', mode='w')
fh2.setLevel(logging.DEBUG)
job_logger.addHandler(fh2)

设置输出log的格式

LogRecord attributes

fmttr = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh = logging.FileHandler('./local_logs', mode='w')
fh.setLevel(logging.DEBUG)
fh.setFormatter(fmttr)

console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
console.setFormatter(fmttr)

logger = logging.getLogger('logs')
logger.addHandler(fh)
logger.addHandler(console)
logger.setLevel(logging.DEBUG)

FileHandler用完后需要关闭(release)

有两种方法:

  1. https://stackoverflow.com/a/15474586
handlers = self.log.handlers[:]
for handler in handlers:
    handler.close()
    self.log.removeHandler(handler)
  1. logger.shutdown(),直接关闭所有logging