简单使用
import logging
logging.basicConfig(
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s',
level=logging.DEBUG
# datefmt='%Y-%m-%d %H:%M:%S', # 时间格式
# handlers=[logging.FileHandler(logpath, encoding='utf-8')] # 指定文件编码
# handlers=[logging.handlers.TimedRotatingFileHandler(logpath, when='M', backupCount=5, encoding='utf-8')] # 按分钟分割日志, 保留5分历史
)
logging.info('info message')
日志分割
按天分割, 保留5份历史日志
import logging
import logging.handlers
SCRIPTNAME = os.path.basename(__file__).split('.')[0]
LOGDIR = "/var/log"
if not os.path.isdir(LOGDIR):
os.makedirs(LOGDIR)
LOG_FILE = os.path.join(LOGDIR, SCRIPTNAME)
logger = logging.getLogger(SCRIPTNAME)
logger.setLevel(logging.INFO)
timefilehandler = logging.handlers.TimedRotatingFileHandler(LOG_FILE, when='D', backupCount=5, encoding='utf-8')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s')
timefilehandler.setFormatter(formatter)
logger.addHandler(timefilehandler)
logger.info("This is the log")
日志等级(level)
logging.warn('error message') 弃用
logging.debug('debug message')
logging.info('info message')
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')
# 特殊的用法
logging.log(level, 'log message')
# level ==logging.DEBUG, logging.INFO, ...
basicConfig 的参数
filename:即日志输出的文件名,如果指定了这个信息之后,实际上会启用 FileHandler,而不再是 StreamHandler,这样日志信息便会输出到文件中了。
filemode:这个是指定日志文件的写入方式,有两种形式,一种是 w,一种是 a(默认),分别代表清除后写入和追加写入。
format:指定日志信息的输出格式,即上文示例所示的参数,部分参数如下所示:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息
datefmt:指定时间的输出格式。
style:如果 format 参数指定了,这个参数就可以指定格式化时的占位符风格,如 %、{、$ 等。
level:指定日志输出的类别,程序会输出大于等于此级别的信息。
stream:在没有指定 filename 的时候会默认使用 StreamHandler,这时 stream 可以指定初始化的文件流。
handlers:可以指定日志处理时所使用的 Handlers,必须是可迭代的。
错误输出案例
try:
result = 5 / 0
except Exception as e:
# bad
logging.error('Error: %s', e)
# good
logging.error('Error', exc_info=True) # 使用这个方式
# good
logging.exception('Error') # 或者 使用这个方式
日志分割 其他
import logging
from logging.handlers import RotatingFileHandler # 按大小分割
from logging.handlers import TimedRotatingFileHandler # 按时间分割
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# 文件大小
#Rthandler = RotatingFileHandler(LOG_FILE, maxBytes=1024 * 1024, backupCount=5, encoding='utf-8') # encoding='utf-8' ,不指定中文乱码
# 时间分割
# pyhton2 encoding='utf-8' 报错, 不能加
Rthandler = TimedRotatingFileHandler('message.log', when='D',backupCount=5, encoding='utf-8') # python3 encoding='utf-8' ,不指定中文乱码
# Rthandler.suffix = '%Y-%m-%d_%H-%M' # 日志分割格式 # message.log.2018-10-12_14-44
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s', '%Y-%m-%d %H:%M:%S')
Rthandler.setFormatter(formatter)
logger.addHandler(Rthandler)
按大小分割
官网 https://docs.python.org/3.6/library/logging.handlers.html#rotatingfilehandler
logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)
filename 日志文件名
mode 写入方式
maxBytes 指定大小, 超过这个大小后自动分割
backupCount 分割文件备份数 格式 log.log.1, log.log.2,.....
encoding 日志文件编码
delay If *delay* is true, then file opening is deferred until the first call to emit(). By default, the file grows indefinitely.
按时间分割
官网 https://docs.python.org/3.6/library/logging.handlers.html#timedrotatingfilehandler
logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)
filename 日志文件名
when 日志分割时间请查看下列表格
when 时间分割指定表
Value | Type of interval | If/how atTime is used |
---|---|---|
'S' | Seconds | Ignored |
'M' | Minutes | Ignored |
'H' | Hours | Ignored |
'D' | Days | Ignored |
'W0'-'W6' | Weekday (0=Monday) | Used to compute initial rollover time |
'midnight' | Roll over at midnight, if atTime not specified, else at time atTime | Used to compute initial rollover time |
网友评论