目录:
1.1.logging日志用途(tcy)https://mp.csdn.net/postedit/95102043
2.1.logging模块级函数 https: //mp.csdn.net/postedit/95102425
2.2.Logger类 https://mp.csdn.net/postedit/95102590
2.3.Handler类 https://mp.csdn.net/postedit/95102690
2.4.Formater类 https://mp.csdn.net/postedit/95102834
2.5.Filter类 https://mp.csdn.net/postedit/95103238
3.1.logging.basicConfig https://mp.csdn.net/postedit/95103385
3.2.配置logging的几种方式 https://mp.csdn.net/postedit/95103602
4.1.日志切割 https://mp.csdn.net/postedit/95103779
4.2.日志滚动和过期删除 https://mp.csdn.net/postedit/95103902
4.3.多模块调用logging https://mp.csdn.net/postedit/95104089
4.4.日志类封装 https://mp.csdn.net/postedit/95104392
4.5.用logging模块记录异常 https://mp.csdn.net/postedit/95104529
多模块调用logging
logging模块保证在同一个python解释器内,在多个模块的情况下多次调用logging.getLogger('log_name')都会返回同一个logger实例。
典型多模块使用logging方式是在main模块中配置logging,配置会作用于多个子模块,
然后在其他模块中直接通过getLogger获取Logger对象即可。
实例1:
1.1.warning_output.py
import logging
def write_warning():
logging.warning(u"记录文件warning_output.py的日志")
1.2.error_output.py
import logging
def write_error():
logging.error(u"记录文件error_output.py的日志")
1.3.main.py
import logging
import warning_output,error_output
def write_critical():
logging.critical(u"记录文件main.py的日志")
测试:
write_critical()
error_output.write_error()
warning_output.write_warning()
实例2:
2.1.配置文件:
[loggers]
keys=root,main
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=fmt
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_main]
level=DEBUG
qualname=main
handlers=fileHandler
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=fmt
args=(sys.stdout,)
[handler_fileHandler]
class=logging.handlers.RotatingFileHandler
level=DEBUG
formatter=fmt
args=('tst.log','a',20000,5,)
[formatter_fmt]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
2.2.主模块main.py:
2.1.主程序:
import logging,logging.config
import foo.example.mod as mod
logging.config.fileConfig('G:\\sys3100\\foo\\example\\logging.conf')
root_logger = logging.getLogger('root')
root_logger.debug('MainProg:Test Root Logger...')
logger = logging.getLogger('main')
logger.info('Test Main Logger')
mod.testLogger()#子模块
2.2.子模块mod.py:
import logging,foo.example.submod as submod
logger = logging.getLogger('main.mod')
def testLogger():
logger.debug('modProg:Test mod.testLogger...')
submod.subTestLogging()
2.3.子子模块submod.py:
import logging
logger = logging.getLogger('main.mod.submod')
def subTestLogging():
控制台输出:
logger.info('submodProg:Test submod.subTestLogging()...')
2019-07-06 21:53:40,707 - root - DEBUG - MainProg:Test Root Logger...
2019-07-06 21:53:40,708 - main - INFO - Test Main Logger
2019-07-06 21:53:40,719 - main.mod - DEBUG - modProg:Test mod.testLogger...
2019-07-06 21:53:40,719 - main.mod.submod - INFO - submodProg:Test submod.subTestLogging()...
tst.log文件:
"""
2019-07-06 21:53:40,708 - main - INFO - Test Main Logger
2019-07-06 21:53:40,719 - main.mod - DEBUG - modProg:Test mod.testLogger...
2019-07-06 21:53:40,719 - main.mod.submod - INFO - submodProg:Test submod.subTestLogging()...
"""
tst.log中没有root logger输出的信息,因为logging.conf中配置了只有main logger及其子logger
使用RotatingFileHandler,而root logger是输出到标准输出。
实例3:
3.1.主模块mainModule.py
import logging
import foo.example.subModule as subModule
logger = logging.getLogger("mainModule")
logger.setLevel(level=logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
handler.setFormatter(formatter)
logger.addHandler(handler)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)
logger.addHandler(console)
logger.info("1.1.mainModule:Created an instance of subModule.subModuleClass")
a = subModule.SubModuleClass()
logger.info("1.2.mainModule:Call subModule.subModuleClass.testLogging")
a.testLogging()
logger.info("1.3.mainModule:Call subModule.fun()")
subModule.fun()
3.2.子模块subModule.py
import logging
module_logger = logging.getLogger("mainModule.sub")
def fun():
module_logger.info( "2.1.subModule:fun()")
class SubModuleClass(object):
def __init__(self):
self.logger = logging.getLogger("mainModule.sub.module")
self.logger.info("2.2.subModule:SubModuleClass init...")
def testLogging( self ):
self.logger.info( "2.3.subModule:testLogging() start...")
a = [] ;a.append(1 )
self .logger.debug("2.4.subModule:list a = "+ str(a))
控制台显示:
"""
2019-07-06 23:36:26,407 - mainModule - INFO - 1.1.mainModule:Created an instance of subModule.subModuleClass
2019-07-06 23:36:26,431 - mainModule.sub.module - INFO - 2.2.subModule:SubModuleClass init...
2019-07-06 23:36:26,431 - mainModule - INFO - 1.2.mainModule:Call subModule.subModuleClass.testLogging
2019-07-06 23:36:26,431 - mainModule.sub.module - INFO - 2.3.subModule:testLogging() start...
2019-07-06 23:36:26,431 - mainModule - INFO - 1.3.mainModule:Call subModule.fun()
2019-07-06 23:36:26,432 - mainModule.sub - INFO - 2.1.subModule:fun()
"""
log.txt文件:
"""
2019-07-06 23:36:26,407 - mainModule - INFO - 1.1.mainModule:Created an instance of subModule.subModuleClass
2019-07-06 23:36:26,431 - mainModule.sub.module - INFO - 2.2.subModule:SubModuleClass init...
2019-07-06 23:36:26,431 - mainModule - INFO - 1.2.mainModule:Call subModule.subModuleClass.testLogging
2019-07-06 23:36:26,431 - mainModule.sub.module - INFO - 2.3.subModule:testLogging() start...
2019-07-06 23:36:26,431 - mainModule - INFO - 1.3.mainModule:Call subModule.fun()
2019-07-06 23:36:26,432 - mainModule.sub - INFO - 2.1.subModule:fun()
"""
3.3.说明:
先在主模块定义logger'mainModule',进行配置,后可在解释器进程里其他地方通过getLogger( 'mainModule')
得到一样的对象,不需重新配置,可直接使用。
定义该logger子logger,都可共享父logger定义和配置,所谓父子logger是通过命名来识别,任意以 'mainModule'开头logger都是它的子logger,例如'mainModule.sub'。
实际开发一个application,先通过logging配置文件编application配置,可生成一个根logger,如'PythonAPP',
然后在主函数中通过fileConfig加载logging配置,接着在application的其他地方、不同的模块中,可用根logger
的子logger,如'PythonAPP.Core', 'PythonAPP.Web'来进行log,而不需反复的定义和配置各个模块的logger。