복붙노트

[PYTHON] 파이썬 로깅 모듈에서 줄 바꿈을 억제하십시오.

PYTHON

파이썬 로깅 모듈에서 줄 바꿈을 억제하십시오.

임시 로깅 시스템을 파이썬의 로깅 모듈로 대체하려고합니다. 로깅 시스템을 사용하여 한 줄에 긴 작업에 대한 진행 정보를 출력하므로 로그에서 꼬리를 잡거나 콘솔에서 볼 수 있습니다. 나는 로그 메시지에 대한 줄 바꿈을 억제하고 조각을 한 줄씩 구성하는 로깅 기능에 플래그를 지정하여이 작업을 수행했습니다.

모든 로깅은 단일 스레드에서 수행되므로 직렬화 문제가 없습니다.

파이썬의 로깅 모듈로 이것을 할 수 있습니까? 좋은 생각입니까?

해결법

  1. ==============================

    1.마지막 질문부터 시작하겠습니다. 아니오, 좋은 생각이라고 생각하지 않습니다. IMO를 사용하면 장기적으로 로그 파일의 가독성이 떨어질 수 있습니다.

    마지막 질문부터 시작하겠습니다. 아니오, 좋은 생각이라고 생각하지 않습니다. IMO를 사용하면 장기적으로 로그 파일의 가독성이 떨어질 수 있습니다.

    로깅 모듈을 고수하고 'tail'명령에 '-f'옵션을 사용하여 콘솔의 출력을 감시하는 것이 좋습니다. FileHandler를 사용하게 될 것입니다. 'delay'의 기본 인수는 False로 출력이 버퍼링되지 않음을 나타냅니다.

    개행을 정말로 억제해야한다면 자신 만의 Handler를 만드는 것이 좋습니다.

  2. ==============================

    2.이 작업을 원할 경우 로깅 처리기 종결자를 변경할 수 있습니다. 나는 파이썬 3.4를 사용하고있다. 이것은 Ninjakannon이 말한 것처럼 Python 3.2에서 소개되었습니다.

    이 작업을 원할 경우 로깅 처리기 종결자를 변경할 수 있습니다. 나는 파이썬 3.4를 사용하고있다. 이것은 Ninjakannon이 말한 것처럼 Python 3.2에서 소개되었습니다.

    handler = logging.StreamHandler()
    handler.terminator = ""
    

    StreamHandler가 기입하면 (자), 종단을 마지막에 기입합니다.

  3. ==============================

    3.새 행 \ n은 StreamHandler 클래스에 삽입됩니다.

    새 행 \ n은 StreamHandler 클래스에 삽입됩니다.

    이 동작을 수정하려고한다면, logging.StreamHandler 클래스 안에 emit (self, record) 메소드를 패치하는 원숭이에 의해 이것을 어떻게 해결했는지 예가 있습니다.

    다음은 줄 바꿈을 생략 한 emit ()의 사용자 정의 구현입니다.

    def customEmit(self, record):
        # Monkey patch Emit function to avoid new lines between records
        try:
            msg = self.format(record)
            if not hasattr(types, "UnicodeType"): #if no unicode support...
                self.stream.write(msg)
            else:
                try:
                    if getattr(self.stream, 'encoding', None) is not None:
                        self.stream.write(msg.encode(self.stream.encoding))
                    else:
                        self.stream.write(msg)
                except UnicodeError:
                    self.stream.write(msg.encode("UTF-8"))
            self.flush()
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)
    

    그런 다음 사용자 정의 로깅 클래스를 작성합니다 (이 경우 TimedRotatingFileHandler의 서브 클래 싱).

    class SniffLogHandler(TimedRotatingFileHandler):
        def __init__(self, filename, when, interval, backupCount=0,
                     encoding=None, delay=0, utc=0):
    
            # Monkey patch 'emit' method
            setattr(StreamHandler, StreamHandler.emit.__name__, customEmit)
    
            TimedRotatingFileHandler.__init__(self, filename, when, interval,
                                              backupCount, encoding, delay, utc)
    

    어떤 사람들은 이러한 유형의 해결책이 파이 톤 (Pythonic)이 아니거나 무엇이든간에 논쟁 할 수 있습니다. 그렇게 될 수도 있으므로 조심하십시오.

    또한,이 작업은 SteamHandler.emit (...)을 전역 적으로 패치하므로 여러 로깅 클래스를 사용하는 경우이 패치는 다른 로깅 클래스에도 영향을줍니다.

    자세한 내용은 다음을 확인하십시오.

    희망이 도움이됩니다.

  4. from https://stackoverflow.com/questions/7168790/suppress-newline-in-python-logging-module by cc-by-sa and MIT license