2017-08-02 64 views
0

所以我想在我的Python程序中实现日志记录。目标是设置它以便创建一个日志文件,并且记录程序通过它的各个模块执行的所有事情(根据日志记录级别)。这是我当前的代码是什么样子:Python日志,不写入文件

日志配置文本文件:

#logging.conf 
[loggers] 
keys=root,MainLogger 

[handlers] 
keys=consoleHandler 

[formatters] 
keys=consoleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler 

[logger_MainLogger] 
level=DEBUG 
handlers=consoleHandler 
qualname=MainLogger 
propagate=0 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=consoleFormatter 
args=(sys.stdout,) 

[formatter_consoleFormatter] 
format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%lineno)04d | %(message)s 

外部模块到测试日志:

#test.py 
import logging 

logger = logging.getLogger(__name__) 

def testLog(): 
    logger.debug("Debug Test") 
    logger.info("Info Test") 
    logger.warning("Warning Test") 
    logger.error("Error Test") 

主文件:

#__init__.py 
import logging 
import logging.config 
from datetime import datetime 

logging.config.fileConfig('logging.conf', disable_existing_loggers = False) 
logger = logging.getLogger('MainLogger') 
fileHandler = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now())) 
formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') 
fileHandler.setFormatter(formatter) 
logger.addHandler(fileHandler) 

if __name__ == "__main__": 

    import test 
    logger.debug("Debug Test") 
    test.testLog() 

目前,当我运行时,所有的日志消息当前都在使用IDLE3 shell显示和日志文件正在创建。但是在日志文件本身中,正在记录的唯一消息是来自__init__.py的“调试测试”。在test.py模块中没有任何消息正在记录在日志文件中。

我的问题是什么?

回答

0

test.py中,它会抓取一个logger对象,之后再在__init__.py中对其进行配置。确保在抓取任何记录器实例之前先配置记录模块。

+0

解决方案是将'logger = logging.getLogger(__ name __)'行移动到'testLog()'方法的内部?这就是说,这意味着我使用的每个模块中的每个方法都应该通过创建一个存在于该方法范围内的日志记录对象来启动该方法? – Skitzafreak

+0

没有,因为你得到一个记录器对象的功能之外没有帮助。在导入测试之前,''__init __。py''中的''fileConfig'调用将移到顶层,这是加载软件包时首先要执行的操作 –

+0

Ahh好的。因此,导入日志记录库,实现日志记录的东西,导入和运行其他的东西。 Gotcha – Skitzafreak