লগিং.কনফিগ.ডিক্ট কনফিগের সম্পূর্ণ উদাহরণ কোথায়?


133

আমি ডিককনফিগ ব্যবহার করতে চাই , তবে ডকুমেন্টেশনটি কিছুটা বিমূর্ত। আমি কোথায় ব্যবহার করতে চাইছি এর একটি কংক্রিট, অনুলিপি + পেস্ট-সক্ষম উদাহরণ 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#configration-d অভিধান- schema


11
rootলগার নির্দিষ্ট করার জন্য একটি বিকল্প জায়গা রয়েছে : অভিধানের শীর্ষ স্তরে। এটি ডক্সে বর্ণিত হয়েছে , ['loggers']['']উভয় উপস্থিত থাকার চেয়ে তার অগ্রাধিকার রয়েছে তবে আমার মতে ['loggers']['']এটি আরও যুক্তিযুক্ত। এখানে
অ্যান্টনি হ্যাচকিনস

2
পাইথন লগিং.কনফিগ ডক্সে এই সমস্ত সংক্ষিপ্ত, সুন্দর YAML স্নিপেটগুলি সরাসরি সরাসরি পড়া যায় না। হতাশাজনক।
জিমবি

এই জ্যাঙ্গো-নির্দিষ্ট না? আমি যদি কোনও আলাদা কাঠামো (ফ্লাস্ক, বোতল ইত্যাদি) ব্যবহার করি বা ওয়েব অ্যাপ্লিকেশনটিতে কাজ না করি তবে কী হবে?
অ্যাডাম পার্কিন 21

এটির সাথে প্রতারণার মতো মনে হচ্ছে 'disable_existing_loggers': Falseআপনি সম্ভবত এটি পুরো কাপড়টি কনফিগার করছেন না, তবে ইতিমধ্যে সেখানে থাকা কোনও জিনিস পুনরায় ব্যবহার করছেন .. আপনি যদি এটি সেট করেন Trueতবে আমার কোনও আউটপুট পাওয়া যাবে বলে মনে হয় না।
নিক টি

হাই @Dave, আমি কিভাবে একটি কাস্টম বর্গ ব্যবহার করতে পারেন formatথেকে formatters?
রাফা অ্যাসিওলি

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')আমার জন্য জিনিসগুলিকে ক্লিক করে। ডকুমেন্টেশনের বিভ্রান্তি হ'ল ডোকনফনফিগের সাহায্যে আমাদের আর আর getLoggerকোনও ক্রিয়া করার দরকার নেই ।
মাইক উইলিয়ামসন

@ থিথো আপনি খালি কীটি ব্যাখ্যা করতে পারেন '': { 'level': 'INFO'...এবং এটি ব্যতীত কেন কাজ করে না (উদাহরণস্বরূপ ফাঁকা মানটি কোনও বৈধ মান হিসাবে পরিবর্তন করার সময়standard
ব্যবহারকারী 9074332

1
@ মাইকউইলিয়ামসন: getLogger()আপনি বিভিন্ন নাম সহ একাধিক লগার চাইলে এখনও ফোন করা এটি দরকারী । এই লগারগুলির প্রতিটি রুট লগার থেকে কনফিগারেশন উত্তরাধিকার সূত্রে প্রাপ্ত।
এলিয়াস স্ট্রেলে

3
@ মাইক উইলিয়ামসন getLoggerসর্বদা alচ্ছিক । logging.info()পদ্ধতিটি সরাসরি ব্যবহার করার সময় রুট লগারটি ব্যবহার করা হয়, তবে getLogger()আপনার সাথে আলাদা আলাদা নাম এবং স্তর থাকতে পারে log
মনিকা

8

স্ট্রিম হ্যান্ডলার, ফাইল হ্যান্ডলার, ফাইল হ্যান্ডলার এবং এসএমটিপি হ্যান্ডলার ঘোরানো সহ উদাহরণ

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

আমি নীচে জ্যাঙ্গো ভি 1.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
এই উদাহরণটি ভাল, তবে আমি মনে করি গ্রহণযোগ্য উত্তরের বাইরে দাঁড়াতে পারি, কিছু ব্যাখ্যা সাহায্য করবে।
মাইক উইলিয়ামসন

-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.