2012-03-27 20 views
5

कार्य: जब मेरे किसी एक दृश्य में कोई त्रुटि होती है तो मुझे एक कस्टम त्रुटि दृश्य दिखाना होगा। त्रुटि प्रकार कोई फर्क नहीं पड़ता।पिरामिड (पायथन): डिफ़ॉल्ट त्रुटि दृश्य ओवरराइड करें

मैं इस तरह सभी अपवादों के लिए एक दृश्य के Registring, द्वारा सभी अपवादों को ओवरराइड करने के लिए करने की कोशिश की:

<view 
    context="Exception" 
    renderer="server_error.pt" 
    /> 

यह अच्छा काम किया। सभी अपवाद मेरे विचार दिखा रहे थे। लेकिन समस्या यह थी कि त्रुटियों ने लॉगिंग बंद कर दी। Cource के मैं अपने त्रुटि दृश्य में logger.error (traceback) की तरह कुछ कर सकते हैं, लेकिन यह एक बेवकूफ विचार है।

लॉगिंग पिरामिड सिस्टम को तोड़ने के बिना मैं सभी त्रुटियों के लिए एक दृश्य कैसे पंजीकृत कर सकता हूं।

+0

आपको स्वयं त्रुटि को लॉग इन करना होगा या त्रुटि को पुन: उत्पन्न करना होगा। यदि आप त्रुटि का पुन: प्रयास करते हैं तो यह लॉग होगा लेकिन आपका दृश्य प्रस्तुत नहीं करेगा। यदि आप अपने दृश्य में त्रुटि लॉग करते हैं, तो यह आपके दृश्य को लॉग और प्रस्तुत करेगा। –

उत्तर

2

आप पुराने पुराने पायथन लॉगिंग के माध्यम से अपने दृश्य में त्रुटि लॉग कर सकते हैं। या 500 की प्रतिक्रिया पर स्थिति निर्धारित करें (मान लें कि आपका विचार अब 200 की स्थिति लौटाता है जो सफल प्रतिक्रिया दर्शाता है)।

संपादित करें: काम कर रहे उदाहरण

मैं एक प्रवेश विशेषज्ञ नहीं हूँ, लेकिन मैं धारणा है कि development.ini/production.ini में अपने प्रवेश config उठाया जा जाएगा के तहत किया गया है, उदाहरण के नीचे साबित होता है कि लगता है लेकिन आप न्यायाधीश

परिवर्तन डिफ़ॉल्ट

[formatter_generic] 
# format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s 
format = y u no work??!!?? %(message)s 
# End logging configuration 

से config लॉग इन करने के विचारों हो .....

from pyramid.view import view_config 
from webob import Response 
import logging 
log = logging.getLogger(__name__) 

@view_config(route_name='home', renderer='templates/mytemplate.pt') 
def my_view(request): 
    raise ValueError("oops") 
    return {'project':'tstLogError'} 


@view_config(context=Exception) 
def exception_view(context, request): 
    log.error("The error was: %s" % context, exc_info=(context)) 
    return Response(status_int=500, body=str(context)) 

    from pyramid.view import view_config 
    from webob import Response 

कंसोल आउटपुट:

serving on http://0.0.0.0:6543 
y u no work??!!?? The error was: oops 
Traceback (most recent call last): 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/tweens.py", line 20, in excview_tween 
    response = handler(request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/router.py", line 164, in handle_request 
    response = view_callable(context, request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 333, in rendered_view 
    result = view(context, request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 471, in _requestonly_view 
    response = view(request) 
    File "/home/twillis/projects/TestLogError/tstLogError/tstlogerror/views.py", line 8, in my_view 
    raise ValueError("oops") 
ValueError: oops 

browser screenshot

+0

जैसा कि मैंने कहा था: बेस लॉगर के साथ लॉगिंग एक खराब समाधान है। अगर मैं ऐसा करता हूं तो मैं इसे पिरामिड की कॉन्फ़िगरेशन से लॉग नहीं कर सकता। मैंने स्टेटस कोड सेटिंग की कोशिश की, लेकिन लॉगिंग स्थिति में बदलाव नहीं आया (अभी भी कोई त्रुटि नहीं)। –

+0

तो आप जो कह रहे हैं वह है जब आप अपने ब्राउज़र के साथ उस दृश्य को दबाते हैं, तो आपका ब्राउज़र HTTP_STATUS = 500 देखता है लेकिन यह लॉग नहीं किया जा रहा है? यह आश्चर्यजनक है। आईडी को इसे विश्वास करने के लिए देखना है। –

+0

डू! अपने उदाहरण में आप इसे स्वयं लॉग करें :)। यह 'यू यू नो काम' के साथ प्रदर्शित होता है ?? !!?? ऐसा इसलिए है क्योंकि आपने फॉर्मेटर कॉन्फ़िगरेशन को बदल दिया है, जो sys.error के सभी आउटपुट पर लागू होता है। लेकिन अभी भी धन्यवाद! अब मैं समझता हूं कि इसे स्वयं लॉग इन करने के बजाय कोई अन्य तरीका नहीं है और फ़ॉर्मेटर लागू किया गया है, इसलिए ऐसा कोई समस्या नहीं है –

2

यह अपनी खुद की त्रुटि को ध्यान में रखते अपवाद लॉग इन करने (। अपवाद request.context के रूप में उपलब्ध हो जाएगा) हमेशा अपवाद के साथ मामला है गूंगा नहीं है, आप या तो कुछ भी नहीं कर सकते हैं, अपवाद को संभालें और इसे लॉग करें, या एक ही अपवाद को फिर से उठाएं।

मेरे सेटअप में, WSGI सर्वर द्वारा स्वयं को एक अपवाद अपवाद लॉग किया गया है, इस मामले में wsgiref। डब्लूएसजीआई सर्वर की सामान्य प्रतिक्रिया तंत्र और इसके अपवाद लॉगर दोनों को ट्रिगर करना संभव नहीं है।

wsgiref के अपवाद लकड़हारा:

def log_exception(self,exc_info): 
    """Log the 'exc_info' tuple in the server log 

    Subclasses may override to retarget the output or change its format. 
    """ 
    try: 
     from traceback import print_exception 
     stderr = self.get_stderr() 
     print_exception(
      exc_info[0], exc_info[1], exc_info[2], 
      self.traceback_limit, stderr 
     ) 
     stderr.flush() 
    finally: 
     exc_info = None 

एक वैकल्पिक करने के लिए आप वेब सर्वर परत के बजाय पिरामिड परत पर अपने कस्टम त्रुटि पृष्ठ प्रदर्शित करने के लिए है कि स्वीकार्य हो सकता है।

+0

उत्तर के लिए धन्यवाद। ऐसा लगता है कि मैं इसे फिर दृश्य के अंदर लॉग इन करूंगा। –

0

प्लगइन pyramid_exclog इस उद्देश्य को बहुत अच्छी तरह से भरता है।

इसे एक ट्विन के रूप में लागू किया गया है ताकि आप अभी भी Exception के लिए एक दृश्य लिख सकें और यह आपके पिरामिड कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट लॉग हैंडलर के अपवाद के विवरण लॉग करेगा - कंसोल के लिए मौसम, एक फ़ाइल या एक ईमेल।

pyramid_exclog प्रलेखन के अलावा मुझे पाइथन दस्तावेज के पायथन Configuration file format अनुभाग भी बहुत उपयोगी पाया गया क्योंकि कॉन्फ़िगरेशन सही होने के लिए काफी मुश्किल है।

संबंधित मुद्दे