পাইথন লগিং কিছুই আউটপুট না


97

পাইথন স্ক্রিপ্টে আমি লিখছি, আমি লগিং মডিউলটি ব্যবহার করে ইভেন্টগুলি লগ করার চেষ্টা করছি। আমার লগারটি কনফিগার করার জন্য আমার কাছে নিম্নলিখিত কোড রয়েছে:

ERROR_FORMAT = "%(levelname)s at %(asctime)s in %(funcName)s in %(filename) at line %(lineno)d: %(message)s"
DEBUG_FORMAT = "%(lineno)d in %(filename)s at %(asctime)s: %(message)s"
LOG_CONFIG = {'version':1,
              'formatters':{'error':{'format':ERROR_FORMAT},
                            'debug':{'format':DEBUG_FORMAT}},
              'handlers':{'console':{'class':'logging.StreamHandler',
                                     'formatter':'debug',
                                     'level':logging.DEBUG},
                          'file':{'class':'logging.FileHandler',
                                  'filename':'/usr/local/logs/DatabaseUpdate.log',
                                  'formatter':'error',
                                  'level':logging.ERROR}},
              'root':{'handlers':('console', 'file')}}
logging.config.dictConfig(LOG_CONFIG)

আমি যখন চালানোর চেষ্টা করি, তখন কনসোলটিতে আমি logging.debug("Some string")কোনও আউটপুট পাই না, যদিও ডক্সের এই পৃষ্ঠাটিতে বলা হয়েছে যে logging.debugমূলে রুট লগার আউটপুট থাকা উচিত। আমার প্রোগ্রাম কেন কিছু আউটপুট করছে না এবং আমি কীভাবে এটি ঠিক করতে পারি?

উত্তর:


103

ডিফল্ট লগিং স্তরটি সতর্কতা। যেহেতু আপনি স্তরটি পরিবর্তন করেন নি, রুট লগারের স্তরটি এখনও সতর্ক করে চলেছে। এর অর্থ এটি ডিবাগ লগিং সহ সতর্কতার চেয়ে কম স্তরের কোনও লগিংকে উপেক্ষা করবে।

টিউটোরিয়ালে এটি ব্যাখ্যা করা হয়েছে :

import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything

'তথ্য' লাইনটি কোনও কিছু মুদ্রণ করে না, কারণ স্তর তথ্যের চেয়ে উচ্চ।

স্তরটি পরিবর্তন করতে, কেবল এটি রুট লগারে সেট করুন:

'root':{'handlers':('console', 'file'), 'level':'DEBUG'}

অন্য কথায়, স্তর = DEBUG সহ কোনও হ্যান্ডলার সংজ্ঞায়িত করার পক্ষে এটি পর্যাপ্ত নয়, কোনও কিছু আউটপুট এ পাওয়ার জন্য আসল লগিং স্তরটি অবশ্যই DEBUG হতে হবে।


7
ডকুমেন্টেশন বলে যে এটির ডিফল্ট স্তরটি নোটসেট যা 0 এর একটি স্তর যা প্রতিটি ফলাফল আউটপুট করে তোলে ... কেন এটি সত্য নয়?
বেন

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


4
@ দস্তাবেজ অনুসারে লগাররা প্রথম পিতামাতার সাথে level != NOTSETবা মূলটি খুঁজে পেতে (যদি কোনওটি না পাওয়া যায়) সন্ধানের জন্য অনুসরণ করা হয়। WARNINGডিফল্টরূপে মূলের স্তর থাকে। আপনি ( Logger.setLevel) এর সাথে সংযুক্ত অংশে এটি লেখা হয়েছে ।
ওমরি বেরেল

4
মনে রাখবেন যে আমদানির পরে loggingআপনাকে logging.basicConfig()কমপক্ষে একবার কল করতে হবে । অন্যথায় আপনি খারাপভাবে অবাক হতে পারেন যে শিশু লগাররা কোনও কিছু মুদ্রণ করবে না। রুট লগারে লগিং ফাংশনগুলি এটিকে অলসভাবে ডাকে।
হুবার্ট গ্রেজস্কোইয়াক

74

বহু বছর পরে পাইথন লগারের সাথে এখনও ব্যবহারের সমস্যা রয়েছে বলে মনে হয়। উদাহরণ সহ কয়েকটি ব্যাখ্যা এখানে রইল:

import logging
# This sets the root logger to write to stdout (your console).
# Your script/app needs to call this somewhere at least once.
logging.basicConfig()

# By default the root logger is set to WARNING and all loggers you define
# inherit that value. Here we set the root logger to NOTSET. This logging
# level is automatically inherited by all existing and new sub-loggers
# that do not set a less verbose level.
logging.root.setLevel(logging.NOTSET)

# The following line sets the root logger level as well.
# It's equivalent to both previous statements combined:
logging.basicConfig(level=logging.NOTSET)


# You can either share the `logger` object between all your files or the
# name handle (here `my-app`) and call `logging.getLogger` with it.
# The result is the same.
handle = "my-app"
logger1 = logging.getLogger(handle)
logger2 = logging.getLogger(handle)
# logger1 and logger2 point to the same object:
# (logger1 is logger2) == True


# Convenient methods in order of verbosity from highest to lowest
logger.debug("this will get printed")
logger.info("this will get printed")
logger.warning("this will get printed")
logger.error("this will get printed")
logger.critical("this will get printed")


# In large applications where you would like more control over the logging,
# create sub-loggers from your main application logger.
component_logger = logger.getChild("component-a")
component_logger.info("this will get printed with the prefix `my-app.component-a`")

# If you wish to control the logging levels, you can set the level anywhere 
# in the hierarchy:
#
# - root
#   - my-app
#     - component-a
#

# Example for development:
logger.setLevel(logging.DEBUG)

# If that prints too much, enable debug printing only for your component:
component_logger.setLevel(logging.DEBUG)


# For production you rather want:
logger.setLevel(logging.WARNING)

বিভ্রান্তির একটি সাধারণ উত্স খারাপভাবে শুরু করা রুট লগার থেকে আসে। এই বিবেচনা:

import logging
log = logging.getLogger("myapp")
log.warning("woot")
logging.basicConfig()
log.warning("woot")

আউটপুট:

woot
WARNING:myapp:woot

আপনার রানটাইম পরিবেশ এবং লগিং স্তরের উপর নির্ভর করে প্রথম লগ লাইন (বেসিক কনফিগারেশনের আগে) কোথাও প্রদর্শিত হবে না


আমার লগিং কাজ করছে না, এতে কোনও আউটপুট ফাইল তৈরি হয় না। আমি কি এমন কিছু দেখতে পাচ্ছি যা স্পষ্টতই ভুল? logging.basicConfig( filename='logging.txt', level=logging.DEBUG) logger = logging.getLogger() logger.info('Test B') logging.info('Test A')
রাইলান শ্যাফার

লগিং ফাইলটি এখনও তৈরি হয়নি
রাইলান শ্যাফার

আমি লক্ষ্য করেছি যে যখন আমি যখন বিরতি বিন্দু logger = logging.getLogger()ছাড়ি তখন স্তরটি সতর্কতার সাথে সেট করা আছে যদিও আমি স্তরটি নির্দিষ্ট করে দিয়েছি DEBUG। তুমি কি জান আমি কি ভুল করছি?
রাইলান শ্যাফার

হাই @ রিলানশ্যাফার, আপনি একটি নতুন প্রশ্ন তৈরি করতে এবং আরও কিছু বিশদ সরবরাহ করতে চাইতে পারেন। এটি অন্যকে আপনাকে সহায়তা করার সুযোগ দেবে।
হুবার্ট গ্রেজস্কোয়িয়াক

আমি করেছিলাম. প্রায়শই, কোনও মন্তব্য জিজ্ঞাসা করা উত্তর খুঁজে পাওয়ার একটি দ্রুত উপায় কারণ কমপক্ষে একজন জ্ঞানী ব্যক্তি আমার প্রশ্নটি দেখতে পাবেন
রাইলান শ্যাফার

27

এখানে যে কেউ একটি অতি-সহজ উত্তর চায়: আপনার প্রদর্শিত স্তরটি ঠিক সেট করুন। আমার সমস্ত স্ক্রিপ্টগুলির শীর্ষে আমি কেবল রেখেছি:

import logging
logging.basicConfig(level = logging.INFO)

তারপরে সেই স্তরের বা উপরে কিছু প্রদর্শন করতে:

logging.info("Hi you just set your fleeb to level plumbus")

এটি পাঁচটি স্তরের একটি শ্রেণিবদ্ধ সেট যাতে লগগুলি আপনার সেট করা স্তরে বা তার চেয়েও উচ্চতর স্তরে প্রদর্শিত হবে । সুতরাং আপনি যদি কোনও ত্রুটি প্রদর্শন করতে চান তবে আপনি ব্যবহার করতে পারেন logging.error("The plumbus is broken")

মাত্রা, তীব্রতা ক্রম বেড়ে যাওয়ার ক্ষেত্রে হয় DEBUG, INFO, WARNING, ERROR, এবং CRITICAL। ডিফল্ট সেটিংস হ'ল WARNING

এটি আমার উত্তরের চেয়ে এই তথ্যটি সহ একটি ভাল নিবন্ধটি প্রকাশিত:
https://www.digitalocean.com/commune/tutorials/how-to-use-logging-in-python-3


14

এই চেষ্টা করতে পারেন? আমার ক্ষেত্রে সমস্ত হ্যান্ডলারের অপসারণের পরে সমস্যার সমাধান হয়েছে বলে মনে হচ্ছে।

for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

logging.basicConfig(filename='output.log', level=logging.INFO)

SyntaxError: invalid syntax
এরিক

4
কেন এটি প্রয়োজনীয়? অজগর লগারের সাথে কোন হ্যান্ডলারগুলি স্টক আসে এবং তারা কেন সেখানে শুরু হয়? অথবা হতে পারে প্রশ্ন, বেসিক কনফিগ কেন তাদের ওভাররাইড করে না / প্রতিস্থাপন করে না?
jrh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.