জ্যাঙ্গোতে পাইথন লগিংয়ের মার্জিত সেটআপ


101

জ্যাঙ্গোর সাথে পাইথন লগিং স্থাপনের উপায় খুঁজে পাইনি যা আমি খুশি। আমার প্রয়োজনীয়তা মোটামুটি সহজ:

  • বিভিন্ন ইভেন্টের জন্য বিভিন্ন লগ হ্যান্ডলার - এটি, আমি বিভিন্ন ফাইলগুলিতে লগ করতে সক্ষম হতে চাই
  • আমার মডিউলগুলিতে লগারে সহজে অ্যাক্সেস। মডিউলটি খুব চেষ্টা করে তার লগারটি সন্ধান করতে সক্ষম হওয়া উচিত।
  • কমান্ড-লাইন মডিউলগুলির জন্য সহজেই প্রযোজ্য। সিস্টেমের অংশগুলি হ'ল একাকী কমান্ড লাইন বা ডেমন প্রক্রিয়া। এই মডিউলগুলির সাহায্যে লগিং সহজেই ব্যবহারযোগ্য।

আমার বর্তমান সেটআপটি হ'ল logging.confআমি যে মডিউল থেকে লগ করেছি সেগুলিতে একটি ফাইল এবং সেটআপ লগিং ব্যবহার করা। এটা ঠিক মনে হচ্ছে না।

আপনার পছন্দ মতো লগিং সেটআপ আছে? দয়া করে এটি বিশদ করুন: আপনি কনফিগারেশনটি কীভাবে সেটআপ করবেন (আপনি logging.confকোডটি ব্যবহার করেন বা সেট আপ করেন), আপনি / কখন লগারগুলি শুরু করেন এবং আপনার মডিউলগুলিতে কীভাবে আপনি এগুলি অ্যাক্সেস পাবেন ইত্যাদি


1
আপনি নীচের স্ক্রিনকাস্ট দরকারী মনে হতে পারে - ericholscher.com/blog/2008/aug/29/… । এছাড়াও, জ্যাঙ্গোতে লগিনের জন্য আরও ভাল সমর্থন প্রস্তাব করেছেন সাইমন উইলিসন (দেখুন সাইমনউইলিসন.ন.২ / ২০০৯ / সেপ / ২৮/ponies )।
ডোমিনিক রজার

@ ডমিনিক রজার - জাজানো অভ্যন্তরীণভাবে লগইন করার সুবিধার্থে সাইমনের প্রস্তাব আপনি ইতিমধ্যে জাজানোতে অ্যাপ্লিকেশনগুলির নমনীয় লগিং করতে পারেন। পাইথন লগিংয়ে অভিধান-ভিত্তিক কনফিগারেশন যুক্ত করার জন্য পাইথনে কাজ রয়েছে, যা থেকে জাঙ্গো উপকৃত হতে পারে।
বিনয় সাজিপ

উত্তর:


57

আমি এখনও অবধি সবচেয়ে ভাল উপায়টি খুঁজে পেয়েছি সেটিংস.পি-এ লগিং সেটআপ শুরু করা - অন্য কোথাও নেই। আপনি হয় একটি কনফিগারেশন ফাইল ব্যবহার করতে পারেন বা এটি ধাপে ধাপে প্রোগ্রামিয়ালি করতে পারেন - এটি কেবল আপনার প্রয়োজনীয়তার উপর নির্ভর করে। মূল কথাটি হ'ল আমি সাধারণত যে ল্যান্ডারে লট করতে চাই এবং লেভেল এবং কখনও কখনও লগিং করতে চাই সেই হ্যান্ডলারগুলি যুক্ত করি I ফিল্টারগুলি আমার প্রয়োজনীয় ফাইলগুলি, কনসোল, সিসলাগ ইত্যাদিতে পেতে চাইলে অবশ্যই অন্য যে কোনও লগারে হ্যান্ডলার যুক্ত করতে পারেন খুব বেশি, তবে আমার অভিজ্ঞতায় সাধারণত এটির প্রয়োজন হয় না।

প্রতিটি মডিউলে, আমি লগার ব্যবহার করে সংজ্ঞায়িত করি

logger = logging.getLogger(__name__)

এবং মডিউলটিতে লগিং ইভেন্টগুলির জন্য এটি ব্যবহার করুন (এবং আমি আরও আলাদা করতে চাইলে) একটি লগার ব্যবহার করুন যা উপরে তৈরি লগারের শিশু।

যদি আমার অ্যাপ্লিকেশনটি এমন কোনও সাইটে ব্যবহার করতে চলেছে যা সেটিংস.পাই-তে লগিং কনফিগার করে না তবে আমি কোথাও একটি নালহ্যান্ডলার সংজ্ঞায়িত করেছি:

#someutils.py

class NullHandler(logging.Handler):
    def emit(self, record):
        pass

null_handler = NullHandler()

এবং লগিং ব্যবহার করে এমন আমার অ্যাপ্লিকেশনগুলিতে মডিউলগুলিতে তৈরি সমস্ত লগারে এর একটি উদাহরণ যুক্ত করা হয়েছে তা নিশ্চিত করুন। (দ্রষ্টব্য: নুলহ্যান্ডলার পাইথন ৩.১ এর জন্য লগিং প্যাকেজে ইতিমধ্যে রয়েছে এবং পাইথন ২.7 এ থাকবে So) সুতরাং:

logger = logging.getLogger(__name__)
logger.addHandler(someutils.null_handler)

আপনার মডিউলগুলি এমন কোনও সাইটের মধ্যে সুন্দরভাবে খেলতে পারে যা সেটিংস.পাই-তে লগিং কনফিগার করে না এবং আপনি কোনও বিরক্তিকর "কোনও লন্ডার এক্সওয়াইজেডের জন্য কোনও হ্যান্ডলার খুঁজে পাওয়া যায়নি" বার্তা (যা সম্ভাব্য সম্পর্কে সতর্কতা রয়েছে ভুল কনফিগার্ড লগিং)।

এটি এভাবে করা আপনার বর্ণিত প্রয়োজনীয়তা পূরণ করে:

  • আপনি বর্তমানে যেমন করেন তেমন বিভিন্ন ইভেন্টের জন্য বিভিন্ন লগ হ্যান্ডলার সেটআপ করতে পারেন।
  • আপনার মডিউলগুলিতে লগারে সহজে অ্যাক্সেস - ব্যবহার getLogger(__name__)
  • কমান্ড-লাইন মডিউলগুলিতে সহজেই প্রযোজ্য - সেগুলিও আমদানি করে settings.py

আপডেট: নোট করুন যে সংস্করণ 1.3 অনুসারে, জ্যাঙ্গো এখন লগিংয়ের জন্য সমর্থন অন্তর্ভুক্ত করে ।


এটির কি প্রয়োজন হবে না যে প্রতিটি মডিউলটির কনফিগারেশনে একটি হ্যান্ডলার সংজ্ঞায়িত করা উচিত (আপনি foo.bar হ্যান্ডল করার জন্য foo- র জন্য কোনও হ্যান্ডলার ব্যবহার করতে পারবেন না)? আমরা বহু বছর পূর্বে আমাদের সাথে কথোপকথনগুলি দেখুন google.google.com/group/comp.lang.python/browse_thread/thread/…
অ্যান্ড্রু কুক

1
@ অ্যান্ড্রু কুক: লগ ইন করা ইভেন্টগুলি পরিচালনা করতে আপনি একটি হ্যান্ডলার ব্যবহার করতে পারেন । করছেন। সেই থ্রেড - পুরানো লগার অক্ষম করা রোধ করার জন্য ফাইলকনফিগ এবং ডিক্টনফাইগ উভয়েরই এখন বিকল্প রয়েছে। এই ইস্যুটি দেখুন: বাগস.পিথন.আর.এসইউ3136 , যা আপনার ইস্যু bugs.python.org/issue2697 এর কয়েক মাস পরে এসেছিল - যাইহোক, এটি ২০০৮ সালের জুন থেকে সাজানো হয়েছেfoofoo.bar
বিনয় সাজিপ

এটা ভাল হবে না করতে logger = someutils.getLogger(__name__)যেখানে someutils.getLoggerআয় থেকে এটির logging.getLoggerএকটি null_handler সঙ্গে ইতিমধ্যেই যোগ?
7yl4r

1
@ 7yl4r আপনি প্রয়োজন হবে না যে এটির একটি থাকার NullHandlerসাধারণত আপনার প্যাকেজ অনুক্রমের জন্য শীর্ষ স্তরের এটির - এখনো যোগ করেনি। সুতরাং যে overkill হবে, আইএমও।
বিনয় সজিপ

122

আমি জানি এটি ইতিমধ্যে একটি সমাধান করা উত্তর, তবে জ্যাঙ্গো> = 1.3 অনুসারে একটি নতুন লগিং সেটিং রয়েছে।

পুরানো থেকে নতুনে স্থানান্তর স্বয়ংক্রিয় নয়, তাই আমি ভেবেছিলাম এটি এখানে লিখে রাখব।

এবং অবশ্যই আরও কিছু জন্য জ্যাঙ্গো ডক চেকআউট করুন

এটিই বেসিক কনফ, যা জ্যাঙ্গো-অ্যাডমিন ক্রিয়েটপ্রজেক্ট ভি 1.3-র সাথে ডিফল্টরূপে তৈরি হয়েছিল - মাইলেজটি সর্বশেষ জ্যাঙ্গো সংস্করণগুলির সাথে পরিবর্তিত হতে পারে:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        }
    }
}

এই কাঠামোটি স্ট্যান্ডার্ড পাইথন লগিং ডোকনফনফিগের উপর ভিত্তি করে তৈরি করা হয়েছে যা নিম্নলিখিত ব্লকগুলি নির্দেশ করে:

  • formatters - সম্পর্কিত মান হ'ল একটি ডিক হবে যেখানে প্রতিটি কী একটি ফর্ম্যাটর আইডি এবং প্রতিটি মান হ'ল সংশ্লিষ্ট ফরমেটার উদাহরণটি কীভাবে কনফিগার করতে হয় তা বর্ণনা করে একটি ডিক dict
  • filters - সম্পর্কিত মান হ'ল একটি ডিক হবে যেখানে প্রতিটি কী একটি ফিল্টার আইডি এবং প্রতিটি মান হ'ল সংযুক্ত ফিল্টার উদাহরণটি কীভাবে কনফিগার করতে হয় তা বর্ণনা করে dict
  • handlers- সম্পর্কিত মান হ'ল একটি ডিক হবে যেখানে প্রতিটি কী হ্যান্ডলার আইডি এবং প্রতিটি মান হ'ল হ্যান্ডলার উদাহরণটি কীভাবে কনফিগার করতে হয় তা বর্ণনা করে এমন একটি ডিক। প্রতিটি হ্যান্ডলারের নিম্নলিখিত কীগুলি থাকে:

    • class(বাধ্যতামূলক). এটি হ্যান্ডলার শ্রেণীর পুরোপুরি যোগ্যতাসম্পন্ন নাম।
    • level(ঐচ্ছিক)। হ্যান্ডলারের স্তর।
    • formatter(ঐচ্ছিক)। এই হ্যান্ডলারের জন্য ফর্ম্যাটারের আইডি।
    • filters(ঐচ্ছিক)। এই হ্যান্ডলারের জন্য ফিল্টারগুলির আইডির একটি তালিকা।

আমি সাধারণত কমপক্ষে এটি করি:

  • একটি। লগ ফাইল যুক্ত করুন
  • এই লগ লিখতে আমার অ্যাপ্লিকেশন কনফিগার করুন

যা অনুবাদ করে:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'null': {
            'level':'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'console':{
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # I always add this handler to facilitate separating loggings
        'log_file':{
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(VAR_ROOT, 'logs/django.log'),
            'maxBytes': '16777216', # 16megabytes
            'formatter': 'verbose'
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'apps': { # I keep all my of apps under 'apps' folder, but you can also add them one by one, and this depends on how your virtualenv/paths are set
            'handlers': ['log_file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
    # you can also shortcut 'loggers' and just configure logging for EVERYTHING at once
    'root': {
        'handlers': ['console', 'mail_admins'],
        'level': 'INFO'
    },
}

সম্পাদন করা

অনুরোধ ব্যতিক্রম দেখুন এখন সর্বদা লগ এবং টিকিট # 16288 :

আমি উপরে উল্লিখিত নমুনা কনফটাকে মেইল_অ্যাডমিনগুলির জন্য সঠিক ফিল্টারটি স্পষ্টভাবে অন্তর্ভুক্ত করার জন্য আপডেট করেছি যাতে ডিফল্ট হিসাবে, ডিবাগটি সত্য হলে ইমেলগুলি প্রেরণ করা হয় না।

আপনার একটি ফিল্টার যুক্ত করা উচিত:

'filters': {
    'require_debug_false': {
        '()': 'django.utils.log.RequireDebugFalse'
    }
},

এবং এটি মেল_ডমিনস হ্যান্ডলারটিতে প্রয়োগ করুন:

    'mail_admins': {
        'level': 'ERROR',
        'filters': ['require_debug_false'],
        'class': 'django.utils.log.AdminEmailHandler',
        'include_html': True,
    }

অন্যথায় django.core.handers.base.handle_uncaught_exceptionসেটিংস যদি 'django.request' লগারে ত্রুটিগুলি পাস করে না DE DEBUG সত্য।

আপনি যদি জাজানো 1.5 তে এটি না করেন তবে আপনি একটি পাবেন

অবমানন সতর্কতা: 'মেল_এডমিনস' লগিং হ্যান্ডলারের উপর আপনার কোনও ফিল্টার সংজ্ঞায়িত করা হয়নি: অন্তর্নিহিত ডিবাগ-ভুয়া-কেবল ফিল্টার যুক্ত করুন

তবে জিনিসগুলি এখনও দু'টি জাজানো 1.4 এবং জাজানো 1.5 তে সঠিকভাবে কাজ করবে।

** শেষ সম্পাদনা **

সেই কনফটি জ্যাঙ্গো ডকের নমুনা কনফ থেকে প্রবলভাবে অনুপ্রাণিত হয়েছে, তবে লগ ফাইলের অংশটি যুক্ত করছে।

আমি প্রায়শই নিম্নলিখিতগুলিও করি:

LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'

...
    'level': LOG_LEVEL
...

তারপরে আমার অজগর কোডটিতে আমি সর্বদা একটি নুলহ্যান্ডলার যুক্ত করি যদি কোনও লগিং কনফারেন্স নির্ধারিত না হয়। এটি কোনও হ্যান্ডলার নির্দিষ্ট না করার জন্য সতর্কতা এড়ান। বিশেষত কেবল জাজানো ( রেফ ) -তে ডাকা হয় না এমন লিবসের জন্য বিশেষভাবে কার্যকর

import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
class NullHandler(logging.Handler): #exists in python 3.1
    def emit(self, record):
        pass
nullhandler = logger.addHandler(NullHandler())

# here you can also add some local logger should you want: to stdout with streamhandler, or to a local file...

[...]

logger.warning('etc.etc.')

আশাকরি এটা সাহায্য করবে!


স্টেফানো, বিস্তারিত উত্তরের জন্য অনেক ধন্যবাদ, খুব সহায়ক। এটি সম্ভবত এটি 1.3 এ সার্থক আপগ্রেড করতে পারে।
পরান্দ

অবশ্যই, এটি অবশ্যই (আইএমএইচও!) জাজানো ১.৩ এ ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ফেলা যায়, যদিও মসৃণ ট্রানজিশনের জন্য যত্ন নিতে কয়েকটি পয়েন্ট রয়েছে - আপনি সমস্যায় পড়লে একটি নতুন এসও প্রশ্ন খুলুন ;-)
স্টেফানো

যাইহোক, আমি এখনও এই ধরণের সেটিংস এবং ফাইল লগ ব্যবহার করি, তবে আমি প্রযোজনার জন্য সেন্ড্রে চলে এসেছি !
স্টেফানো

@ ক্লাইম ভালভাবে আমি উত্তরটিতে এটি ব্যাখ্যা করার চেষ্টা করেছি: যদি কোনও লগিং কনফারেন্স সংজ্ঞায়িত না হয়। এটি কোনও হ্যান্ডলার নির্দিষ্ট না করার জন্য সতর্কতা এড়ান। বিশেষভাবে লিবসগুলির জন্য দরকারী যা কেবলমাত্র জাজানো (রেফ) -তে বলা হয় না
স্টেফানো

আমি দেখতে পাচ্ছি না কীভাবে আপনি এই সংজ্ঞা ব্যবহার করুন: 'নাল': { 'স্তর': 'ডিবাগ', 'বর্গ': 'django.utils.log.NullHandler',}
জলবায়ু

9

আমরা urls.pyএকটি logging.iniফাইল ব্যবহার করে শীর্ষ-স্তরে লগিং শুরু করি ।

এর অবস্থানটি logging.iniসরবরাহ করা হয়েছে settings.py, তবে এটি সবই।

প্রতিটি মডিউল তারপর না

logger = logging.getLogger(__name__)

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


Url.py এর পরিবর্তে सेटिंगস.পি শুরু না করেই আমি এটি ব্যবহার করে শেষ করেছি
21:41

আপনি কীভাবে আপনার লগিং.ইএনই ফাইলটিতে সেটিংস.পি থেকে সেটিংস ব্যবহার করবেন? উদাহরণস্বরূপ, আমার BASE_DIR সেটিংস দরকার, তাই আমার লগ ফাইলগুলি কোথায় সঞ্চয় করতে হবে তা আমি তা বলতে পারি।
স্লিপেট

স্লিপাইট: আমরা লগিং.ইএনইতে সেটিংস ব্যবহার করি না। লগিং যেহেতু মূলত স্বাধীন, তাই আমরা জ্যাঙ্গো সেটিংস ব্যবহার করি না। হ্যাঁ, কিছু পুনরাবৃত্তি হওয়ার সম্ভাবনা রয়েছে। না, এটি খুব বেশি ব্যবহারিক পার্থক্য করে না।
এসলট

সেক্ষেত্রে, আমি আমার অ্যাপ্লিকেশনটির প্রতিটি ইনস্টলেশনটিতে পৃথক লগিং.আইআই ফাইল করব।
স্লিপেট

স্লিপাইট: প্রতিটি ইনস্টলেশনের জন্য আপনার একটি সেটিংস.পি রয়েছে। প্রতিটি ইনস্টলেশন জন্য আপনার একটি লগিং.ইআইও রয়েছে। এছাড়াও, প্রতিটি ইনস্টলেশনের জন্য আপনার কাছে সম্ভবত একটি অ্যাপাচি কনফ ফাইল রয়েছে। প্লাস একটি ডাব্লুএসজি ইন্টারফেস ফাইল। আপনার বক্তব্য কি তা আমি নিশ্চিত নই।
এস .লট

6

আমি বর্তমানে একটি লগিং সিস্টেম ব্যবহার করছি, যা আমি নিজে তৈরি করেছি। এটি লগিংয়ের জন্য সিএসভি ফর্ম্যাট ব্যবহার করে।

জ্যাঙ্গো-csvlog

এই প্রকল্পে এখনও সম্পূর্ণ ডকুমেন্টেশন নেই, তবে আমি এটিতে কাজ করছি।

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