복붙노트

[PYTHON] 파이썬에서 콘솔 로깅을 비활성화하고 다시 활성화하는 방법은 무엇입니까?

PYTHON

파이썬에서 콘솔 로깅을 비활성화하고 다시 활성화하는 방법은 무엇입니까?

파이썬의 로깅 모듈을 사용하고 있으며 얼마 동안 콘솔 로깅을 비활성화하려고하지만 작동하지 않습니다.

#!/usr/bin/python
import logging

logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers 
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)

print logger.handlers 
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep

logger.debug("bla bla")

위의 코드는 stdout에 bla bla를 표시하고 어떻게 콘솔 처리기를 안전하게 비활성화 할 수 있는지 알지 못합니다. 어떻게하면 콘솔 StreamHandler를 일시적으로 제거 할 수 있습니까?

해결법

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

    1.이 문제에 대한 해결책을 찾았습니다.

    이 문제에 대한 해결책을 찾았습니다.

    logger = logging.getLogger('my-logger')
    logger.propagate = False
    # now if you use logger it will not log to console.
    

    이렇게하면 로깅이 콘솔 로깅을 포함하는 상위 로거로 보내지지 않습니다.

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

    2.나는 사용한다:

    나는 사용한다:

    logger = logging.getLogger()
    logger.disabled = True
    ... whatever you want ...
    logger.disabled = False
    
  3. ==============================

    3.당신이 사용할 수있는:

    당신이 사용할 수있는:

    logging.basicConfig(level=your_level)
    

    your_level은 다음 중 하나입니다.

          'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL
    

    따라서 your_level을 logging.CRITICAL로 설정하면 다음에서 보낸 중요한 메시지 만 받게됩니다.

    logging.critical('This is a critical error message')
    

    your_level을 logging.DEBUG로 설정하면 모든 로깅 수준이 표시됩니다.

    자세한 내용은 로깅 예제를 참조하십시오.

    각 Handler의 레벨을 변경하는 것과 같은 방법으로 Handler.setLevel () 함수를 사용하십시오.

    import logging
    import logging.handlers
    
    LOG_FILENAME = '/tmp/logging_rotatingfile_example.out'
    
    # Set up a specific logger with our desired output level
    my_logger = logging.getLogger('MyLogger')
    my_logger.setLevel(logging.DEBUG)
    
    # Add the log message handler to the logger
    handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=20, backupCount=5)
    
    handler.setLevel(logging.CRITICAL)
    
    my_logger.addHandler(handler)
    
  4. ==============================

    4.(오랫동안 죽은 질문이지만 미래의 검색 사용자를위한)

    (오랫동안 죽은 질문이지만 미래의 검색 사용자를위한)

    원래 포스터의 코드 / 의도에 더 가까이,이 날 Python 2.6에서 작동합니다

    #!/usr/bin/python
    import logging
    
    logger = logging.getLogger() # this gets the root logger
    
    lhStdout = logger.handlers[0]  # stdout is the only handler initially
    
    # ... here I add my own handlers 
    f = open("/tmp/debug","w")          # example handler
    lh = logging.StreamHandler(f)
    logger.addHandler(lh)
    
    logger.removeHandler(lhStdout)
    
    logger.debug("bla bla")
    

    내가 해결해야했던 문제는 새로운 것을 추가 한 후에 stdout 핸들러를 제거하는 것이 었습니다. 로거 코드는 핸들러가 없으면 stdout을 자동으로 다시 추가합니다.

  5. ==============================

    5.컨텍스트 관리자

    컨텍스트 관리자

    import logging 
    class DisableLogger():
        def __enter__(self):
           logging.disable(logging.CRITICAL)
        def __exit__(self, a, b, c):
           logging.disable(logging.NOTSET)
    

    사용 예 :

    with DisableLogger():
        do_something()
    
  6. ==============================

    6.여기에 몇 가지 좋은 답변이 있지만 분명히 가장 단순한 것은 너무 많은 것을 고려하지 않았습니다 (infinito에서만 제공).

    여기에 몇 가지 좋은 답변이 있지만 분명히 가장 단순한 것은 너무 많은 것을 고려하지 않았습니다 (infinito에서만 제공).

    root_logger = logging.getLogger()
    root_logger.disabled = True
    

    이렇게하면 루트 로거 및 다른 모든 로거가 비활성화됩니다. 나는 정말로 테스트하지는 않았지만 또한 가장 빠르다.

    파이썬 2.7의 로깅 코드에서 보았습니다.

    def handle(self, record):
        """
        Call the handlers for the specified record.
    
        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        """
        if (not self.disabled) and self.filter(record):
            self.callHandlers(record)
    

    즉, 사용하지 않도록 설정하면 처리기가 호출되지 않으며 매우 높은 값으로 필터링하거나 예를 들어 no-op 처리기를 설정하는 것이 더 효율적이어야합니다.

  7. ==============================

    7.로깅을 완전히 비활성화하려면 다음과 같이하십시오.

    로깅을 완전히 비활성화하려면 다음과 같이하십시오.

    logging.disable(sys.maxint)
    

    로깅을 활성화하려면 :

    logging.disable(logging.NOTSET)
    

    다른 답변은 다음과 같이 문제를 완전히 해결하지 못하는 해결 방법을 제공합니다.

    logging.getLogger().disabled = True
    

    50보다 큰 일부 n의 경우,

    logging.disable(n)
    

    첫 번째 솔루션의 문제점은 루트 로거에서만 작동한다는 것입니다. logging.getLogger (__ name__)를 사용하여 생성 된 다른 로거는이 메소드로 비활성화되지 않습니다.

    두 번째 솔루션은 모든 로그에 영향을 미칩니다. 그러나 출력을 주어진 레벨 이상으로 제한하기 때문에 50보다 큰 레벨로 로깅함으로써 출력을 무시할 수 있습니다.

    그것으로 예방할 수있다.

    logging.disable(sys.maxint)
    

    (소스를 검토 한 후에) 로깅을 완전히 비활성화 할 수있는 유일한 방법입니다.

  8. ==============================

    8.stdout을 돌릴 필요가 없습니다. 여기에 더 좋은 방법이 있습니다.

    stdout을 돌릴 필요가 없습니다. 여기에 더 좋은 방법이 있습니다.

    import logging
    class MyLogHandler(logging.Handler):
        def emit(self, record):
            pass
    
    logging.getLogger().addHandler(MyLogHandler())
    

    보다 간단한 방법은 다음과 같습니다.

    logging.getLogger().setLevel(100)
    
  9. ==============================

    9.나는 로깅 모듈을 잘 이해하지 못한다. 그러나 디버깅 (또는 정보) 메시지 만 비활성화하려는 방식으로 사용하고있다. Handler.setLevel ()을 사용하여 로깅 수준을 CRITICAL 이상으로 설정할 수 있습니다.

    나는 로깅 모듈을 잘 이해하지 못한다. 그러나 디버깅 (또는 정보) 메시지 만 비활성화하려는 방식으로 사용하고있다. Handler.setLevel ()을 사용하여 로깅 수준을 CRITICAL 이상으로 설정할 수 있습니다.

    또한 sys.stderr 및 sys.stdout을 쓰기 위해 열어 놓은 파일로 바꿀 수 있습니다. http://docs.python.org/library/sys.html#sys.stdout을 참조하십시오. 그러나 나는 그것을 추천하지 않을 것이다.

  10. ==============================

    10.너는 또한 할 수 있었다 :

    너는 또한 할 수 있었다 :

    handlers = app.logger.handlers
    # detach console handler
    app.logger.handlers = []
    # attach
    app.logger.handlers = handlers
    
  11. ==============================

    11.

    import logging
    
    log_file = 'test.log'
    info_format = '%(asctime)s - %(levelname)s - %(message)s'
    logging.config.dictConfig({
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'info_format': {
                'format': info_format
            },
        },
        'handlers': {
            'console': {
                'level': 'INFO',
                'class': 'logging.StreamHandler',
                'formatter': 'info_format'
            },
            'info_log_file': {
                'class': 'logging.handlers.RotatingFileHandler',
                'level': 'INFO',
                'filename': log_file,
                'formatter': 'info_format'
            }
        },
        'loggers': {
            '': {
                'handlers': [
                    'console',
                    'info_log_file'
                ],
                'level': 'INFO'
            }
        }
    })
    
    
    class A:
    
        def __init__(self):
            logging.info('object created of class A')
    
            self.logger = logging.getLogger()
            self.console_handler = None
    
        def say(self, word):
            logging.info('A object says: {}'.format(word))
    
        def disable_console_log(self):
            if self.console_handler is not None:
                # Console log has already been disabled
                return
    
            for handler in self.logger.handlers:
                if type(handler) is logging.StreamHandler:
                    self.console_handler = handler
                    self.logger.removeHandler(handler)
    
        def enable_console_log(self):
            if self.console_handler is None:
                # Console log has already been enabled
                return
    
            self.logger.addHandler(self.console_handler)
            self.console_handler = None
    
    
    if __name__ == '__main__':
        a = A()
        a.say('111')
        a.disable_console_log()
        a.say('222')
        a.enable_console_log()
        a.say('333')
    

    콘솔 출력 :

    2018-09-15 15:22:23,354 - INFO - object created of class A
    2018-09-15 15:22:23,356 - INFO - A object says: 111
    2018-09-15 15:22:23,358 - INFO - A object says: 333
    

    test.log 파일 내용 :

    2018-09-15 15:22:23,354 - INFO - object created of class A
    2018-09-15 15:22:23,356 - INFO - A object says: 111
    2018-09-15 15:22:23,357 - INFO - A object says: 222
    2018-09-15 15:22:23,358 - INFO - A object says: 333
    
  12. from https://stackoverflow.com/questions/2266646/how-to-i-disable-and-re-enable-console-logging-in-python by cc-by-sa and MIT license