[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.이 문제에 대한 해결책을 찾았습니다.
이 문제에 대한 해결책을 찾았습니다.
logger = logging.getLogger('my-logger') logger.propagate = False # now if you use logger it will not log to console.
이렇게하면 로깅이 콘솔 로깅을 포함하는 상위 로거로 보내지지 않습니다.
-
==============================
2.나는 사용한다:
나는 사용한다:
logger = logging.getLogger() logger.disabled = True ... whatever you want ... logger.disabled = False
-
==============================
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.(오랫동안 죽은 질문이지만 미래의 검색 사용자를위한)
(오랫동안 죽은 질문이지만 미래의 검색 사용자를위한)
원래 포스터의 코드 / 의도에 더 가까이,이 날 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.컨텍스트 관리자
컨텍스트 관리자
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.여기에 몇 가지 좋은 답변이 있지만 분명히 가장 단순한 것은 너무 많은 것을 고려하지 않았습니다 (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.로깅을 완전히 비활성화하려면 다음과 같이하십시오.
로깅을 완전히 비활성화하려면 다음과 같이하십시오.
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.stdout을 돌릴 필요가 없습니다. 여기에 더 좋은 방법이 있습니다.
stdout을 돌릴 필요가 없습니다. 여기에 더 좋은 방법이 있습니다.
import logging class MyLogHandler(logging.Handler): def emit(self, record): pass logging.getLogger().addHandler(MyLogHandler())
보다 간단한 방법은 다음과 같습니다.
logging.getLogger().setLevel(100)
-
==============================
9.나는 로깅 모듈을 잘 이해하지 못한다. 그러나 디버깅 (또는 정보) 메시지 만 비활성화하려는 방식으로 사용하고있다. Handler.setLevel ()을 사용하여 로깅 수준을 CRITICAL 이상으로 설정할 수 있습니다.
나는 로깅 모듈을 잘 이해하지 못한다. 그러나 디버깅 (또는 정보) 메시지 만 비활성화하려는 방식으로 사용하고있다. Handler.setLevel ()을 사용하여 로깅 수준을 CRITICAL 이상으로 설정할 수 있습니다.
또한 sys.stderr 및 sys.stdout을 쓰기 위해 열어 놓은 파일로 바꿀 수 있습니다. http://docs.python.org/library/sys.html#sys.stdout을 참조하십시오. 그러나 나는 그것을 추천하지 않을 것이다.
-
==============================
10.너는 또한 할 수 있었다 :
너는 또한 할 수 있었다 :
handlers = app.logger.handlers # detach console handler app.logger.handlers = [] # attach app.logger.handlers = handlers
-
==============================
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
from https://stackoverflow.com/questions/2266646/how-to-i-disable-and-re-enable-console-logging-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 OpenSSL AES 암호화 파일을 해독하는 방법은 무엇입니까? (0) | 2018.10.06 |
---|---|
[PYTHON] 파이썬 : 런타임시 메소드와 속성 변경하기 (0) | 2018.10.06 |
[PYTHON] 파이썬으로 mp3 메타 데이터에 접근하기 (0) | 2018.10.06 |
[PYTHON] Django : 이미지 URL에서 ImageField에 이미지 추가 (0) | 2018.10.06 |
[PYTHON] 목록에서 항목의 위치를 얻는 방법? (0) | 2018.10.06 |