2017-05-27 56 views
0

Python新手。現在我一直困在這裏。當我嘗試使用ini配置在文件中寫入日誌時,文件中不會捕獲任何內容。我試圖調試該問題,但無法得知任何線索。在不使用ini文件的情況下編寫日誌非常好。登錄到文件的記錄器配置

下面是代碼和ini文件

import logging 

from logging.config import fileConfig 

def info(message): 


    fileConfig('logging_config.ini') 
    logger=logging.getLogger("simple logger") 

    logger.warning('Something is not right') 
    logger.warning(message) 

logging_config.ini

[loggers] 
keys=root 

[handlers] 
keys=file_handler 

[logger_root] 
level=WARNING 
handlers=file_handler 

[formatters] 
keys=formatter 

[formatter_formatter] 
format='%(message)s' 

[handler_file_handler] 
class=FileHandler 
level=WARNING 
formatter=formatter 
args=('dummyoutput.log','w') 

我查了一下記錄器對象也能看到,如果我能得到它的屬性的任何線索。下面是對象

{'disabled': 0, 
'filters': [], 
'handlers': [<logging.FileHandler object at 0x7ff03358ce90>], 
'level': 30, 
'name': 'root', 
'parent': None, 
'propagate': 1} 

不知道,樂於助人,但我注意到disabled早些時候表示TRUE的財產,但現在則是每次0

有沒有人對此有任何線索?

更新:該問題是由於對同一配置文件的logging.config.fileConfig()多次調用所致。但是我不明白爲什麼最後一次調用該函數時沒有寫入任何內容。任何想法呢?

回答

0

找出(愚蠢的)錯誤是什麼。實際上,info(message)被調用的次數不止一次,fileConfig()的調用次數與info函數中的相同。因此,這個問題。修改後的代碼如下,它的工作。

import logging 
from logging.config import fileConfig 

def info(message): 

    logger.warning('Something is not right') 
    logger.warning(message) 

fileConfig('logging_config.ini') 
logger=logging.getLogger("simple.logger") 

更新:即使我們不遵循記錄命名約定如。因爲我給simple logger而不是simple.logger它工作正常。

2

記錄器有一個命名約定,名稱「簡單記錄器」由於空間而無效。

您應該用一段時間來替換空格。我們通常使用Python包名稱作爲記錄器。

這裏是你如何解決這個問題:

import logging 

from logging.config import fileConfig 


def info(message): 

    fileConfig('logging_config.ini') 
    logger = logging.getLogger("simple.logger") 

    logger.warning('Something is not right') 
    logger.warning(message) 


if __name__ == "__main__": 
    info("hello") 

它炒菜完美。

'Something is not right' 
'hello' 

引用Logger對象:

名稱是一個潛在的時間段隔開的分層值,像foo.bar.baz(儘管它也可能只是例如平原foo,)。在分層列表中更靠後的記錄器是列表中較高記錄器的子記錄器。例如,給定一個名稱爲foo的記錄器,名稱爲foo.bar,foo.bar.bazfoo.bam的記錄器都是foo的後代。記錄器名稱層次結構類似於Python包層次結構,如果使用建議的構造logging.getLogger(__name__)以模塊爲單位組織記錄器,則其類似於Python包層次結構。這是因爲在模塊中,__name__是Python包命名空間中的模塊名稱。

+0

哦,是的......你說得對。但與此同時它也不起作用。另外,我之前嘗試過的大多數時候都沒有給logger任何名字'logger = logging.getLogger()',但那也沒有奏效。不知道那裏出了什麼問題。 – qwerty

+1

你能解釋一下哪些工作不正常(因爲我已經測試過了)。注意:你應該在配置INI中使用完整路徑。你有沒有找到你的日誌文件? –

+0

日誌文件已被生成。你分享的代碼非常好。實際上,問題在於'info(message)'不止一次被調用,fileConfig()'也被調用了相同的配置文件,因爲它在info函數內* [請檢查我的答案以獲得詳細信息] *。但是我不明白爲什麼最後一次調用該函數時沒有寫入任何內容。任何想法呢? – qwerty