2017-08-01 116 views
2

我正在實施我的Python項目中的日誌記錄,並且遇到了一些障礙。我正在嘗試設置日誌記錄,以便將處理程序和格式化程序全部組織到配置文件中。我現在想要做的是設置我的fileHandler,這樣它會創建一個類似如下的日誌文件:YYYY_MM_DD.log顯然,Y代表年份,M代表月份,D代表當天。Python日誌記錄 - 將日期設置爲文件名

這就是我試圖用我的配置文件:

[loggers] 
keys=root,MainLogger 

[handlers] 
keys=fileHandler, consoleHandler 

[formatters] 
keys=logFormatter, consoleFormatter 

[logger_root] 
level=DEBUG 
handlers=fileHandler 

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

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

[handler_fileHandler] 
class=FileHandler 
level=DEBUG 
formatter=logFormatter 
args=(datetime.now().strftime('%Y_%m_%d.log'), 'a') 

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

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

我使用的測試配置文件很簡單:

import logging 
import logging.config 

logging.config.fileConfig('logging.conf') 
logger = logging.getLogger('MainLogger') 
logger.debug("TEST") 

特定的錯誤,我在得到時刻是:

configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%Y_%m_%d.log'), 'a')" 

我試過改變%Y%m%d,正如錯誤所述,但這並不能解決問題。我如何去設置配置文件,以便我的日誌文件看起來像我想要的那樣?

我應該注意,當我改變文件名爲test.log一切正常,所以這是我似乎與此唯一的錯誤。

+0

你怎麼導入日期時間?這可能是由於使用'datetime.now()'而不是'datetime.datetime.now()'的常見錯誤而導致錯誤無法正確處理的錯誤。 –

+0

......我想我沒有導入日期時間。雖然我只是改變我的配置文件爲'datetime.datetime.now()',仍然有相同的錯誤。我會將它導入到我的Python腳本中嗎? – Skitzafreak

+0

是的,嘗試在腳本的頂部放置'from datetime import datetime'。 –

回答

1

你不能在配置文件中使用datetime,因爲它不知道這意味着什麼。

import logging.config 
from datetime import datetime 

logging.config.fileConfig('aaa.conf') 
logger = logging.getLogger('MainLogger') 

fh = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now())) 
formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') 
fh.setFormatter(formatter) 

logger.addHandler(fh) 
logger.debug("TEST") 

這樣你就可以設置日期作爲處理程序的文件名:但是,您可以在Python文件本身添加Filehandler

這是配置文件,請注意,您必須在最後格式化一個錯字,你把fillname而不是filename,你在message忘記(

[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 

這應該工作得很好。

0

這使用來自配置文件的內容,但不直接訪問該文件。您創建自己的文件處理程序,然後將其添加到記錄器。

import logging 
from datetime import datetime 

# Create logger. 
logger = logging.getLogger('MainLogger') 
logger.setLevel(logging.DEBUG) 

# Create filehandler with desired filename. 
fh = logging.FileHandler('{}.log'.format(datetime.now().strftime('%Y_%m_%d'))) 
fh.setLevel(logging.DEBUG) 
log_formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') 
fh.setFormatter(log_formatter) 

# Add filehandler to logger. 
logger.addHandler(fh) 

注意a(追加)是一個文件處理器默認mode參數。

+0

我假設導入是假設在Python腳本中?我仍然得到相同的錯誤:\ – Skitzafreak

1

也許你可以使用Python的TimedRotatingFileHandler來代替。您可以設置時間間隔以每天創建一個新日誌文件,並以日期作爲後綴。

Documentation--

注意,當天的日誌文件中不會有約會。此文件處理程序僅在新的一天開始時添加日期後綴。

此外,它使用的後綴是「%Y-%m-%d」,這與你想要的有些不同。但是有一個關於如何改變這個問題的問題here

+0

不知道他們是否以我需要的方式工作。根據我的理解,查看您提供的'TimedRotatingFileHandler'的鏈接是爲了讓您計劃讓一個程序運行多天,並且每天需要單獨的日誌文件。在我的情況下,我的程序可能每次使用30分鐘到1小時,但我仍然需要能夠跟蹤使用日期。 – Skitzafreak

1

也許嘗試加載了配置文件後更改名稱

from datetime inport datetime 

logging.config.fileConfig('logging.conf') 
logging.basicConfig(filename = datetime.now().strftime('%Y_%m_%d.log')) 
+1

不幸的是,這不起作用。一旦配置文件加載,我似乎無法修改文件名 – Skitzafreak

+0

是的,這只是一個猜測,試試nofinator的建議如下:* timedrotatingfilehandler * –

+0

我一直在看看它,我會如果它有幫助,將其標記爲答案。感謝您的幫助。 – Skitzafreak

相關問題