জ্যাঙ্গো সেটআপ ডিফল্ট লগিং


94

আমার জ্যাঙ্গো ইনস্টলেশনের জন্য কীভাবে একটি "ডিফল্ট" লগার সেটআপ করবেন তা আমি বুঝতে পারি না। আমি জ্যাঙ্গো 1.3 এর নতুন LOGGINGসেটিংটি ব্যবহার করতে চাই settings.py

আমি জ্যাঙ্গো লগিং ডকের উদাহরণটি দেখেছি , তবে আমার কাছে মনে হচ্ছে তারা কেবলমাত্র সেটআপ হ্যান্ডলার সেট করে যা নির্দিষ্ট লগারের জন্য লগিং করবে। তাদের উদাহরণের ক্ষেত্রে তারা 'জ্যাঙ্গো', 'জ্যাঞ্জো.রেকোয়েস্ট' এবং 'মাইপ্রজেক্টস কাস্টম' নামের লগারের জন্য হ্যান্ডলার সেটআপ করে।

আমি যা করতে চাই তা হ'ল একটি ডিফল্ট সেটআপ করা logging.handlers.RotatingFileHandlerযা ডিফল্টরূপে সমস্ত লগারকে পরিচালনা করবে। উদাহরণস্বরূপ, যদি আমি আমার প্রকল্পের কোথাও একটি নতুন মডিউল তৈরি করি এবং এটির মতো কিছু দ্বারা বোঝানো হয়:, আমার এটি করা my_app_name.my_new_moduleউচিত এবং সমস্ত লগইন ঘোরানো ফাইল লগের সাথে থাকা উচিত।

# In file './my_app_name/my_new_module.py'
import logging
logger = logging.getLogger('my_app_name.my_new_module')
logger.debug('Hello logs!') # <-- This should get logged to my RotatingFileHandler that I setup in `settings.py`!

উত্তর:


154

এটি বের করে ...

আপনি খালি স্ট্রিং সঙ্গে এটি উল্লেখ দ্বারা 'সব ধরতে' এটির সেট করুন: ''

উদাহরণস্বরূপ, নিম্নলিখিত সেটআপে আমার সমস্ত লগ ইভেন্টগুলি সংরক্ষণ করা হয়েছে logs/mylog.log, django.requestলগ ইভেন্টগুলি ব্যতীত সংরক্ষণ করা হবে logs/django_request.log। কারণ আমার লগারের জন্য 'propagate'সেট করা আছে , লগ ইভেন্টটি 'ক্যাচ অল' লগারে কখনই পৌঁছায় না।Falsedjango.request

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/mylog.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },  
        'request_handler': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/django_request.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },
    },
    'loggers': {
        '': {
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': True
        },
        'django.request': {
            'handlers': ['request_handler'],
            'level': 'DEBUG',
            'propagate': False
        },
    }
}

4
ক্রিস, এতে জ্যাঙ্গো ডক্স বিভ্রান্তিকর নয়। এর জন্য ধন্যবাদ.

5
ক্ষুদ্র সংশোধন: মন্তব্যে বোঝা যাচ্ছে যে এসকিএল লগিং django.request লগারের দ্বারা প্রভাবিত হবে। স্কয়ার লগিং পুনর্নির্দেশ করতে, আপনি 'django.db' এর জন্য একটি লগার সংজ্ঞায়িত করবেন। Django.request লগার 5XX এবং 4xx HTTP প্রতিক্রিয়াগুলি পরিচালনা করে।
rych

এতে আমার মতো অন্যান্য নুবগুলিকে সহায়তা করে: লগার লগ ফাইলগুলি তৈরি করবে তবে আপনাকে logs/প্রথমে ফোল্ডারটি তৈরি করতে হবে :-)। অন্যথায় আপনি চালানোর সময় একটি ত্রুটি পাবেন ./manange.py runserver। @ ক্রিস ডব্লিউ। আপনার উদাহরণ লগিং সেটিংসের জন্য ধন্যবাদ। এটি আমাকে অনেক সাহায্য করেছে!
hobbes3

4
@ অরিন্দমরোয়চৌধুরী উপরের কনফিগারেশনের সাহায্যে যদি আপনি এটি করেন logger = logging.getLogger('foo'); logger.warn('bar');তবে defaultহ্যান্ডলার সেই লগিংটি ধরবে এবং এর মতো কিছু <time> WARN: foo: barশেষ হবেlogs/mylog.log
ক্রিস ডাব্লু

8
ধন্যবাদ মনে হচ্ছে এটি '' এর অর্থ রুট লগার। জাজানো ডকুমেন্টেশনে এই দরকারী টুকরোটির তথ্য পাওয়া যায়নি।
Eino Mäkitalo

25

হিসাবে আপনি বলেন আপনার উত্তর , ক্রিস, একটি ডিফল্ট এটির সংজ্ঞায়িত করতে একটি বিকল্প তার কী-এর মত খালি স্ট্রিং ব্যবহার করা হয়।

যাইহোক, আমি মনে করি উদ্দেশ্যযুক্ত উপায় হ'ল rootলগিং কনফিগারেশন অভিধানের কী এর অধীনে একটি বিশেষ লগারকে সংজ্ঞায়িত করা । আমি পাইথন ডকুমেন্টেশনে এটি পেয়েছি :

রুট - এটি রুট লগারের জন্য কনফিগারেশন হবে। কনফিগারেশন প্রক্রিয়াজাতকরণ কোনও লগার হিসাবে থাকবে, ব্যতীত propagateসেটিংস প্রযোজ্য হবে না।

rootকীটি ব্যবহার করতে আপনার উত্তর থেকে কনফিগারেশনটি পরিবর্তিত হয়েছে :

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/mylog.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },  
        'request_handler': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/django_request.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },
    },
    'root': {
        'handlers': ['default'],
        'level': 'DEBUG'
    },
    'loggers': {
        'django.request': {
            'handlers': ['request_handler'],
            'level': 'DEBUG',
            'propagate': False
        },
    }
}

পরিষ্কার কথা বলতে গেলে, আমি দুটি কনফিগারেশনের মধ্যে আচরণের কোনও পার্থক্য দেখতে পাচ্ছি না। এটি উপস্থিত হয় যে খালি স্ট্রিং কী দিয়ে একটি লগারকে সংজ্ঞায়িত করা রুট লগারকে সংশোধন করবে, কারণ logging.getLogger('')রুট লগারটি ফিরে আসবে।

আমি 'root'তার ''চেয়ে বেশি পছন্দ করি কারণ এটি রুট লগারটি সংশোধন করার ক্ষেত্রে স্পষ্ট। আপনি যদি কৌতূহলী ছিলেন তবে আপনি উভয়কেই সংজ্ঞায়িত করলে 'root'ওভাররাইডগুলি ''কেবলমাত্র রুট এন্ট্রিটি শেষ প্রক্রিয়াজাত হওয়ার কারণে।


হ্যাঁ, এটা ঠিক, দুষ্কারের জন্য দুঃখিত! যদিও 'রুট' এর পরিবর্তে '' ব্যবহার করা কিছুটা যৌক্তিক, তবুও আমি rootডিকটির মূলটিতে প্রবেশ করতে অন্যথায় ২.6 ফাইলকনফিগ যুক্তি থেকে ২.7 ডক্টনফাইগ-এ যুক্ত করতে কিছুটা অসঙ্গত মনে করি।
অ্যান্টনি হ্যাচকিন্স

2
import logging
logger = logging.getLogger(__name__)

যুক্ত করার পরে:

logging.basicConfig(
    level = logging.DEBUG,
    format = '%(name)s %(levelname)s %(message)s',
)

আমরা এতে ফর্ম্যাটটি পরিবর্তন করতে পারি:

format = '"%(levelname)s:%(name)s:%(message)s"  ',

বা

format = '%(name)s %(asctime)s %(levelname)s %(message)s',

0

যখন rootকী এবং খালি ''লগর উভয়ই কনফিগারেশন ডিকটিতে উল্লেখ করা হয় তখন কোন কনফিগারেশন ব্যবহার করা হয় তা পরীক্ষা করার জন্য আমি একটি দ্রুত নমুনা তৈরি করেছি made

import logging.config

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'fmt1': {
            'format': '[FMT1] %(asctime)-15s %(message)s',
        },
        'fmt2': {
            'format': '[FMT2] %(asctime)-15s %(message)s',
        }
    },
    'handlers': {
        'console1': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'fmt1',
        },
        'console2': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'fmt2',
        },
    },
    # First config for root logger: console1 -> fmt1
    'root': {
        'handlers': ['console1'],
        'level': 'DEBUG',
        'propagate': True,
    },
    'loggers': {
        # Second config for root logger: console2 -> fmt2
        '': {
            'handlers': ['console2'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

logging.config.dictConfig(LOGGING)

l1 = logging.getLogger()
l2 = logging.getLogger('')
root = logging.root

l1.info("l1")
l2.info("l2")
root.info("root logger")

নিম্নলিখিত ফলাফল মুদ্রণ:

[FMT1] 2018-12-18 17:24:47,691 l1
[FMT1] 2018-12-18 17:24:47,691 l2
[FMT1] 2018-12-18 17:24:47,691 root logger

rootকী অধীনে কনফিগারেশন সর্বোচ্চ অগ্রাধিকার রয়েছে তা ইঙ্গিত করে । যদি ব্লকটি সরিয়ে ফেলা হয়, ফলাফল:

[FMT2] 2018-12-18 17:25:43,757 l1
[FMT2] 2018-12-18 17:25:43,757 l2
[FMT2] 2018-12-18 17:25:43,757 root logger

উভয় ক্ষেত্রে, আমি ডিবাগ এবং নির্ধারণ তিনটি গাছ কাটতে (পেরেছিলেন l1, l2এবং root) রেফারেন্সড একই এটির উদাহরণস্বরূপ, রুট এটির।

আশা করি এটি অন্যদেরকেও সহায়তা করবে যারা আমার মতো, রুট লগারটি কনফিগার করার জন্য 2 টি বিভিন্ন উপায়ে বিভ্রান্ত হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.