पायथन में स्रोत फ़ाइल नाम और लाइन नंबर कैसे लॉग करें


123

क्या अजगर मानक लॉगिंग सिस्टम को सजाने / विस्तारित करने के लिए संभव है, ताकि जब एक लॉगिंग विधि को लागू किया जाए तो यह फ़ाइल और लाइन नंबर को भी लॉग करता है जहां इसे लागू किया गया था या शायद जिस विधि ने इसे लागू किया था?

जवाबों:


227

ज़रूर, लॉगिंग डॉक्स में फ़ॉर्मेटर्स की जाँच करें । विशेष रूप से लिनिनो और पाथनाम चर।

% (pathname) स्रोत फ़ाइल का पूर्ण पथनाम जहाँ लॉगिंग कॉल जारी की गई थी (यदि उपलब्ध हो)।

pathname का % (फ़ाइल नाम) फ़ाइल नाम भाग।

% (मॉड्यूल) का मॉड्यूल (फ़ाइल नाम का नाम भाग)।

% (funcName) फ़ंक्शन का नाम लॉगिंग कॉल है।

% (lineno) d सोर्स लाइन नंबर जहाँ लॉगिंग कॉल जारी की गई थी (यदि उपलब्ध हो)।

कुछ इस तरह दिखता है:

formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')

1
और, हां, चर में ऊपरी / निचले मामले की गड़बड़ी पर विचार किया जाना चाहिए।
टॉम पोहल

1
अन्यथा "बहुत खराब तरीके से लागू ऊंट मामले" के रूप में जाना जाता है।
जॉन स्पेंसर

80

एसईबी के बहुत उपयोगी उत्तर के शीर्ष पर , यहां एक आसान कोड स्निपेट है जो लकड़हारे के उपयोग को एक उचित प्रारूप के साथ प्रदर्शित करता है:

#!/usr/bin/env python
import logging

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG)

logger = logging.getLogger(__name__)
logger.debug("This is a debug log")
logger.info("This is an info log")
logger.critical("This is critical")
logger.error("An error occurred")

यह उत्पादन उत्पन्न करता है:

2017-06-06:17:07:02,158 DEBUG    [log.py:11] This is a debug log
2017-06-06:17:07:02,158 INFO     [log.py:12] This is an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13] This is critical
2017-06-06:17:07:02,158 ERROR    [log.py:14] An error occurred

5
अधिक विवरण के लिए इसका उपयोग करें: फ़ॉर्मेटर = लॉगिंग। फ़ार्मेट ('% (asctime) s,% (स्तरनाम) -8 s [% (फ़ाइल नाम) s:% (मॉड्यूल) s:% (funcName) s:% (लिनेनो) d] % (संदेश) s ')
गिरीश गुप्ता

क्या कोड के शीर्ष पर केवल एक ही स्थान पर परिवर्तन करने का एक तरीका है कि लॉगिंग संदेश मुद्रित होते हैं या नहीं? मैं दो मोड्स चाहूंगा, एक बहुत सारे प्रिंट्स के साथ, यह देखने के लिए कि प्रोग्राम वास्तव में क्या करता है; और एक, जब यह पर्याप्त रूप से स्थिर होता है, जहां कोई आउटपुट नहीं दिखाया जाता है।
मेरी। पी।

3
@ Marie.P। टिप्पणियों में विभिन्न प्रश्न न पूछें। हालांकि उत्तर लॉगिंग स्तर है।
Bugmenot123

4

डिबग लॉगिंग को मानक तरीके से भेजने वाले तरीके से ऊपर का निर्माण करने के लिए:

import logging
import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
formatter = logging.Formatter(FORMAT)
ch.setFormatter(formatter)
root.addHandler(ch)

logging.debug("I am sent to standard out.")

उपरोक्त फ़ाइल debug_logging_example.pyको आउटपुट नामक फ़ाइल में रखना:

[debug_logging_example.py:14 -             <module>() ] I am sent to standard out.

फिर अगर आप लॉगिंग कमेंट को बंद करना चाहते हैं root.setLevel(logging.DEBUG)

एकल फ़ाइलों (उदाहरण के लिए क्लास असाइनमेंट) के लिए मैंने इसे print()बयानों का उपयोग करने के विपरीत करने का एक बेहतर तरीका पाया है । इससे पहले कि आप इसे सबमिट करने से पहले डिबग आउटपुट को एक ही स्थान पर बंद कर सकें।


1

PyCharm या Eclipse pydev का उपयोग करने वाले देवताओं के लिए, निम्नलिखित कंसोल कंसोल आउटपुट में लॉग स्टेटमेंट के स्रोत के लिए एक लिंक का उत्पादन करेगा:

import logging, sys, os
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format='%(message)s | \'%(name)s:%(lineno)s\'')
log = logging.getLogger(os.path.basename(__file__))


log.debug("hello logging linked to source")

अधिक चर्चा और इतिहास के लिए ग्रहण कंसोल में पाइदेव स्रोत फ़ाइल हाइपरलिंक देखें ।


0
# your imports above ...


logging.basicConfig(
    format='%(asctime)s,%(msecs)d %(levelname)-8s [%(pathname)s:%(lineno)d in 
    function %(funcName)s] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG
)

logger = logging.getLogger(__name__)

# your classes and methods below ...
# An naive Sample of usage:
try:
    logger.info('Sample of info log')
    # your code here
except Exception as e:
    logger.error(e)

अन्य उत्तरों में से अलग, यह फ़ाइल का पूर्ण पथ और फ़ंक्शन नाम लॉग करेगा जो त्रुटि हो सकती है। यह उपयोगी है यदि आपके पास एक से अधिक मॉड्यूल वाली परियोजना है और इन मॉड्यूल में समान नाम के साथ कई फाइलें हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.