পাইথনে সোর্স ফাইলের নাম এবং লাইন নম্বরটি কীভাবে লগ করবেন


123

পাইথন স্ট্যান্ডার্ড লগিং সিস্টেমটি সাজাতে / প্রসারিত করা কি সম্ভব, যাতে লগিং পদ্ধতিটি চালিত হলে এটি যে ফাইলটি এবং যেখানে লাইন করা হয়েছিল সেখানে লাইন নম্বর বা এটি যে পদ্ধতিটিকে অনুরোধ করেছিল তাও লগ ইন করে?

উত্তর:


227

অবশ্যই, চেক formatters ডক্স লগ-ইন হবে। বিশেষত লিনেনো এবং পথের নাম ভেরিয়েবল।

% (পথনাম) গুলি উত্স ফাইলটির সম্পূর্ণ পথের নাম যেখানে লগিং কল ইস্যু করা হয়েছিল (যদি উপলভ্য থাকে)।

% (ফাইলের নাম) গুলি পথের ফাইলের নাম অংশ।

% (মডিউল) গুলি মডিউল (ফাইলের নামের অংশ)।

% (funcName) s লগিং কলযুক্ত ফাংশনের নাম।

% (লিনেনো) d সোর্স লাইন নম্বর যেখানে লগিং কল জারি করা হয়েছিল (যদি উপলভ্য থাকে)।

এরকম কিছু দেখাচ্ছে:

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

1
এবং হ্যাঁ, ভেরিয়েবলের উপরের / লোয়ার কেসের জগাখিচুড়ি বিবেচনা করা দরকার।
টম পোহল

1
অন্যথায় "খুব খারাপভাবে প্রয়োগ করা উটের মামলা" হিসাবে উল্লেখ করা হয়।
জন স্পেন্সার 21

80

উপরে Seb এর খুব দরকারী উত্তর , এখানে কুশলী কোড স্নিপেট যে একটি যুক্তিসঙ্গত ফর্ম্যাটের সাথে এটির ব্যবহার প্রমান হল:

#!/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
আরও তথ্যের জন্য এটি ব্যবহার করুন: ফর্ম্যাটর = লগিং For ফর্ম্যাটর ('% (অ্যাসটাইম)),% (স্তরের নাম) -8 এস [% (ফাইলের নাম) গুলি:% (মডিউল) গুলি:% (ফানকাম) s:% (লিনেনো) ডি] % (বার্তা) গুলি ')
গিরিশ গুপ্ত

লগিং বার্তাগুলি মুদ্রিত হয় কি না তারপরে কোডের শীর্ষে কেবলমাত্র এক জায়গায় পরিবর্তনের কোনও উপায় আছে? আমি দুটি মোড চাই, একটিতে প্রচুর প্রিন্ট সহ প্রোগ্রামটি ঠিক কী করে তা দেখতে; এবং একটি, যখন এটি যথেষ্ট স্থিতিশীল, যেখানে কোনও আউটপুট প্রদর্শিত হয় না।
মেরি পি।

3
@ Marie.P। মন্তব্যে বিভিন্ন প্রশ্ন জিজ্ঞাসা করবেন না। উত্তর যদিও লগিং স্তর।
বাগম্যানোট 123

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

পাইচার্ম বা এক্লিপ্স পাইদেব ব্যবহার করে ডেভসের জন্য, নিম্নলিখিতটি কনসোল লগ আউটপুটে লগ স্টেটমেন্টের উত্সের লিঙ্ক তৈরি করবে:

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")

দেখা অন্ধকার কনসোলে Pydev সোর্স ফাইল হাইপার-লিঙ্ক আর আলোচনা ও ইতিহাসের জন্য।


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)

অন্যান্য উত্তরগুলির ভিন্ন, এটি ফাইলের পুরো পথ এবং ফাংশনটির নাম লগ করবে যা একটি ত্রুটি ঘটেছে। আপনার যদি একাধিক মডিউল এবং এই মডিউলগুলিতে একই নামযুক্ত একাধিক ফাইল যুক্ত একটি প্রকল্প থাকে।

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