라이브러리 개발자를 위한 NullHandler

Jul 25, 2018

로깅에서 FileHanlder, StreamHandler 등의 핸들러는 로그를 어디에 남길것인지를 지정하는 역할을 하고, Formatter 는 로그를 남기는 형식을 지정할 수 있다. 그리고 Filter 는 그 로그 안에서 필터링 기능을 수행할 수 있다.

그런데 NullHandler 는 몰까?

설명에 따르면 어떤 포맷이나 출력을 가지지 않는다고 하고 이것은 no-op handler 로 라이브러리 개발자에게 필수적이라고 한다. 왜 라이브러 개발자에게 필수적일까? 그에 대한 답은 Configuring Loggin for a Library 에서 찾을 수 있다.

결국 로깅의 출력에 대한 부분은 전적으로 해당 라이브러리를 사용하는 어플리케이션 개발자에게 맡겨야 한다는 이야기이다. 그리고 라이브러리는 NullHandler 를 통해서 로그가 전달될 곳에서 메세지만 전달하고 실제 출력은 어플리케이션 로깅구성에서 어떻게 할 것인지 정하라는 것이다.

우리가 자주 사용하는 requests 라이브러리에서 NullHandler 의 사용 흔적을 찾을 수가 있다. requests 의 __init__.py 의 하단에는 NullHandler 를 추가하는 부분을 볼 수 있는데 python3.1 이상부터 지원하기 때문에 ImportError 발생시, NullHandler 클래스를 선언해서 핸들러로 넣고 있다.

    # reqeusts/requests/__init__.py 
    # Set default logging handler to avoid "No handler found" warnings.
    import logging
    try:  # Python 2.7+
        from logging import NullHandler
    except ImportError:
        class NullHandler(logging.Handler):
            def emit(self, record):
                pass

    logging.getLogger(__name__).addHandler(NullHandler())

Reference


#logging  #Python  #nullhandler