1、模块级别
默认情况下logging模块将日志打印到了标准输出,且只显示了级别大于等于warning的日志信息,所以它的默认级别是warning.
日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
#!/usr/bin/env python# _*_ coding: utf-8 _*_# __author__ ='kong'import loggingimport time # 日志的输出级别print logging.NOTSETprint logging.DEBUG print logging.INFOprint logging.WARNINGprint logging.ERRORprint logging.CRITICALtime.sleep(1)logging.debug("debug message")# 默认的日志输出级别logging.warn("warn message")logging.error("error message")logging.critical("critical message")
输出
2、logging.basicConfi([**kwargs])
语法:
def basicConfig(**kwargs): """ Do basic configuration for the logging system. This function does nothing if the root logger already has handlers configured. It is a convenience method intended for use by simple scripts to do one-shot configuration of the logging package. The default behaviour is to create a StreamHandler which writes to sys.stderr, set a formatter using the BASIC_FORMAT format string, and add the handler to the root logger. A number of optional keyword arguments may be specified, which can alter the default behaviour. filename Specifies that a FileHandler be created, using the specified filename, rather than a StreamHandler. filemode Specifies the mode to open the file, if filename is specified (if filemode is unspecified, it defaults to 'a'). format Use the specified format string for the handler. datefmt Use the specified date/time format. level Set the root logger level to the specified level. stream Use the specified stream to initialize the StreamHandler. Note that this argument is incompatible with 'filename' - if both are present, 'stream' is ignored. Note that you could specify a stream created using open(filename, mode) rather than passing the filename and mode in. However, it should be remembered that StreamHandler does not close its stream (since it may be using sys.stdout or sys.stderr), whereas FileHandler closes its stream when the handler is closed. """
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为.
可用的参数: filename: 用指定的文件名创建FileHandler,这样日志会被存储在指定的文件中 filemode:文件打开的方式,在指定了filename时使用,默认值为a format:指定handler使用的日志显示格式 datefmt:指定日期时间格式 level:设置rootlogger的日志级别 stream:用指定的stream创建StreamHandler,可指定输出到sys.stderr,sys.stdout或者文件,默认sys.stderr format参数可能用到的格式化串: %(name)s:Logger的名字 %(levelno)s:数字形式的日志级别 %(levelname)s:文本形式的日志级别 %(pathname)s:调用日志输出函数的模块的文件名 %(module)s:调用日志输出函数的模块名 %(funcName)s:调用日志输出函数的函数名 %(lineno)d:调用日志输出函数的语句所在的代码行 %(created)f:当前时间,用UNIX标准的表示 时间的浮点数表示 %(relativeCreated)d:输出日志信息时,自Logger创建以来的毫秒数 %(asctime)s:字符串形式的当前时间。默认格式2003-07-12 16:23:26,345 %(thread)d:线程ID %(threadName)s:线程名 %(process)d:进程ID %(message)s:用户输出的消息
datefmt格式: %Y:年份的长格式,1999 %y:年份的短格式,99 %m:月份 01-12 %d:日期,01-31 %H:小时,0-23 %M:分钟,00-59 %S:秒,00-59
基本用法示例代码:
#!/usr/bin/env python# _*_ coding: utf-8 _*_# __author__ ='kong'import loggingclass TestLogging(object): def __init__(self): logFormat = '%(asctime) -12s %(levelname) -8s %(name) -10s %(message) -12s' logFileName = './testLog.txt' logging.basicConfig(level = logging.INFO,format=logFormat,filename=logFileName,filemode='w') logging.debug("debug message") logging.info("info message") logging.error("error message") logging.critical("critical message")if __name__ == '__main__': T = TestLogging()结果:2017-01-15 12:26:42,424 INFO root info message2017-01-15 12:26:42,424 ERROR root error message2017-01-15 12:26:42,424 CRITICAL root critical message
自定义模块myLog
#!/usr/bin/env python # _*_ coding: utf-8 _*_ # __author__ ='kong' import logging import getpass import sys class MyLog(object): def __init__(self): # 为当前用户创建日志实例,设置默认日志级别 user = getpass.getuser() self.logger = logging.getLogger(user) self.logger.setLevel(logging.DEBUG) Formatter = logging.Formatter('%(asctime) -12s %(levelname) -8s %(name) -10s %(message) -12s') """ Initialize the formatter with specified format strings. Initialize the formatter either with the specified format string, or a default as described above. Allow for specialized date formatting with the optional datefmt argument (if omitted, you get the ISO8601 format). """ # 创建文件句柄,设置日志格式、日志级别 logFile = './' + sys.argv[0][0:3] + '.log' logHand = logging.FileHandler(logFile) logHand.setLevel(logging.ERROR) # 错误级别以上信息才会写到文件中 logHand.setFormatter(Formatter) """ Set the formatter for this handler. """ # 创建stream句柄,设置日志格式 logHandSt = logging.StreamHandler() logHandSt.setFormatter(Formatter) # 应用文件句柄和stream句柄,来处理日志 self.logger.addHandler(logHand) self.logger.addHandler(logHandSt) logging.basicConfig() def debug(self,msg): self.logger.debug(msg) def info(self,msg): self.logger.info(msg) def warn(self,msg): self.logger.warn(msg) def error(self,msg): self.logger.error(msg) def critical(self,msg): self.logger.critical(msg) if __name__ == '__main__': T = MyLog() T.debug("debug message") T.info("info message") T.warn("warn message") T.error("error message") T.critical("crital message")
详见:
http://blog.csdn.net/zyz511919766/article/details/25136485/
http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html
示例参考:
#!/usr/bin/env python# _*_ coding:utf-8 _*_import logging.configimport datetimeimport os# 基路径BaseDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 时间模块ToDay = datetime.date.today()YsDay = ToDay - datetime.timedelta(days=1)ToDay = ToDay.strftime('%Y-%m-%d')YsDay = YsDay.strftime('%Y-%m-%d')# 创建日志目录logdir = os.path.join(BaseDir,'log',ToDay)if not os.path.exists(logdir):os.makedirs(logdir)# 定义三种日志输出格式standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ '[%(levelname)s][%(message)s]'simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'def log_handle(logname='default'): LOG_PATH = os.path.join(logdir, logname + '.log') # 日志文件名称 LOGGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': standard_format }, 'simple': { 'format': simple_format }, 'id_simple': { 'format': id_simple_format }, }, 'filters': {}, 'handlers': { # 打印到终端的日志 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': 'simple' }, # 打印到文件的日志,收集info及以上的日志 'collect': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 'formatter': 'simple', 'filename': LOG_PATH, # 日志文件 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M 'backupCount': 5, 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, }, 'loggers': { '': { 'handlers': ['console', 'collect'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': False, # 向上(更高level的logger)传递 }, }, } logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的 log 配置 logger = logging.getLogger() # 生成一个log实例 return logger