-1
ロガー用のカスタムフォーマッタを組み込み、pysparkを使用していますが、コマンドラインですべての色が削除されているようです。エスケープシーケンスは、出力された各値のレコード内に存在することが確認できますが、端末に送信されたときには取り除かれているようです。Pyspark:pysparkを使用しているときにログにターミナルansi-escape文字を削除しないようにする
なぜですか?
import datetime
import logging
import colorama
from pygments import highlight
from pygments.lexers import JsonLexer
from pygments.formatters import Terminal256Formatter
# Required for colored output
colorama.init()
class CustomFormatter(logging.Formatter):
'''Modifies the level prefix of the log with the following level
information:
!!! - critical
! - error
? - warn
- info
- - debug
'''
default_prefix = '???' # used with non-generic levels
color_mapping = {
logging.CRITICAL: colorama.Fore.RED + colorama.Style.BRIGHT,
logging.ERROR: colorama.Fore.RED + colorama.Style.BRIGHT,
logging.WARNING: colorama.Fore.YELLOW + colorama.Style.BRIGHT,
logging.DEBUG: colorama.Style.DIM,
}
prefix_mapping = {
logging.CRITICAL: '!!!',
logging.ERROR: ' ! ',
logging.WARNING: ' ? ',
logging.INFO: ' ',
logging.DEBUG: ' · ',
}
def format(self, record):
# Capture relevant record data
level = self.prefix_mapping.get(record.levelno) or self.default_prefix
msecs = datetime.datetime.fromtimestamp(record.created).strftime("%Y-%m-%d %H:%M:%S")
msg = record.msg.rstrip('\n')
# Setup colors
color = self.color_mapping.get(record.levelno) or ''
dim = colorama.Style.DIM
reset = colorama.Fore.RESET + colorama.Style.RESET_ALL
name = record.name
func = record.funcName
# Setup output
lexer = JsonLexer()
formatter = Terminal256Formatter()
try:
msg = '\n'.join(
highlight(m, lexer, formatter).rstrip('\n')
for m in msg.split('\n')
)
except:
pass
data = {k: v for k, v in locals().items()}
d = '{color}{level}{reset} {dim}{msecs} [{name}]{reset} {msg}'.format(**data)
record.msg = d
# Dump
return super(CustomFormatter, self).format(record)
使用法:
import logging
from CustomFormatter import CustomFormatter
def get_logger(name, level=None):
level = logging.DEBUG if not isinstance(level, int) else level
handler = logging.StreamHandler(sys.stdout)
handler.level = level or logging.INFO
formatter = CustomFormatter()
handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.addHandler(handler)
return logger
logger = get_logger('tester')
logger.error('Error here')