logging模块的通用配置
方式一:打印到终端(不在乎编码)
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
# format格式是自定义的,%(asctime)s 这个是死的,你可以外面加空格 中划线 或者大括号都可以
# 加成什么样子就会以什么样子显示
datefmt='%a, %d %b %Y %H:%M:%S', # Mon, 16 Jul 2018 16:29:20 test.py[line:36] INFO
# filename='log/log.txt', # 日志打印到的文件
# filemode='w+'
)
logger_root = logging.getLogger("")
方式二:需要设置编码,且只能输出到文件
# 这种方式多了一个utf-8方式编码日志文件
filehandler = logging.FileHandler(filename='./log/log.txt',encoding="utf-8")
fmter = logging.Formatter(fmt="%(asctime)s [%(levelname)s] %(pathname)s-%(lineno)d %(message)s",datefmt="%Y-%m-%d %H:%M:%S")
filehandler.setFormatter(fmter)
logger_root = logging.getLogger('')
logger_root.addHandler(filehandler)
logger_root.setLevel(level=logging.DEBUG)
方式三:切割日志
"""
# 这种方式是每天切换一个日志文件,防止日志文件过大
# 如果想要根据大小分割,使用
# hdlr = logging.handlers.RotatingFileHandler(LOG_FILE,maxBytes=1024*1024,backupCount=40)
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
)
fmter = logging.Formatter(fmt="%(asctime)s [%(levelname)s] %(pathname)s-%(lineno)d %(message)s",
datefmt="%Y-%m-%d %H:%M:%S")
filehandler = handlers.TimedRotatingFileHandler("./log/log.txt", when='D', interval=1, backupCount=30)
filehandler.setFormatter(fmter)
logger_root = logging.getLogger("")
logger_root.addHandler(filehandler)
"""
# 这下面是测试,协程模式下也可以使用
import logging
from logging import handlers
import time
import gevent
from gevent.queue import Queue
from gevent import monkey
monkey.patch_all()
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', # Mon, 16 Jul 2018 16:29:20 test.py[line:36] INFO
)
filehandler = handlers.TimedRotatingFileHandler("./log/log.txt", when='S', interval=3, backupCount=20)
fmter = logging.Formatter(fmt="%(asctime)s [%(levelname)s] %(pathname)s-%(lineno)d %(message)s",
datefmt="%Y-%m-%d %H:%M:%S")
filehandler.setFormatter(fmter)
logger_root = logging.getLogger("")
logger_root.addHandler(filehandler)
q1 = Queue()
for i in range(100):
q1.put_nowait(i)
def run():
while not q1.empty():
logger_root.info(q1.get_nowait())
gevent.sleep(0.5)
for i in range(3):
gevent.joinall([
gevent.spawn(run)
])
logger_root.info("game over")
通用配置的讲解
asctime : %(asctime)s 易读的时间格式: 默认情况下是'2003-07-08 16:49:45,896'的形式(逗号之后的数字是毫秒部分的时间)
filename: %(filename)s 路径名的文件名部分。
funcName :%(funcName)s 日志调用所在的函数名
levelname %(levelname)s 消息的级别名称('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').
levelno %(levelno)s 对应数字格式的日志级别 (DEBUG, INFO, WARNING, ERROR,CRITICAL).
lineno %(lineno)d 发出日志记录调用的源码行号 (如果可用)。
module %(module)s 所在的模块名(如test6.py模块则记录test6)
message %(message)s 记录的信息
name %(name)s 调用的logger记录器的名称
process %(process)d 进程ID
processName %(processName)s 进程名
thread %(thread)d 线程ID
threadName %(threadName)s 线程名