2014-04-16 4 views
1

모든 요청과 응답은 웹 프레임 워크에 기록되지만 로깅 모듈을 사용하여 로깅합니다 (암호는 로그인 요청에 포함되어 있기 때문에).로깅 모듈을 사용하여 요청을 선택적으로 기록합니다.

암호 또는 인쇄하고 싶지 않은 다른 필드에 대해 'XXXXXXX'를 선택적으로 인쇄 할 수 있습니까? 그래서 여기 authentication.py

import logging 
from logging import config 
logging.config.dictConfig({'version': 1, 'delete_existing_loggers': False, 'handlers': '.....'}) 

LOGGER = logging.getLogger(__name__) 

##code to get variables from http request packet (like method, parameters)(for example, methods, params can be: [authentication.login, username, password], [authentication.change_password, username, old_password, new_password], [authentication.generate_validation_code, username]), 
LOGGER.info('method %s with %s parameters called', method, params) 

내가 원하는 구체적인 방법에 대해, 일부 변수는 방법 'authentication.login가'I 인쇄 할 것이다 구체적 경우, 대신에 원래 값의 "xxxxx는 '이어야 params의 두 번째 매개 변수는 'xxxx'입니다.

감사합니다.

+0

로깅 모듈에 전달하기 전에 응용 프로그램 수준에서 데이터를 삭제하는 것이 가장 좋습니다. 물론 중요한 정보를 제거하는 사용자 정의 포매터를 작성할 수도 있지만 유지 관리가 어려우며 100 % 유효하지 않을 수도 있습니다. – Unknown

+0

GET – SpoonMeiser

+0

대신 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@로 보내집니다 그래서 작동하지 않습니다. – Neil

답변

2

예, 가능합니다. logging.Filter class을 살펴보십시오. 하위 클래스를 작성한 다음 로거에 등록해야합니다.

예 : record 개체의 자세한 내용은

class PasswordLoggingFilter(logging.Filter): 
    def filter(self, record): 
     # Modify record, especially record.msg and/or record.args. 
     if want_to_keep_record: 
      return True 
     else: 
      return False 

logger.addFilter(PasswordLoggingFilter()) 

, 그것은 documented here입니다.

+0

logger.info (msg, a, b)에서 제공하는 매개 변수가 필터 함수에서 레코드로 사용 가능합니까? 나는 그것을 시도했고 시간 조절에 의해 필터 함수에 도달 할 때 다른 인자 (a, b)가없는 것 같다. – Neil

+0

''filter()''함수의''record'' 인자는''클래스 LogRecord'' ([see here] (https://docs.python.org/2/library/logging.html#logrecord-objects)''record.msg''는 원래의 메시지 문자열 인''record.args ''인수가 포함되어 있습니다. –

+0

감사합니다. 처음에는 처리기를 통과했기 때문에 처음에는 작동하지 않았습니다. – Neil

0

Christian에 의해 제공된 솔루션 외에도 dictConfig 또는 fileConfig에서 핸들러가 전달되면 핸들러 클래스는 서브 클래 싱되어야하며 필터를 추가해야합니다.

코드는 다음 웹 페이지에서 가져온 것입니다 http://streamhacker.com/2010/04/08/python-logging-filters/

class InfoFilter(logging.Filter): 
def filter(self, rec): 
    return rec.levelno == logging.INFO 

class InfoHandler(logging.StreamHandler): 
def __init__(self, *args, **kwargs): 
    StreamHandler.__init__(self, *args, **kwargs) 
    self.addFilter(InfoFilter()) 

을 또 하나의 기록의 인수 필드를 변경하고자하는 경우, 하나의리스트로 가져 가서 다음을 변경하고 다시 재 할당 할 수 있습니다.

관련 문제