2017-06-30 41 views
2

這是用於Python 2.7 ....python logging:如何替換FileHandler的輸出文件?

我有一個Django項目,並且我使用logging.config.dictConfig(CONFIG)來獲取當運行Django應用程序作爲服務器時需要的日誌記錄。我在mycore.logging中擁有自己的模塊,並在導入時創建一個記錄器對象。這非常棒。

但是,Django具有獨立的「管理命令」,我想將每個管理命令記錄到它自己的單獨文件中。日誌文件名稱將是管理命令+「.log」的名稱。

我搜索了谷歌搜索,沒有找到任何這方面的例子。這真的很不尋常嗎?或者我沒有找到現有技術?

我想我知道如何刪除現有的FileHandler,用我想要的輸出文件實例化一個新的文件,並將其作爲處理程序添加到記錄器對象中。

但它似乎是一個笨重的事情要做。任何建議都會受到歡迎。

import logging 
import logging.config 
from logutils.colorize import ColorizingStreamHandler 
from django.conf import settings 

class ColorHandler(ColorizingStreamHandler): 
    def __init__(self, *args, **kwargs): 
     super(ColorHandler, self).__init__(*args, **kwargs) 
     self.level_map = { 
       # Provide your custom coloring information here 
       logging.DEBUG: (None, 'blue', False), 
       logging.INFO: (None, 'green', False), 
       logging.WARNING: (None, 'yellow', False), 
       logging.ERROR: (None, 'red', False), 
       logging.CRITICAL: ('red', 'white', True), 

     } 

try: 
    CONSOLE_LOG_LEVEL = settings.CONSOLE_LOG_LEVEL 
except AttributeError as ae: 
    CONSOLE_LOG_LEVEL = logging.INFO 
try: 
    FILE_LOG_LEVEL = settings.FILE_LOG_LEVEL 
except AttributeError as ae: 
    FILE_LOG_LEVEL = logging.DEBUG 

CONFIG = { 
    'version':1, 
    'disable_existing_loggers': True, 
    'handlers':{ 
     'console': { 
      '()':ColorHandler, 
      'level': CONSOLE_LOG_LEVEL, 
      'formatter': 'simplest', 
      'stream': 'ext://sys.stdout', 
     }, 
     'file': { 
      'class': 'logging.handlers.RotatingFileHandler', 
      'level': FILE_LOG_LEVEL, 
      'formatter': 'simplest', 
      'filename': './log-oxfam.txt', 
      'mode': 'a', 
      'maxBytes': 10485760, 
      'backupCount': 5, 
     }, 
    }, 
    'formatters': { 
     'simplest': { 
      'format': '%(levelname)-8s %(message)s', 
     }, 
     'time_level_message': { 
      'format': '%(asctime)s %(levelname)-8s %(message)s', 
     }, 
     'detailed': { 
      'format': '%(asctime)s %(module)s line:%(lineno)-4d %(levelname)-8s %(message)s', 
     }, 
    }, 
    'loggers': { 
     'myDjangoApp': { 
      'level':'DEBUG', 
      'handlers':['console', 'file'], 
      ###'handlers':['console'], 
     }, 
    }, 
} 

logging.config.dictConfig(CONFIG) 
logger = logging.getLogger("myDjangoApp") 

回答

1

我會基於logging.handlers.QueueHandler解決方案。它幾乎是唯一一個與存儲設備無關的產品。你的聽衆可以在運行時決定在哪裏放置東西。

+0

我的不好。我需要一個Python 2.7的解決方案。我澄清說明如此。 –

+0

在那裏看不到一個簡單的解決方案。你幾乎必須教一個MemoryView去跟沒有Queue的舊線程庫(幸運的是有collections.deque,但是仍然)。我現在記得爲什麼我遷移到3.x雖然:) – Melvyn

+0

我想我不清楚我想要的東西。這裏是一個總結: - 在導入時,我的實用程序代碼實例化一個日誌對象。這就是我需要的。 - 在__main __()時間,在選定的獨立命令中,我想用我的記錄器對象中存在的FileHandler替換爲與原始屬性相同的新FileHandler對象,除了寫入不同的文件。 –