我注意到,当我调用另一个函数时,它仍然可以访问记录器,即使它没有通过。例如,以下文件始终写入testlogger.log
:
import logging
from datetime import datetime
def printHello():
print('Hello')
logger.info('printed hello')
printGoodbye()
def printGoodbye():
print('Goodbye')
logger.info('printed goodbye')
if __name__ == "__main__":
logger = logging.getLogger(__name__)
FORMAT = '%(name)s - %(levelname)s - %(message)s'
logging.basicConfig(filename='testlogger.log', level=logging.DEBUG, format=FORMAT)
logger.info(datetime.now().strftime('%H:%M %d-%m-%Y.log'))
logger.info('About to call function printHello')
printHello()
logger.info('Now exiting')
这是怎么做的?此外,我正在进行的项目分为几个模块,一旦完成,将相互调用。每个模块应该有一个单独的日志文件吗?如果是这样,那么约定只是在创建它的脚本之后命名日志文件吗?
答案 0 :(得分:1)
最好的方法是遵循Python logging documentation:
中的建议记录器名称层次结构类似于Python包 层次结构,如果您在a上组织记录器,则与它相同 每个模块使用推荐的结构
logging.getLogger(__name__)
。那是因为在一个模块中,__name__
是Python包命名空间中的模块名称。
这样做可以让您对日志记录进行相对细粒度的控制。默认情况下(使用logging.basicConfig
),每个模块的日志记录将以相同的方式工作:它将处于同一级别并转到相同位置,但如果您需要,现在可以为特定模块打开或关闭日志记录,或将一个模块的日志记录调高。有关如何执行此操作的示例,请参阅Python logging to multiple handlers, at different log levels?。
您的logger
变量可以跨函数访问的原因是因为当您在顶层分配它时,会创建一个“全局”变量(它不是真正的全局变量,它具有模块范围)。更好的方法是在脚本顶部自己显式创建记录器:
import logging
from datetime import datetime
logger = logging.getLogger(__name__)
def printHello():
print('Hello')
logger.info('printed hello')
printGoodbye()
def printGoodbye():
print('Goodbye')
logger.info('printed goodbye')
if __name__ == "__main__":
FORMAT = '%(name)s - %(levelname)s - %(message)s'
logging.basicConfig(filename='testlogger.log', level=logging.DEBUG, format=FORMAT)
logger.info(datetime.now().strftime('%H:%M %d-%m-%Y.log'))
logger.info('About to call function printHello')
printHello()
logger.info('Now exiting')