2017-09-25 4 views
2

로그 메시지를 포맷 처리 할 수 ​​없습니다 :사용자 정의 포맷터 내가 루트 로거에 추가 한 내 파이썬 플라스크 응용 프로그램에서 사용자 정의 포맷터가

logger = logging.getLogger() 
logger.setLevel(logging.INFO) 

handler = logging.StreamHandler() 
handler.setLevel(logging.INFO) 

formatter = CustomLoggingFormatter() 
handler.setFormatter(formatter) 

logger.addHandler(handler) 

내가 원하는 때 완벽하게 잘 작동 뭔가 로그 (logger.info() ...),하지만 라이브러리의 로그 문제가 있습니다. uwsgi.

{ "@timestamp": "2017-09-25T06 : 57 : 45.373Z"여기

는 로그인 메시지의 예이며, "레벨" "정보", "메시지" : "* %의에서 실행 : //은 %의 % D/%의"나는 LogRecord의 어떤 내 CustomLoggingFormatter의 receivs를 로그인 할 때} 내가 뭔가 내 포맷터 잘못했다, 그러나 아마 생각

, 그것은 보인다 위의 행에 대해 이렇게 :

LogRecord : werkzeug, 20, <>/lib/python3.5/site-packages/werkzeug/_internal.py, 87, "* % s에서 실행 중 : // % s : % d/% s"

여기 내 CustomLoggingFormatter입니다 : 작업에 내 포맷터를 들어

class CustomLoggingFormatter(Formatter): 
    data = {} 

    def __init__(self): 
     super(CustomLoggingFormatter, self).__init__() 

    def format(self, record): 
     print(record) 
     input_data = {} 
     input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z' 
     input_data['level'] = record.levelname 
     if record.msg: 
      input_data['message'] = record.msg 

     input_data.update(self.data) 
     return json.dumps(input_data) 

, 문자열 서식 먼저 해결하지만 발생하지 않습니다 여러 라이브러리해야 보인다. 이 문제를 해결하는 방법을 알고있는 사람은 누구입니까?

+0

사용자 정의 코드를 표시하십시오. 'Formatter.format()'는 항상'LogRecord' 인스턴스를 처리해야합니다; 기본 구현체는'Formatter.formatMessage()'를 호출하여 실제 형식을 처리합니다 (일반적으로'vars (record)'를 사전으로 사용합니다). –

+0

내 CustomLoggingFormatter를 추가했습니다. – user16655

+0

포맷터 구현이 Python 버전간에 조금 바뀌었기 때문에 어떤 Python 버전을 실행하고 있습니까? –

답변

1

항상 record.getMessage()으로 전화해야합니다. 그것은 record.msg의 값을 취하고 그에 서식을 적용합니다. default implementation of Formatter.format()은 결과를 record.message에 할당하여 최종 문자열로 보간합니다. Do you too your code :

def format(self, record): 
    print(record) 
    record.message = record.getMessage() 
    input_data = {} 
    input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z' 
    input_data['level'] = record.levelname 

    if record.message: 
     input_data['message'] = record.message 

    input_data.update(self.data) 
    return json.dumps(input_data) 
+0

매력처럼 작동했습니다! 고마워요 :) – user16655

관련 문제