আপনি কীভাবে জাঙ্গো সাইটে সার্ভার ত্রুটিগুলি লগ করবেন


175

সুতরাং, বিকাশের সাথে খেলতে গিয়ে আমি কেবল সেট settings.DEBUGকরতে পারি Trueএবং যদি কোনও ত্রুটি দেখা দেয় তবে আমি ভাল স্ট্যাক ট্রেস এবং অনুরোধের তথ্য সহ এটি সুন্দর বিন্যাসিত দেখতে পাই।

তবে প্রোডাকশন সাইটে আমি বরং DEBUG=Falseএই মুহূর্তে এই বাগটি ফিক্সিংয়ের জন্য কাজ করছি এমন তথ্য সহ 500 স্ট্যান্ডার্ড ত্রুটি ব্যবহার করে দর্শকদের দেখাব;)
একই সাথে আমি সমস্ত লগ ইন করার কিছু উপায় থাকতে চাই আমার সার্ভারের কোনও ফাইলে সেই তথ্যগুলি (স্ট্যাক ট্রেস এবং অনুরোধের তথ্য) - যাতে আমি এটি কেবল আমার কনসোলটিতে আউটপুট দিতে পারি এবং ত্রুটিগুলি স্ক্রোল দেখতে পারি, প্রতি ঘন্টা বা এই জাতীয় কিছুতে আমাকে লগইন করতে ইমেইল করতে পারি।

আপনি কোন ল্যাঙ্গিং সলিউশনগুলি জাঙ্গো-সাইটের জন্য পুনরুদ্ধার করবেন, সেই সাধারণ প্রয়োজনীয়তাগুলি পূরণ করবে? আমার অ্যাপ্লিকেশনটি fcgiসার্ভার হিসাবে চলছে এবং আমি অ্যাপাচি ওয়েব সার্ভারটিকে ফ্রন্টএন্ড হিসাবে ব্যবহার করছি (যদিও লাইটটিপিডিতে যাওয়ার কথা ভাবছি)।


যুদ্ধের মাঠ থেকে কিছু: dlo.me/hat-to-do-when-your-site-goes-viral
চেরিয়ান

2
লগগুলি দেখতে পাঠানো
চেরিয়ান

চেরিয়ান যে লিঙ্কটি ভাগ করেছে তা এখন মারা গেছে। আপনি Sentry অনুসন্ধান করে দেখুন, তাহলে আপনি সম্ভবত সেগুলির অর্থ দিয়ে, সরকারি উদাহরণস্বরূপ উপাদান খুঁজে পেতে, কিন্তু এখানে একটি স্ব-হোস্ট করা উদাহরণস্বরূপ স্থাপনের জন্য লিঙ্ক দেওয়া হল: docs.sentry.io/server এছাড়াও, এখানে বর্তমানে রক্ষণাবেক্ষণ রেপো দেওয়া হল: GitHub .com / getmittedry / sentry
লেহিয়েস্টার

উত্তর:


103

ঠিক আছে, যখন DEBUG = False, জাঙ্গো ADMINSসেটিং-এ তালিকাবদ্ধ প্রতিটি ব্যক্তির কাছে স্বয়ংক্রিয়ভাবে কোনও ত্রুটির একটি সম্পূর্ণ ট্রেসব্যাক মেল করবে , যা আপনাকে বিনামূল্যে নোটিফিকেশন দেয়। আপনি যদি আরও সূক্ষ্ম-নিয়ন্ত্রণযুক্ত নিয়ন্ত্রণ চান, আপনি নিজের সেটিংসে লিখতে এবং যোগ করতে পারেন এমন একটি মিডওয়্যারের শ্রেণি যা নামের একটি পদ্ধতি নির্ধারণ করে process_exception(), এতে উত্থাপিত ব্যতিক্রমটি অ্যাক্সেস থাকবে:

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

আপনার process_exception()পদ্ধতিটি তখন আপনার পছন্দ অনুযায়ী যে কোনও ধরণের লগইন সম্পাদন করতে পারে: কনসোলে লিখন, কোনও ফাইলে লেখা ইত্যাদি etc.

সম্পাদনা করুন: যদিও এটি কিছুটা কম দরকারী তবে আপনি got_request_exceptionসিগন্যালের জন্যও শুনতে পারেন যা অনুরোধ প্রক্রিয়াকরণের সময় যখনই কোনও ব্যতিক্রম ঘটে তখন তা প্রেরণ করা হবে:

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

এটি আপনাকে ব্যতিক্রম বস্তুটিতে অ্যাক্সেস দেয় না , তবে মিডলওয়্যার পদ্ধতিটি কাজ করা খুব সহজ।


7
নোট করুন যে logging.exception('Some message')পাইথনের স্ট্যান্ডার্ড লগিং মডিউলটি ব্যবহার করা একটি সাধারণ স্ক্রিনাল হ্যান্ডলারের জন্য ঠিক কাজ করে got_request_exception, যদি আপনি যা করতে চান তা যদি স্ট্যাক ট্রেসগুলি লগ আউট করে। অন্য কথায়, ট্রেসব্যাকটি এখনও পাওয়া যায় got_request_exception
টিএম

ব্যতিক্রমটি প্রক্রিয়া-পাসে পাস হয়েছে স্ট্যাকের সন্ধান পাওয়া যায় না, এটি পাওয়ার কোনও উপায় আছে কি?
নিক বিএল

79

জ্যাঙ্গো সেন্ট্রি যাওয়ার একটি ভাল উপায়, যেমনটি ইতিমধ্যে উল্লিখিত রয়েছে, তবে এটি সঠিকভাবে স্থাপনের জন্য (আলাদা ওয়েবসাইট হিসাবে) কিছুটা কাজ জড়িত রয়েছে। আপনি যদি কেবল একটি সাধারণ পাঠ্য ফাইলে সবকিছু লগ করতে চান তবে লগিং কনফিগারেশনটি এখানে রাখুনsettings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}

আমি একমত, আমি সেন্ট্রি ভালবাসি! আমি এটির একটি নেট বন্দর রাখতে চাই (ইদানীং নেট প্রকল্পে কাজ করা হচ্ছে)।
গ্রুমার

1
কেউ কেটে কেটে পেস্ট করছে এমন ক্ষেত্রে একটি ছোট টাইপ: শেষে "প্রচার করুন" এর পরিবর্তে "প্রচার" করুন।
ব্যবহারকারী 1228295

3
'include_html': Trueইমেলগুলি কেবল "ভাল" করে না! এটিতে সেটিংস এবং স্থানীয় ভেরিয়েবলের মান সহ একটি সম্পূর্ণ ট্রেসব্যাক অন্তর্ভুক্ত রয়েছে। দস্তাবেজ অনুসারে এটি একটি সুরক্ষার বিষয়: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
টমাস

1
আমি আগ্রহী যদি মেইল_এডমিনস হ্যান্ডলার (এবং django.request লগার) যেহেতু আপনার 'disable_existing_loggers' রয়েছে: এটি মিথ্যা এবং কেবলমাত্র এই হ্যান্ডলারের (এবং লগার) সাথে ডিফল্ট জাজানো লগিংয়ের অনুলিপি করছে। আমি পরীক্ষা করেছি যখন আপডেট করব।
ডিলান ইয়ং

দয়া করে এই উত্তরটি আপডেট করুন। Django1.9 পরিবর্তন-লগ থেকে: জ্যাঙ্গোর ডিফল্ট লগিং কনফিগারেশনটি আর 'django.request' এবং 'django.security' লগারের সংজ্ঞা দেয় না।
নরেন্দ্র-চৌধুরী চৌদ্দ


30

স্পষ্টতই জেমস সঠিক, তবে আপনি যদি কোনও ডেটাস্তোরে ব্যতিক্রমগুলি লগ করতে চান তবে ইতিমধ্যে কয়েকটি মুক্ত উত্স সমাধান পাওয়া যায়:

1) ক্র্যাশলগ একটি ভাল পছন্দ: http://code.google.com/p/django-crashlog/

২) ডিবি-লগও একটি ভাল পছন্দ: http://code.google.com/p/django-db-log/

এই দুটির মধ্যে পার্থক্য কী? আমি দেখতে পাচ্ছি না এমন প্রায় কিছুই, তাই উভয়ই যথেষ্ট।

আমি উভয় ব্যবহার করেছি এবং তারা ভাল কাজ করে।


15

ইএমপির সবচেয়ে সহায়ক কোড জমা দেওয়ার পরে কিছু সময় কেটে গেছে। আমি এখনই এটি বাস্তবায়ন করেছি এবং বাগের পিছনে তাড়া করার চেষ্টা করার জন্য কিছু ম্যানেজ.পি বিকল্পের সাহায্যে ঘুরে বেড়াতে গিয়ে, আমি আমার বর্তমান জ্যাঙ্গো (1.5।?) সংস্করণটির সাথে একটি আবশ্যক_দেবগ_ফালস ফিল্টারটি কার্যকর করার জন্য অবজ্ঞার সতর্কতা পেয়েছি মেল_ডমিনস হ্যান্ডলারের জন্য প্রয়োজন।

সংশোধিত কোডটি এখানে:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}

আমি আগ্রহী যদি মেইল_এডমিনস হ্যান্ডলার (এবং django.request লগার) যেহেতু আপনার 'disable_existing_loggers' রয়েছে: এটি মিথ্যা এবং কেবলমাত্র এই হ্যান্ডলারের (এবং লগার) সাথে ডিফল্ট জাজানো লগিংয়ের অনুলিপি করছে। আমি পরীক্ষা করেছি যখন আপডেট করব।
ডিলান ইয়ং

1

আমার fcgiস্ক্রিপ্টটিতে আমার কেবল বিরক্তিকর সমস্যা ছিল । জ্যাঙ্গো এমনকি শুরু হওয়ার আগেই এটি ঘটেছিল। লগিংয়ের অভাব খুব বেদনাদায়ক। যাইহোক, স্ট্যাডারকে একটি ফাইলের মধ্যে প্রথম জিনিস হিসাবে পুনঃনির্দেশ করা অনেক সাহায্য করেছিল:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.