python之logging模块使用

2023-01-31 05:01:22 python logging 模块
#!/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')
 
[aolens@aolens-2 ~/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日志文件

[aolens@aolens-2 ~/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')

执行输出:

[aolens@aolens-2 ~/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

文件输出:

[aolens@aolens-2 ~/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


相关文章