logging模块
日志级别:debug<info<warning<error<critical
# 默认日志级别为warning
简单将日志打印到屏幕
>>> logging.debug('test debug') >>> logging.info('test info') >>> logging.warning('test warning') WARNING:root:test warning >>> logging.error('test error') ERROR:root:test error >>> logging.critical('test critical') CRITICAL:root:test critical
通过logging.basicConfig()方法 自定义日志输入位置,日志格式,级别等
logging.basicConfig()可通过具体参数来更改logging模块默认行为,参数: filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。format 参数中有 asctime 的话,需要使用 datefmt 指定格式 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。 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用户输出的消息
#日志输入到屏幕 import logging logging.basicConfig( level=logging.WARNING, format='%(asctime)s 【%(name)s】 %(filename)s %(levelname)s %(message)s ', datefmt = "%Y/%m/%d %H:%M:%S", ) logger = logging.getLogger(__name__) #format里面的name打印的就是这里定义的Logger logger.info('test info') logger.warning('test warning') logger.error('test error') #控制台结果: 2018/11/28 18:04:25 【__main__】 test.py WARNING test warning 2018/11/28 18:04:25 【__main__】 test.py ERROR test error # 把日志输入到文件 import logging logging.basicConfig(filename='test.log', filemode='w', level=logging.WARNING, format='%(asctime)s %(filename)s %(levelname)s %(message)s ', datefmt = "%Y/%m/%d %H:%M:%S", ) logging.info('test info') logging.warning('test warning') logging.error('test error') #结果:test.log: 2018/11/28 16:05:19 test.py WARNING test warning 2018/11/28 16:05:19 test.py ERROR test error
- logger 提供应用程序可以调用的接口
- handler 把logger创建的日志输出到合适的目标
- filter 过滤 选择什么日志应该输出
- formatter 指定日志输出格式
把日志同时输出到屏幕和文件里
# 步骤:
- 创建logger
- 创建handler
- 定义formatter
- 给handler添加formatter
- 给logger添加handler
import logging #创建logger logger = logging.getLogger("LOGGER") logger.setLevel(logging.WARNING) #可以在logger或者hanndler设置日志级别。全谁的level高就使用谁的 #创建一个handler(输出到控制台的) console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) #被全局覆盖 #创建一个handler(输出到文件的) file_handler = logging.FileHandler('test.log') file_handler.setLevel(logging.ERROR) # 没有被覆盖 #创建formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #给handler添加Formatter console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 给logger添加handler logger.addHandler(console_handler) logger.addHandler(file_handler) logger.debug('test debug') logger.info('test info') logger.warning('test warning') logger.error('test error') logger.critical('test critical')
handler
StreamHandler 日志输出到流,可以是sys.stderr,sys.stdout或者文件
#日志信息会输出到指定的stream中,如果stream为空则默认输出到sys.stderr。 class logging.StreamHandler(stream=None)
FileHandler 日志输出到文件
class logging.FileHandler(filename,mode ='a',encoding = None,delay = False ) #模式默认为append,delay为true时,文件直到emit方法被执行才会打开。默认情况下,日志文件可以无限增大
BaseRotatingHandler 基本的日志切割方式,RotatingFileHandler和TimeRotatingHandler两个类继承此类
RotatingFileHandler 日志输出到文件,并且当文件达到一定大小时,会产生新文件
class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0) #参数maxBytes和backupCount, 当日志文件size大于等于maxBytes时,就会新创建一个日志文件。backupcount是文件数目。 例如maxBytes=1024,backupCount=3时, 日志app.log如果达到1024,则会产生另外三个文件app.log.1,app.log.2,app.log.3。当这两个参数中间任一个为0时,都不会发生rollover
TimeRotatingHandler 日志rollover方式,间隔一段时间就自动创建新的文件
logging.handlers.TimedRotatingFileHandler(filename,when='h',interval=1,backupCount=0,encoding=No,nedelay=False,utc=False,atTime=None) # when参数可以指定时间间隔的单位,不区分大小写。 S 秒 M 分 H 小时 D 天 'W0'-'W6' 星期 ('W0'星期一,...'W6'星期天) midnight 每天凌晨
# interval 指定时间间隔
SocketHandler 远程输出日志到TCP/IP sockets
DatagramHandler 远程输出日志到UDP sockets
SMTPHandler 远程输出日志到邮件地址
SysLogHandler 日志输出到syslog
NTEventLogHandler 远程输出日志到Windows NT/2000/XP的事件日志
MemoryHandler 日志输出到内存中的指定buffer
HTTPHandler 通过"GET"或者"POST"远程输出到HTTP服务器
以字典的方式配置
使用 logging.config模块
把字典传给logging.config.dictConfig(): logging.config.dictConfig(DIC_CONFIG)
字典配置 必须包含的键: version 目前唯一有效值为1 可选的键有: formatters filters handlers: class(必选) level(可选) formatter(可选) filters(可选) loggers: level(可选) propagate(可选) filters(可选) handlers(可选) root: root logger配置,配置和logger配置一样,但是没有propagate配置不适用 incremental: 默认False。如果为True,表示增量配置 disable_existing_loggers: 默认为True。是否要禁用现有的logger
示例:
import logging.config
DIC_CONFIG = {
"version":1,
#设置formatter
"formatters":{
"simple":{
"format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
},
"standard":{
"format":"%(asctime)s - %(threadName)s:%(thread)s - %(name)s - %(filename)s - %(levelname)s - %(message)s"
}
},
"handlers":{
#打印到终端的handler
"console":{
"class":"logging.StreamHandler", #输出到屏幕的handler类型
"level":"DEBUG",
"formatter":"simple", #给handler添加formatter
},
#打印到文件的handler
"file_handler":{
"class":"logging.handlers.RotatingFileHandler", #输出到文件的handler类型
"level":"INFO",
"formatter":"standard", #给handler添加formatter
"filename":"access.log",
"maxBytes":1024*1024*8, #当文件大于等于这个值时,产生3个文件
"backupCount":3,
"encoding":"utf8"
},
#错误日志输出到另一个文件
"error_file_handler":{
"class":"logging.handlers.RotatingFileHandler",
"level":"ERROR",
"formatter":"standard",
"filename":"errors.log",
"maxBytes":1024*1024*3,
"backupCount":3,
"encoding":"utf8"
}
},
"loggers":{
"my_logger":{
"level":"DEBUG",
"handlers":["console","file_handler","error_file_handler"], #将handler添加到logger
"propagate":True
}
},
"root":{ #可以不写
"level":"INFO",
"handlers":["console","file_handler","error_file_handler"]
},
"disable_existing_loggers":False, #不禁用现有的loggers
}
logging.config.dictConfig(DIC_CONFIG)
logger = logging.getLogger(__name__) # 生成一个log实例
logging.info("hi")