import logging
from logging import handlers
"""
logging模块记录日志涉及4个主要类。
1. logger提供了应用程序可以直接使用的接口
2. handler将(logger创建的)日志记录发送到合适的目的输出
3. filter提供了细度设备来决定输出哪条日志记录
4. formatter决定日志记录的最终输出格式
Logger对象
logger = logging.getLogger('mysql') ==> filter过滤日志
Handler ==>屏幕输出
StreamHandler() 屏幕输出 ==> logging.Formatter('%(asctime)-%(name)s-%(levelname)s-%(message)s')
FileHandler('mysql.log') 输出至指定文件 ==> logging.Formatter('%(asctime)s-%(name)s-%(lineno)d-%(message)s')
LOG = logging.getLogger('chat.gui')
核心模块:
LOG = logging.getLogger("chat,kernel')
还可以绑定 handler 和 filters
Logger.setLevel(lel):设置日志级别 和 baseConfig(level=日志级别)或者(%(levelename)s)
Logger.addFilter(filt) Logger.removeFileter(filt) 添加或者删除指定的filter
Logger.addHandler(hdlr) Logger.removeHandler(hdlr) 增加或者删除指定的handler
Logger.debug() Logger.info() Logger.warning() Logger.error() Logger.critical()日志级别
Handler对象负责发送相关的信息到指定目的地
Handler.setLevel(lev) 指定处理的信息级别,低于的忽略
Handler.setFormatter() 给这个handler选择模式
Handler.addFilter(filt) Handler.removeFilter(filt) 增加或者删除一个filter对象
"""
"""
formatter 组件
fh = logging.FileHandler('access.log')
formatter = logging.formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
fh.setFormatter(formatter) 把formatter绑定到fh上
"""
"""
filter组件
class IgFilter(logging.Filter):
def filter(self,record):
return "db backup" not in record.getMessage()
"""
# logging.warning("user [alex] attempted wrong password more than 3 times")
# logging.critical("server is down") #默认用户为root执行
# logging.basicConfig(filename='log_test.log', level=logging.INFO) # 只输入INFO以及比INFO级别更高的日志
#
# logging.debug('This message should go to the log file')
# logging.info('So should this')
# logging.warning("and this,too")
# 以上日志缺少了时间,你发现了吗?
logging.basicConfig(filename='log_test.log',
level=logging.INFO,
format='%(asctime)s-%(levelname)s:%(filename)s:%(funcName)s:%(lineno)d:%(process)d:%(message)s', # format 确认日志信息格式
datefmt='%Y%m/%d %I:%M:%S %p') # 确认事件发生的时间
def sayhi():
logging.error("from sayhi.....")
sayhi()
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning("and this,too")
class IgFilter(logging.Filter):
def filter(self, record):
return "db backup" not in record.getMessage() # 判断信息是否存在于message 过滤!
# 1生成logging对象
logger = logging.getLogger('web')
logger.setLevel(logging.DEBUG) # 设置日志级别 全局 全局默认为 warning
# 1.1 把filter对象添加到logger中
logger.addFilter(IgFilter())
# 2.生成handler对象
ch = logging.StreamHandler() # ==>生成到操作台
# ch.setLevel(logging.INFO) # 输出到屏幕级别INFO
# fh = logging.FileHandler('web.log') # ==>>生成到文件
#fh = handlers.RotatingFileHandler("web.log",maxBytes=10, backupCount=3) #自动文件截断 按文件大小
fh = handlers.TimedRotatingFileHandler('web.log',when="S",interval=5,backupCount=3) #按时间间隔来文件截断
# fh.setLevel(logging.WARNING) # 输出到文件为 warning
# 2.1 把handler对象绑定到logger
logger.addHandler(ch)
logger.addHandler(fh)
# 3. 生成formatter对象
# 3.1 把formatter对象绑定到handler对象
file_formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
console_formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(lineno)d-%(message)s')
ch.setFormatter(console_formatter)
fh.setFormatter(file_formatter)
logger.warning("test log")
logger.info("test log2")
logger.debug("test log3")
logger.debug("test log db backup 3")
# 输出
# 2018-08-14 00:18:49,915-web-WARNING-26-test log
# 2018-08-14 00:18:49,915-web-INFO-27-test log2
# 全局设置为DEBUG后,console handler 设置为INFO 如果输出了的日志级别是debug,那就不会再屏幕上输出