logging.config.dictConfig의 완전한 예는 어디에 있습니까?


133

dictConfig 를 사용하고 싶지만 설명서는 약간 추상적입니다. 에서 사용되는 사전의 구체적인 복사 + 붙여 넣기 가능한 예는 어디에서 찾을 수 있습니까 dictConfig?

답변:


201

여기는 어떻습니까!

LOGGING_CONFIG = { 
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': { 
        'standard': { 
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': { 
        'default': { 
            'level': 'INFO',
            'formatter': 'standard',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',  # Default is stderr
        },
    },
    'loggers': { 
        '': {  # root logger
            'handlers': ['default'],
            'level': 'WARNING',
            'propagate': False
        },
        'my.packg': { 
            'handlers': ['default'],
            'level': 'INFO',
            'propagate': False
        },
        '__main__': {  # if __name__ == '__main__'
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': False
        },
    } 
}

용법:

# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)

# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")

타사 패키지의 로그가 너무 많은 경우 이전을 사용하여이 구성을 실행 logging.config.dictConfig(LOGGING_CONFIG) 해야합니다. 타사 패키지를 가져 .

참조 : https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema


11
root로거 를 지정하기위한 대체 장소 가 사전의 최상위 레벨에 있습니다. 그것은 문서에 설명되어 있으며 ['loggers']['']둘 다 존재할 때보 다 선호도 가 있지만 내 의견으로 ['loggers']['']는 더 논리적입니다. 여기에서
Antony Hatchkins

2
python logging.config 문서의 간결하고 아름다운 YAML 스 니펫은 모두 직접 읽을 수 없습니다. 버머.
JimB

이 장고 특정 아닌가요? 다른 프레임 워크 (Flask, Bottle 등)를 사용하거나 웹 응용 프로그램에서 작업하지 않는 경우 어떻게합니까?
Adam Parkin

'disable_existing_loggers': False전체 천을 구성하지 않았을 수도 있고 이미 존재하는 것을 재사용 할 수도 있기 때문에 속임수처럼 느껴집니다 True.
Nick T

안녕하세요 @ 데이브는 어떻게에서 사용자 정의 클래스를 사용할 수 있습니다 format에서 formatters?
Rafa Acioly 19

40

받아 들여진 대답은 좋습니다! 그러나 덜 복잡한 것으로 시작할 수 있다면 어떨까요? 로깅 모듈은 매우 강력하며 문서는 초보자에게 특히 압도적입니다. 그러나 처음에는 포맷터와 핸들러를 구성 할 필요가 없습니다. 원하는 것을 알아낼 때 추가 할 수 있습니다.

예를 들면 다음과 같습니다.

import logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'loggers': {
        '': {
            'level': 'INFO',
        },
        'another.module': {
            'level': 'DEBUG',
        },
    }
}

logging.config.dictConfig(DEFAULT_LOGGING)

logging.info('Hello, log')

이것은 적어도 내 경우에는 더 관련성이 있고 유용한 예입니다. 일이 logging.info('Hello, log')나를 위해 클릭하게 만든 것이 마지막 이었습니다. 설명서의 혼동은 dictConfig를 사용하여 더 이상 수행 할 필요가 없다는 것 getLogger입니다.
Mike Williamson

@theotheo 빈 키 '': { 'level': 'INFO'...와 그 키가 없는 이유 (예 : 빈 값을 다음과 같은 유효한 값으로 변경하는 경우)standard
user9074332

1
@MikeWilliamson : 그러나 getLogger()이름이 다른 여러 로거를 원할 경우 여전히 전화 하는 것이 유용 할 수 있습니다 . 이러한 각 로거는 루트 로거의 구성을 상속합니다.
Elias Strehle

3
@MikeWilliamson getLogger은 항상 선택 사항입니다. 이 logging.info()방법을 직접 사용하면 루트 로거가 사용되지만 getLogger()이름과 레벨이 다른 로거를 가질 수 있습니다.
Monica

8

스트림 처리기, 파일 처리기, 회전 파일 처리기 및 SMTP 처리기가있는 예

from logging.config import dictConfig

LOGGING_CONFIG = {
    'version': 1,
    'loggers': {
        '': {  # root logger
            'level': 'NOTSET',
            'handlers': ['debug_console_handler', 'info_rotating_file_handler', 'error_file_handler', 'critical_mail_handler'],
        },
        'my.package': { 
            'level': 'WARNING',
            'propagate': False,
            'handlers': ['info_rotating_file_handler', 'error_file_handler' ],
        },
    },
    'handlers': {
        'debug_console_handler': {
            'level': 'DEBUG',
            'formatter': 'info',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',
        },
        'info_rotating_file_handler': {
            'level': 'INFO',
            'formatter': 'info',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'info.log',
            'mode': 'a',
            'maxBytes': 1048576,
            'backupCount': 10
        },
        'error_file_handler': {
            'level': 'WARNING',
            'formatter': 'error',
            'class': 'logging.FileHandler',
            'filename': 'error.log',
            'mode': 'a',
        },
        'critical_mail_handler': {
            'level': 'CRITICAL',
            'formatter': 'error',
            'class': 'logging.handlers.SMTPHandler',
            'mailhost' : 'localhost',
            'fromaddr': 'monitoring@domain.com',
            'toaddrs': ['dev@domain.com', 'qa@domain.com'],
            'subject': 'Critical error with application name'
        }
    },
    'formatters': {
        'info': {
            'format': '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
        },
        'error': {
            'format': '%(asctime)s-%(levelname)s-%(name)s-%(process)d::%(module)s|%(lineno)s:: %(message)s'
        },
    },

}

dictConfig(LOGGING_CONFIG)

4

아래 에서 Django v1.11.15 기본 구성을 찾았 습니다.

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[%(server_time)s] %(message)s',
        }
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}

4
이 예는 괜찮지 만, 나는 받아 들여진 대답을 뛰어 넘을 것이라고 생각합니다. 일부 설명이 도움이 될 것입니다.
Mike Williamson

-7
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import logging.handlers
from logging.config import dictConfig

logger = logging.getLogger(__name__)

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
}
def configure_logging(logfile_path):
    """
    Initialize logging defaults for Project.

    :param logfile_path: logfile used to the logfile
    :type logfile_path: string

    This function does:

    - Assign INFO and DEBUG level to logger file handler and console handler

    """
    dictConfig(DEFAULT_LOGGING)

    default_formatter = logging.Formatter(
        "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s",
        "%d/%m/%Y %H:%M:%S")

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8')
    file_handler.setLevel(logging.INFO)

    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)

    file_handler.setFormatter(default_formatter)
    console_handler.setFormatter(default_formatter)

    logging.root.setLevel(logging.DEBUG)
    logging.root.addHandler(file_handler)
    logging.root.addHandler(console_handler)



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.