ตัวอย่างที่สมบูรณ์ของ 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
ตัวอย่าง YAML ที่กระชับและสวยงามทั้งหมดในเอกสาร python logging.config ไม่สามารถอ่านได้โดยตรง คนเกียจคร้าน
JimB

django นี้ไม่เฉพาะหรือไม่? จะเกิดอะไรขึ้นถ้าฉันใช้กรอบงานอื่น (ขวดขวด ฯลฯ ) หรือไม่ได้ทำงานบนเว็บแอปพลิเคชัน
Adam Parkin

รู้สึกเหมือนเป็นการโกงด้วย'disable_existing_loggers': Falseเพราะคุณอาจจะไม่ได้กำหนดค่ามันทั้งผืน แต่อาจจะนำบางอย่างที่มีอยู่แล้วกลับมาใช้ใหม่ .. ถ้าคุณตั้งค่าเป็นTrueแล้วฉันก็ดูเหมือนจะไม่ได้รับผลลัพธ์ใด ๆ
Nick T

สวัสดี @Dave ฉันจะใช้คลาสที่กำหนดเองได้อย่างไรformatจากformatters?
Rafa Acioly

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()หากคุณต้องการให้คนตัดไม้หลายคนมีชื่อต่างกัน ตัวตัดไม้แต่ละตัวจะสืบทอดการกำหนดค่าจาก root logger
Elias Strehle

3
@MikeWilliamson getLoggerเป็นทางเลือกเสมอ เมื่อใช้logging.info()วิธีนี้โดยตรงจะใช้ root logger ในขณะที่getLogger()คุณสามารถมี loggers ที่แตกต่างกันโดยมีชื่อและระดับที่แตกต่างกัน
sox กับ Monica

8

ตัวอย่างด้วย Stream Handler, File Handler, Rotating File Handler และ SMTP Handler

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.