Logging.config.dictConfig'in eksiksiz bir örneği nerede?


Yanıtlar:


201

Buraya ne dersin!

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
        },
    } 
}

Kullanımı:

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

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

Üçüncü taraf paketlerinden çok fazla günlük görürseniz, bu yapılandırmayı önceden kullanarak çalıştırdığınızdan emin olun.logging.config.dictConfig(LOGGING_CONFIG) üçüncü taraf paketleri içe aktarılmadan .

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


11
rootKaydediciyi belirtmek için alternatif bir yer var : sözlüğün en üst seviyesinde. Dokümanlarda açıklanmıştır , her ['loggers']['']ikisinin de mevcut olduğu zamana göre tercihi vardır, ancak bana göre ['loggers']['']daha mantıklıdır. Ayrıca tartışma bakın burada
Antony Hatchkins

2
Python logging.config belgelerindeki tüm bu özlü, güzel YAML parçacıkları doğrudan okunamaz. Aylak.
JimB

Bu django'ya özgü değil mi? Ya farklı bir çerçeve (Flask, Bottle vb.) Kullanıyorsam ya da bir web uygulaması üzerinde çalışmıyorsam?
Adam Parkin

Bu bir hile gibi hissettiriyor, 'disable_existing_loggers': Falseçünkü o zaman belki tüm kumaşı yapılandırmıyorsunuz, ama belki zaten var olan bir şeyi yeniden kullanıyorsunuz .. O zaman ayarlarsanız Trueherhangi bir çıktı alamıyorum.
Nick T

Merhaba @Dave, nasıl bir özel sınıfını kullanabilirsiniz formatgelen formatters?
Rafa Acioly

40

Kabul edilen cevap güzel! Ama ya kişi daha az karmaşık bir şeyle başlayabilirse? Günlük kaydı modülü çok güçlü bir şey ve dokümantasyon özellikle acemi kullanıcılar için biraz ezici. Ancak başlangıç ​​için biçimlendiricileri ve işleyicileri yapılandırmanıza gerek yoktur. Ne istediğini anladığında ekleyebilirsin.

Örneğin:

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')

Bu, en azından benim durumumda daha alakalı / faydalı bir örnektir. logging.info('Hello, log')İşlerin benim için tıkanmasını sağlayan finaldi. Belgelerdeki karışıklık, dictConfig ile artık getLoggerbu eylemleri gerçekleştirmemize gerek kalmamasıdır .
Mike Williamson

@theotheo Boş anahtarı '': { 'level': 'INFO'...ve neden bu olmadan çalışmadığını açıklayabilir misiniz (örneğin, boş değeristandard
user9074332

1
@MikeWilliamson: getLogger()Farklı adlara sahip birden fazla kaydedici istiyorsanız yine de aramak faydalı olabilir . Bu kaydedicilerin her biri yapılandırmayı kök kaydediciden devralır.
Elias Strehle

3
@MikeWilliamson getLoggerher zaman isteğe bağlıdır. logging.info()Yöntemi doğrudan kullanırken, kök kaydedici kullanılırken, getLogger()farklı ad ve seviyelerde farklı kaydedicilere sahip olabilirsiniz.
sox, Monica ile

8

Akış İşleyici, Dosya İşleyici, Dönen Dosya İşleyici ve SMTP İşleyici ile örnek

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

Aşağıda Django v1.11.15 varsayılan yapılandırmasını buldum , umarım yardımcı olur

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
Bu örnek iyidir, ancak kabul edilen cevabın ötesinde sıyrılmak için bazı açıklamaların yardımcı olacağını düşünüyorum.
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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.