簡體   English   中英

如何在 Django/Google App Engine 中制作日志顏色?

[英]How does one make logging color in Django/Google App Engine?

如果一個人正在編寫一個 Django/Google App Engine 應用程序並且想要基於顏色方便地顯眼的日志(即紅色錯誤),如何設置?

我已經從這個問題復制了有用的解決方案,但我不確定如何將它集成到 Django/Google App Engine 中。

我想可以將以下內容放在應用程序的 main.py 中(即基本上來自此處的示例:在 Google App Engine 上運行 Django ):

from contrib.utils import ColouredLogger # from the SO question above
logging.setLoggerClass(ColouredLogger)

... contrib.utils 是我將上面鏈接中的 airmind 代碼放到他的 SO 答案中的地方。

但是,這似乎對 GAE 控制台的輸出沒有任何影響,GAE 仍然采用原始格式 + 純色。

建議和意見將不勝感激。

干杯,布賴恩

我們使用colorlog ,它完全符合您的期望。

對於后代,我們使用的格式化程序配置是:

'color': {
    '()': 'colorlog.ColoredFormatter',
    'format': '%(log_color)s%(levelname)-8s %(message)s',
    'log_colors': {
        'DEBUG':    'bold_black',
        'INFO':     'white',
        'WARNING':  'yellow',
        'ERROR':    'red',
        'CRITICAL': 'bold_red',
    },
}

Django 已經通過“ DJANGO_COLORS ”環境變量支持顏色輸出,例如在運行內置開發服務器時使用。 有人注意到了這一點,並創建了一個即插即用的解決方案https://github.com/tiliv/django-colors-formatter 使用該項目的 python 路徑上的包,我的 logging settings.py如下:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'formatters': {
        'verbose': {
            '()': 'djangocolors_formatter.DjangoColorsFormatter', # colored output
            'format': '%(levelname)s %(name)s %(asctime)s %(module)s %(process)d %(thread)d %(pathname)s@%(lineno)s: %(message)s'
        },
        'simple': {
            '()': 'djangocolors_formatter.DjangoColorsFormatter', # colored output
            'format': '%(levelname)s %(name)s %(filename)s@%(lineno)s: %(message)s'
        },
    },
     # omitting the handler 'level' setting so that all messages are passed and we do level filtering in 'loggers'
    'handlers': {
        'null': {
            'class':'django.utils.log.NullHandler',
        },
        'console':{
            'class':'logging.StreamHandler',
            'formatter': 'simple',
        },
        'mail_admins': {
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        '': { 
            'handlers': ['mail_admins', 'console'],
            'level': 'WARNING',
        },
    }
}

使用 django-colors-formatter 的示例控制台日志輸出:示例控制台日志輸出

我還想要 dev_appserver 的顏色輸出。 我在這里找到了一些 OTT 的解決方案(我想要的只是讓我的 logging.error() 調用脫穎而出。我最終通過將它放在我的 main.py 中作為快速解決方案來對日志記錄模塊進行猴子修補:

# monkey patch logger to dump ERRORs in red
import os
if os.environ['SERVER_SOFTWARE'].find('Development') >= 0:
    import logging
    old_error = logging.error
    def red_error(msg,*args,**kwargs):
        old_error("\033[22;31m%s\033[0;0m" % msg, *args, **kwargs)
    logging.error = red_error

這僅適用於 ANSI 彩色終端。

這是一個示例格式化程序:

class Formatter(logging.Formatter) :
    _level_colors  = {
      "DEBUG": "\033[22;32m", "INFO": "\033[01;34m",
      "WARNING": "\033[22;35m", "ERROR": "\033[22;31m",
      "CRITICAL": "\033[01;31m"
     };    

    def format(self, record):
        if(Formatter._level_colors.has_key(record.levelname)):
            record.levelname = "%s%s\033[0;0m" % \
                            (Formatter._level_colors[record.levelname],
                             record.levelname)
        record.name = "\033[37m\033[1m%s\033[0;0m" % record.name
        return logging.Formatter.format(self, record)    

您需要對其進行配置,例如:

...
[formatters]
keys=console_formatter
...
[handler_console_handler]
class=StreamHandler
formatter=console_formatter
args=(sys.stdout,)

您鏈接到的答案中提到的重置代碼將在本地開發服務器的控制台上運行(但可能需要進行一些調整 - 您必須將其與現有的 App Engine 日志處理程序鏈接),但在生產,因為在生產日志條目輸出到管理控制台中的 HTML 頁面。

但是,您可以在管理控制台中按日志級別進行過濾。

我不認為你應該為此創建一個記錄器子類 - airmind 的答案是好的,只要創建一個專門的Formatter並指定它在StreamHandler上的使用。 但是不需要記錄器子類。 事實上,airmind 使用 logger 類為每個創建的 logger 添加了一個處理程序,這不是您想要的。

airmind 給出的解決方案僅適用於支持 ANSI 轉義序列的終端 - 您確定您的控制台確實支持它們嗎?

我使用了coloredlogs包。 DJANGO_COLORS不同,它不特定於 Django 命令,並且與django-colors-formatter ,它是積極維護的。

我在日志配置中添加了一行,現在我得到了可配置的彩色日志。

logging.config.dictConfig({
    ...
    'formatters': {
        'console': {
            # This line right here:
            "()": "coloredlogs.ColoredFormatter",
            'format': '%(asctime)s %(levelname)s [%(name)s:%(lineno)s] %(message)s',
        },
    },
    ...

這是我使用 colorlog 的 Django 解決方案。 它只是按原樣為簡單的 Django 消息着色。 你只需要把它放在你的settings.py

pip install colorlog
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'special': {
            '()': 'colorlog.ColoredFormatter',
            'format': '%(log_color)s[%(asctime)s] %(message)s'
        }
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'special'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        }
    }
}

屏幕

安裝顏色日志

(不要忘記將 colorlog 放在INSTALLED_APPS 中

格式化程序中創建“彩色”

 'colored': {
        '()': 'colorlog.ColoredFormatter',
        'format': "%(log_color)s %(levelname)-8s %(asctime)s %(module)s %(reset)s %(blue)s%(message)s",
    }

settings.py 中記錄器的完整示例

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'colored': {
        '()': 'colorlog.ColoredFormatter',
        'format': "%(log_color)s %(levelname)-8s %(asctime)s %(module)s %(reset)s %(blue)s%(message)s",
    }
},
'handlers': {
    'console': {
        'class': 'logging.StreamHandler',
        'formatter': 'colored'
    },
},
'root': {
    'handlers': ['console'],
    'level': 'WARNING',
},
'loggers': {
    'django': {
        'handlers': ['console'],
        'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        'propagate': False,
    },
},

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM