#!/usr/bin/env python # encoding: utf-8 import logging #定义handler的输出格式 formatter=logging.Formatter(‘%(asctime)s--%(name)s--%(filename)s--%(message)s‘) #创建一个handler,用于写入日志文件,只输出debug级别以上的日志 fh=logging.FileHandler(‘test.log‘) fh.setFormatter(formatter) #再创建一个handler,用于输出到控制台 ch=logging.StreamHandler() ch.setFormatter(formatter) #创建一个logging命名为mylogger,%(name)s可调用这个名字 logger=logging.getLogger(‘mylogger‘) logger.setLevel(logging.DEBUG) #给logger添加handler logger.addHandler(fh) logger.addHandler(ch) #记录两条日志 logger.info(‘foorbar‘) logger.debug(‘just a test‘) [[email protected] ~/Documents/python/reboot]$ python loggers.py 2017-03-01 15:21:22,434--mylogger--loggers.py--foorbar 2017-03-01 15:21:22,435--mylogger--loggers.py--just a test
Logging Formatter的参数:
- %(name)s Name of the logger (logging channel)
- %(levelno)s Numeric logging level for the message (DEBUG, INFO, WARNING, ERROR, CRITICAL)
- %(levelname)s Text logging level for the message ("DEBUG", "INFO" "WARNING", "ERROR", "CRITICAL")
- %(pathname)s Full pathname of the source file where the logging call was issued (if available)
- %(filename)s Filename portion of pathname
- %(module)s Module (name portion of filename)
- %(lineno)d Source line number where the logging call was issued (if available)
- %(funcName)s Function name
- %(created)f Time when the LogRecord was created (time.time() return value)
- %(asctime)s Textual time when the LogRecord was created
- %(msecs)d Millisecond portion of the creation time
- %(relativeCreated)d Time in milliseconds when the LogRecord was created, relative to the time the logging module was loaded (typically at application startup time)
- %(thread)d Thread ID (if available)
- %(threadName)s Thread name (if available)
- %(process)d Process ID (if available)
- %(message)s The result of record.getMessage(), computed just as the record is emitted
function 封装logging日志调用
loggers.py中封装log日志 调用。内容如下:
import loggingdef InitLogger(filename,level,name): #create a logging object logger = logging.getLogger() logger.setLevel(level) #format log file formatter = logging.Formatter(‘%(asctime)s %(name)s-%(levelname)s-%(filename)s-[line:%(lineno)s]: %(message)s‘) #create the logging file handler and format the log file fh = logging.FileHandler(filename,mode=‘a+‘) fh.setFormatter(formatter) #create logging print Stream ch = logging.StreamHandler() ch.setFormatter(formatter) #logger object load the hander logger.addHandler(fh) logger.addHandler(ch) return logger
调用日志:
import loggers,logging logger=loggers.InitLogger(‘./testfile.log‘,logging.INFO,‘test‘) logger.info("print info level log one line")
查看testfile.log日志文件
[[email protected] ~/Documents/python/reboot]$ cat testfile.log 2017-03-01 15:45:15,974 root-INFO-sys.py-[line:6]: print info level log one line
方法二:Basic Demo
#filename:Loggers.py def LoggingDemo(): InitLogging(‘./test.log‘) logging.debug("this is debug message") logging.info("this is info message") logging.warning("this is warning message") logging.error("this is error message") def InitLogging(logfilename): logging.basicConfig(level=logging.DEBUG, format=‘%(asctime)s %(name)s-%(levelname)s-%(filename)s-[line:%(lineno)s]: %(message)s‘, datefmt=logfilename, filemode=‘w‘, filename=logfilename ); if __name__==‘__main__‘: LoggingDemo()
basicConfig参数:
- 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.
调用:
#!/usr/bin/env python # encoding: utf-8 import loggers,logging loggers.LoggingDemo()
推荐使用方式:
import logging,logging.handlers ‘‘‘ 思路 1,通过函数,实例化一个LOGGER对象 2,函数实例化logger对象后,并对对象座位返回值,即return logger 3,其他模块直接调用模块中的函数即可,简单方便 ‘‘‘ #定义写日志的函数,返回一个实例化的logger对象,直接配置logger参数的形式 def WriteLog(log_name): log_filename=‘./test.log‘ log_level=logging.DEBUG format = logging.Formatter(‘%(asctime)s %(name)s-%(levelname)s-%(filename)s-[line:%(lineno)s]: %(message)s‘) handler = logging.handlers.RotatingFileHandler(log_filename,mode=‘a‘,maxBytes=10*1024*1024,backupCount=5) handler.setFormatter(format) logger = logging.getLogger(log_name) logger.addHandler(handler) logger.setLevel(log_level) return logger if __name__==‘__main__‘: WriteLog(‘api‘).info(‘this is test‘)
调用:
#!/usr/bin/env python # encoding: utf-8 import loggers,logging loggers.WriteLog(‘api-2‘).info(‘sys file test log‘)
以配置文件方式配置logger:
logger.conf:
#定义logger模块,root是父类,必须存在,其他的是自定义 #logging.getLogger(NAME)就相当于向logging模块注册了实例化了 #name中用,表示 log的继承关系 [loggers] keys=root,exp01,exp02 #[logger_xxx] logger_模块名称 #level 级别,级别有DEBUG,INFO,WARNING,ERROR,CRITICAL #handlers 处理类,可以有多个,用逗号分割 #qualname logger名称,应用程序通过logging.getLogger获取.对于不能获取的名称,则记录到root模块 #propagate 是否继承父类的LOG信息,0:否,1:是 [logger_root] level=DEBUG handlers=hand01,hand02 [logger_exp01] handlers=hand01,hand02 qualname=exp01 propagate=0 [logger_exp02] handlers=hand01,hand02 qualname=exp02 #[handler_xxx] #class handler 类名 #level 日志级别 #formatter 上边定义的formatter #args handler初始化函数参数 [handlers] keys=hand01,hand02 [handler_hand01] class=StreamHandler level=INFO formatter=form02 args=(sys.stderr,) [handler_hand02] class=FileHandler level=DEBUG formatter=form01 args=(‘test.log‘,‘a‘) #和上边的格式一样formatter_XXX 用来格式化日志 [formatters] keys=form01,form02 [formatter_form01] format=%(asctime)s %(name)s-%(levelname)s-%(filename)s-[line:%(lineno)s]: %(message)s datefmt=%a,%d %b %Y %H:%M:%S [formatter_form02] format=%(asctime)s %(name)s-%(levelname)s-%(filename)s-[line:%(lineno)s]: %(message)s datefmt=%a,%d %b %Y %H:%M:%S
配置文件读取:
#!/usr/bin/env python # encoding: utf-8 import logging,logging.config logging.config.fileConfig("logger.conf") #配置文件名称 logger = logging.getLogger("exp01") #调用日志模版,默认一定是root logger.debug(‘this is debug‘) logger.info(‘this is info‘) logger.warning(‘this is warning‘)
执行输出:
[[email protected] ~/Documents/python/reboot]$ python sys.py Thu,02 Mar 2017 14:29:04 exp01-INFO-sys.py-[line:7]: this is info Thu,02 Mar 2017 14:29:04 exp01-WARNING-sys.py-[line:8]: this is warning
文件输出:
[[email protected] ~/Documents/python/reboot]$ cat test.log Thu,02 Mar 2017 14:03:41 exp01-DEBUG-sys.py-[line:6]: this is debug Thu,02 Mar 2017 14:03:41 exp01-INFO-sys.py-[line:7]: this is info Thu,02 Mar 2017 14:03:41 exp01-WARNING-sys.py-[line:8]: this is warning
原文地址:https://www.aolens.cn/?p=1251
时间: 2024-10-02 20:34:17