@nemos
2017-05-05T15:16:21.000000Z
字数 3807
阅读 797
py
import logging
import sys
# 获取logger实例,如果参数为空则返回root logger
logger = logging.getLogger("AppName")
# 指定logger输出格式
formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
# 文件日志
file_handler = logging.FileHandler("test.log")
file_handler.setFormatter(formatter) # 可以通过setFormatter指定输出格式
# 控制台日志
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter # 也可以直接给formatter赋值
# 为logger添加的日志处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 指定日志的最低输出级别,默认为WARN级别
logger.setLevel(logging.INFO)
# 输出不同级别的log
logger.debug('this is debug info')
logger.info('this is information')
logger.warn('this is warning message')
logger.error('this is error message')
logger.fatal('this is fatal message, it is same as logger.critical')
logger.critical('this is critical message')
# 2016-10-08 21:59:19,493 INFO : this is information
# 2016-10-08 21:59:19,493 WARNING : this is warning message
# 2016-10-08 21:59:19,493 ERROR : this is error message
# 2016-10-08 21:59:19,493 CRITICAL: this is fatal message, it is same as logger.critical
# 2016-10-08 21:59:19,493 CRITICAL: this is critical message
# 异常捕获
try:
1 / 0
except:
# 等同于error级别,但是会额外记录当前抛出的异常堆栈信息
logger.exception('this is an exception message')
# 2016-10-08 21:59:19,493 ERROR : this is an exception message
# Traceback (most recent call last):
# File "D:/Git/py_labs/demo/use_logging.py", line 45, in
# 1 / 0
# ZeroDivisionError: integer division or modulo by zero
输出日志的对象,为单例
logger = logging.getLogger('name') # 获得实例
logger.setLevel(logging.INFO)#指定最低的日志级别
logger.addFilter()
logger.removeFilter()
logger.addHandler()
logger.removeHandler()
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
logger.log('debug', 'This is a bug') # 数直接输出内容并选择对应的告警级别
对log进行分发
handler = logging.FileHandler("test.log")
handler.setLevel()
handler.setFormatter()
handler.addFilter()
handler.removeFilter()
类型 | 说明 |
---|---|
logging.StreamHandler([stream]) |
参数默认是sys.stderr ,向任意流中输出log |
logging.FileHandler(filename[,mode]) |
mode 为打开方式。默认为a ,向一个文件输出日志。 |
logging.handlers.RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]]) |
可以管理文件大小,文件大小超过一定值,新建文件继续 |
logging.handlers.TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]]) |
间隔时间自动创建新文件 |
logging.handlers.SocketHandler(host, port) |
TCP |
logging.handlers.DatagramHandler(host, port) |
UDP |
logging.handlers.SysLogHandler |
|
logging.handlers.NTEventLogHandler |
|
logging.handlers.SMTPHandler |
|
logging.handlers.MemoryHandler |
|
logging.handlers.HTTPHandler |
输出格式
formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
参数 | 说明 |
---|---|
%(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 |
用户输出的消息 |
在handler之上提供粒度判断
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='[%Y-%m_%d %H:%M:%S]',
filename='../log/my.log',
filemode='a')
logging.config.fileConfig(log_conf_file)
##############################################
[loggers]
keys=root, log02
[logger_root]
level=INFO
handlers=handler01
[logger_log02]
level=DEBUG
handler=handler02
qualname=log02
##############################################
[handlers]
keys=handler01,handler02
[handler_handler01]
class=FileHandler
level=INFO
formatter=form01
args=('../log/cv_parser_gm_server.log',"a")
[handler_handler02]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)
##############################################
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(process)d %(message)s
datefmt=[%Y-%m-%d %H:%M:%S]
[formatter_form02]
format=(message)s
##############################################