2015-05-10 53 views
1

我是使用Python進行編程的初學者。使用python 2.7.9編寫日誌文件中的消息格式

我嘗試使用日誌模塊重定向日誌文件,但我面臨着以下問題:

在我的日誌文件命名爲「是error.log」我的級別名稱和日期是在每個日誌文件行中重複出現。

有沒有辦法避免這個問題?

我正在使用Python 2.7.9。

這裏是我下面的代碼:

# error.py 
# -*- coding: utf-8 -*- 
import logging 
import sys 
logging.basicConfig(
    level=logging.ERROR, 
    format="%(levelname)s - %(asctime)s - %(message)s", 
    filename="error.log", 
    filemode='w' 
) 

class StreamToLogger(object): 
    def __init__(self, logger, log_level=logging.DEBUG): 
     self.logger = logger 
     self.log_level = log_level 

    def write(self, text): 
     for line in text.rstrip().splitlines(): 
      self.logger.log(self.log_level, line.rstrip()) 

stdout_logger = logging.getLogger('STDOUT') 
sl = StreamToLogger(stdout_logger, logging.INFO) 
sys.stdout = sl 
stderr_logger = logging.getLogger('STDERR') 
sl = StreamToLogger(stderr_logger, logging.ERROR) 
sys.stderr = sl 
#Voluntary error for display in the log 
print message 

當我運行這個python腳本,我得到以下文件:

# the error.log file 
ERROR - 2015-05-10 17:24:40,726 - Traceback (most recent call last): 
ERROR - 2015-05-10 17:24:40,726 - File "D:\error\error.py", line 27, in <module> 
ERROR - 2015-05-10 17:24:40,726 - print message 
ERROR - 2015-05-10 17:24:40,726 - NameError 
ERROR - 2015-05-10 17:24:40,726 - : 
ERROR - 2015-05-10 17:24:40,726 - name 'message' is not defined 

有沒有辦法避免的級別名稱的重複和使我的錯誤消息更具可讀性的日期?

+0

也許嘗試你的'format'變量更改爲這樣的事'格式=「%(消息) s「' – Eenoku

+0

啊,謝謝大家。 我想我們可以使用諸如過濾器之類的方法來做到這一點。 – ab92

回答

0

既然你是遞歸,在write你應該能夠只設置

self.logger.log(self.log_level, line.rstrip())

第一次迭代,然後把它更改爲類似

self.logger.log("", line.rstrip())

的價值觀的其餘部分。

應該只允許您打印錯誤級別一次。

0

的 '格式' 部分:

logging.basicConfig(
    level=logging.ERROR, 
    format="%(levelname)s - %(asctime)s - %(message)s", 
    filename="error.log", 
    filemode='w' 
) 

定義一切是如何打印到控制檯。如果你只保留%(消息),你將擺脫錯誤級別和時間戳。

如果您試圖只保留一個錯誤級別和時間戳發生(即:刪除所有重複項),恐怕沒有現成的方式來使用日誌記錄模塊。

0

最後,感謝您的建議,我可以得到我想要的,即只在我的錯誤文件的第一行中定義級別名稱和日期。

我改變了我的格式變量的值爲「%(message)s」,因爲您建議我,我在循環中格式化了我的第一行。

我不認爲這是最優雅的方式,但它像我想要的那樣工作。

這裏是我的代碼:

# error.py 
# -*- coding: utf-8 -*- 
import logging 
from datetime import datetime 
import sys 
logging.basicConfig(
    level=logging.ERROR, 
    format="%(message)s", 
    filename="error.log", 
    filemode='w' 
) 

class StreamToLogger(object): 
    def __init__(self, logger, log_level=logging.DEBUG): 
     self.logger = logger 
     self.log_level = log_level 

    def write(self, text): 
     textLines = text.splitlines() 
     for line in textLines: 
      if line.startswith("Traceback"): 
       self.logger.log(self.log_level, "%s - %s - %s" % (logging.getLevelName(self.log_level), datetime.now(), line.rstrip())) 
      else: 
       self.logger.log(self.log_level, line.rstrip()) 

stdout_logger = logging.getLogger('STDOUT') 
sl = StreamToLogger(stdout_logger, logging.INFO) 
sys.stdout = sl 
stderr_logger = logging.getLogger('STDERR') 
sl = StreamToLogger(stderr_logger, logging.ERROR) 
sys.stderr = sl 
#Voluntary error for display in the log 
print message 

我得到以下日誌文​​件:

# error.log 

ERROR - 2015-05-15 21:06:47.234000 - Traceback (most recent call last): 
    File "D:\error\error.py", line 32, in <module> 

print message 

NameError 
: 
name 'message' is not defined 
相關問題