লগিং পাইথন মডিউলটি ব্যবহার করে কোনও ফাইলে কীভাবে লিখবেন?


128

পাইথনে লগিং মডিউলটি কীভাবে কোনও ফাইল লিখতে পারি? যতবারই আমি এটি ব্যবহার করার চেষ্টা করব, এটি বার্তাটি প্রিন্ট করে।

উত্তর:


172

logging.basicConfigবরং ব্যবহারের একটি উদাহরণlogging.fileHandler()

logging.basicConfig(filename=logname,
                            filemode='a',
                            format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
                            datefmt='%H:%M:%S',
                            level=logging.DEBUG)

logging.info("Running Urban Planning")

self.logger = logging.getLogger('urbanGUI')

ক্রমে, পাঁচটি অংশ নিম্নলিখিতটি করে:

  1. আউটপুট ফাইল সেট করুন ( filename=logname)
  2. এটি সেট ঊর্ধ্বলিপি বদলে সংযোজন করতে ( filemode='a')
  3. আউটপুট বার্তার বিন্যাস নির্ধারণ করুন ( format=...)
  4. আউটপুট সময়ের বিন্যাস নির্ধারণ করুন ( datefmt='%H:%M:%S')
  5. এবং সর্বনিম্ন বার্তা স্তর নির্ধারণ করুন এটি গ্রহণ করবে ( level=logging.DEBUG)।

ফাইলের নামটি কি এইচডিএফএসের অবস্থান হতে পারে? যদি হ্যাঁ, কিভাবে?
আগস্ট জ্যাকব

ফাইলের পথ নির্ধারণ করা কি সম্ভব
নীরজা

1
এটি নিশ্চিত করুন যে এটি if __name__ == '__main__':
আপাচে

@ রামিআলৌস আপনি কি দয়া করে বিস্তারিত বলতে পারবেন? কেন এমন? (কৌতূহল :))
notihs

@ নাতিহস, সার্ভারটি স্ক্রিপ্ট ফাইলটি সরাসরি চালায় না যাতে নীচের অংশটি if __name__ == '__main__':কার্যকর হয় না।
রামি আলাউশ

71

" লগিং কুকবুক " থেকে নেওয়া :

# create logger with 'spam_application'
logger = logging.getLogger('spam_application')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)

এবং আপনি যেতে ভাল।

পিএস এছাড়াও লগিং HOWTO পড়া নিশ্চিত করুন ।


4
আপনার প্রথম প্রশ্নের উত্তর দিতে, নির্দ্বিধায় আমার জিজ্ঞাসা করা প্রশ্নের শিরোনামটি দেখুন। আপনার দেওয়া লিঙ্কটি আমি পেরিয়ে গিয়েছি এবং এটি সহায়ক ছিল। আপনি আমাকে যে কোডটি দিয়েছেন তা আমি অনুলিপি করেছি এবং আমি কি ধরে নিতে ভুল করেছিলাম যে আমি logger.info ("বার্তা") এবং লগার.ওয়ার্নিং ("বার্তা") সফলভাবে ব্যবহার করতে সক্ষম হব? আমি লগার.ওয়ার্নিং ব্যবহার করে ফাইলটিতে লিখতে সক্ষম হয়েছি, তবে লগার.ইনফো ফাইলটিতে লিখতে পারে বলে মনে হয় না।
তাককুন

সেটলভেল কলটি সরিয়ে দেওয়ার চেষ্টা করুন। হ্যান্ডলার দস্তাবেজগুলি দেখে মনে হচ্ছে ডিফল্টরূপে সমস্ত বার্তা প্রক্রিয়া করা আছে।
thegrinner

2
আমি কেবল ফাইল ব্যবহার করে লিখতে পারি, ব্যবহার logger.warning("message")করতে পারি না বা logger.info("message")করতেও পারি না logger.debug("message")। এটি কিছুটা বিরক্তিকর।
এম

3
@ এলিবেেন্ডারস্কি লিখেছেন কোড উদাহরণটি যদি আপনি তথ্য / ডিবাগ এমএসএলগুলি লিখতে চান তবে 1 ধাপ অনুপস্থিত। লগিং বার্তাগুলির সেই স্তরটি স্বীকার করতে কনফিগার করার জন্য লগারের নিজের নিজস্ব লগ স্তর প্রয়োজন logger.setLevel(logging.DEBUG)। লগার একাধিক হ্যান্ডলারের সাথে কনফিগার করা যায়; লগারে কনফিগার করা স্তরটি নির্ধারণ করে যে তার প্রতিটি হ্যান্ডলারের কাছে কোন তীব্রতা স্তর লগ বার্তা প্রেরণ করা হবে এবং হ্যান্ডলারগুলিতে সেট করা স্তরগুলি হ্যান্ডলারটি কোন স্তরের প্রক্রিয়া করবে তা নির্ধারণ করে। মনে রাখবেন যে তথ্য বার্তাগুলি মুদ্রণ করতে চান তাদের কেবল INFOলগার এবং হ্যান্ডলার উভয়কেই এটি সেট করতে হবে ।
টেস্ট ওয়ার্কস

আমি করার নমুনাটি আপডেট করেছি logger.setLevel(logging.DEBUG)- মন্তব্যের জন্য ধন্যবাদ
এলি বেন্ডারস্কি

13

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

import logging.config
if __name__ == '__main__':
    # Configure the logger
    # loggerConfigFileName: The name and path of your configuration file
    logging.config.fileConfig(path.normpath(loggerConfigFileName))

    # Create the logger
    # Admin_Client: The name of a logger defined in the config file
    mylogger = logging.getLogger('Admin_Client')

    msg='Bite Me'
    myLogger.debug(msg)
    myLogger.info(msg)
    myLogger.warn(msg)
    myLogger.error(msg)
    myLogger.critical(msg)

    # Shut down the logger
    logging.shutdown()

লগ কনফিগার ফাইলের জন্য আমার কোড এখানে

#These are the loggers that are available from the code
#Each logger requires a handler, but can have more than one
[loggers]
keys=root,Admin_Client


#Each handler requires a single formatter
[handlers]
keys=fileHandler, consoleHandler


[formatters]
keys=logFormatter, consoleFormatter


[logger_root]
level=DEBUG
handlers=fileHandler


[logger_Admin_Client]
level=DEBUG
handlers=fileHandler, consoleHandler
qualname=Admin_Client
#propagate=0 Does not pass messages to ancestor loggers(root)
propagate=0


# Do not use a console logger when running scripts from a bat file without a console
# because it hangs!
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)# The comma is correct, because the parser is looking for args


[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=logFormatter
# This causes a new file to be created for each script
# Change time.strftime("%Y%m%d%H%M%S") to time.strftime("%Y%m%d")
# And only one log per day will be created. All messages will be amended to it.
args=("D:\\Logs\\PyLogs\\" + time.strftime("%Y%m%d%H%M%S")+'.log', 'a')


[formatter_logFormatter]
#name is the name of the logger root or Admin_Client
#levelname is the log message level debug, warn, ect 
#lineno is the line number from where the call to log is made
#04d is simple formatting to ensure there are four numeric places with leading zeros
#4s would work as well, but would simply pad the string with leading spaces, right justify
#-4s would work as well, but would simply pad the string with trailing spaces, left justify
#filename is the file name from where the call to log is made
#funcName is the method name from where the call to log is made
#format=%(asctime)s | %(lineno)d | %(message)s
#format=%(asctime)s | %(name)s | %(levelname)s | %(message)s
#format=%(asctime)s | %(name)s | %(module)s-%(lineno) | %(levelname)s | %(message)s
#format=%(asctime)s | %(name)s | %(module)s-%(lineno)04d | %(levelname)s | %(message)s
#format=%(asctime)s | %(name)s | %(module)s-%(lineno)4s | %(levelname)-8s | %(message)s

format=%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s


#Use a separate formatter for the console if you want
[formatter_consoleFormatter]
format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%(lineno)04d | %(message)s

1
একটি তারিখের সাথে ফাইলটির নামকরণের জন্য %%পাইথন 3 এ দ্বিগুণ প্রয়োজন eg উদাহরণস্বরূপtime.strftime("%%Y%%m%%D")
এএইচ

9

http://docs.python.org/library/logging.html#logging.basicConfig

logging.basicConfig(filename='/path/to/your/log', level=....)

1
এটি ফাইলের লগগুলি সংরক্ষণ করে, এটি ভাল। যদি এর সাথে একসাথে হয় তবে আমি কী টার্মিনালে আউটপুটগুলি লগ করতে চাই?
habষভ অগ্রহরি

অফিসিয়াল loggingমডিউল ডকুমেন্টেশন এটির জন্য অনুমতি দেয়। আপনি লগগুলি টার্মিনালে যায় এবং কোনটি কোনও ফাইলে যায় এবং আরও অনেক আকর্ষণীয় অ্যাপ্লিকেশন চয়ন করতে পারেন। docs.python.org/3/howto/…
ড্যানিয়েল হার্নান্দেজ

4

এটি সম্পর্কে একটি সহজ উপায় এখানে। এই সমাধানটি কোনও কনফিগার অভিধান ব্যবহার করে না এবং ঘূর্ণন ফাইল হ্যান্ডলার ব্যবহার করে, যেমন:

import logging
from logging.handlers import RotatingFileHandler

logging.basicConfig(handlers=[RotatingFileHandler(filename=logpath+filename,
                     mode='w', maxBytes=512000, backupCount=4)], level=debug_level,
                     format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')

logger = logging.getLogger('my_logger')

বা পছন্দ মত:

import logging
from logging.handlers import RotatingFileHandler

handlers = [
            RotatingFileHandler(filename=logpath+filename, mode='w', maxBytes=512000, 
                                backupCount=4)
           ]
logging.basicConfig(handlers=handlers, level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')

logger = logging.getLogger('my_logger')

হ্যান্ডলারগুলির পরিবর্তনশীলটির পুনরাবৃত্ত হওয়া দরকার। লগপথ + ফাইলের নাম এবং ডিবাগ_লেভেল কেবল সম্পর্কিত ভেরিয়েবল সম্পর্কিত তথ্য। অবশ্যই, ফাংশন প্যারামগুলির জন্য মানগুলি আপনার উপর নির্ভর করে।

প্রথমবার যখন আমি লগিং মডিউলটি ব্যবহার করছিলাম তখন আমি নিম্নলিখিতটি লিখতে ভুল করেছিলাম যা একটি ওএস ফাইল লক ত্রুটি উত্পন্ন করে (উপরের দিকটিই এর সমাধান):

import logging
from logging.handlers import RotatingFileHandler

logging.basicConfig(filename=logpath+filename, level=debug_level, format='%(levelname)s %(asctime)s %(message)s', datefmt='%m/%d/%Y
 %I:%M:%S %p')

logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(filename=logpath+filename, mode='w', 
                  maxBytes=512000, backupCount=4))

আর বব তোমার মামা!


3

http://docs.python.org/library/logging.handlers.html#filehandler

FileHandlerবর্গ, কোর অবস্থিত loggingপ্যাকেজ, একটি ডিস্ক ফাইলে লগিং আউটপুট পাঠায়।


3
+1 সম্পূর্ণ উদাহরণের জন্য, "বেসিক টিউটোরিয়াল" দেখুন: docs.python.org/howto/logging.html#logging-to-a-file
ফার্ডিনান্ড বায়ার

আমি পছন্দ করি কিভাবে FileHandlerবিভিন্ন পরিস্থিতিতে বিভিন্ন ধরণের রয়েছে । ( WatchedFileHandler, RotatingFileHandlerইত্যাদি)
জেএবি

0
import sys
import logging

from util import reducer_logfile
logging.basicConfig(filename=reducer_logfile, format='%(message)s',
                    level=logging.INFO, filemode='w')

0

এই উদাহরণটি ভাল কাজ করা উচিত। আমি কনসোলের জন্য স্ট্রিমহ্যান্ডলার যুক্ত করেছি। কনসোল লগ এবং ফাইল হ্যান্ডলার ডেটা একই হওয়া উচিত।

    # MUTHUKUMAR_TIME_DATE.py #>>>>>>>> file name(module)

    import sys
    import logging
    import logging.config
    # ================== Logger ================================
    def Logger(file_name):
        formatter = logging.Formatter(fmt='%(asctime)s %(module)s,line: %(lineno)d %(levelname)8s | %(message)s',
                                      datefmt='%Y/%m/%d %H:%M:%S') # %I:%M:%S %p AM|PM format
        logging.basicConfig(filename = '%s.log' %(file_name),format= '%(asctime)s %(module)s,line: %(lineno)d %(levelname)8s | %(message)s',
                                      datefmt='%Y/%m/%d %H:%M:%S', filemode = 'w', level = logging.INFO)
        log_obj = logging.getLogger()
        log_obj.setLevel(logging.DEBUG)
        # log_obj = logging.getLogger().addHandler(logging.StreamHandler())

        # console printer
        screen_handler = logging.StreamHandler(stream=sys.stdout) #stream=sys.stdout is similar to normal print
        screen_handler.setFormatter(formatter)
        logging.getLogger().addHandler(screen_handler)

        log_obj.info("Logger object created successfully..")
        return log_obj
    # =======================================================


MUTHUKUMAR_LOGGING_CHECK.py #>>>>>>>>>>> file name
# calling **Logger** function
file_name = 'muthu'
log_obj =Logger(file_name)
log_obj.info("yes   hfghghg ghgfh".format())
log_obj.critical("CRIC".format())
log_obj.error("ERR".format())
log_obj.warning("WARN".format())
log_obj.debug("debug".format())
log_obj.info("qwerty".format())
log_obj.info("asdfghjkl".format())
log_obj.info("zxcvbnm".format())
# closing file
log_obj.handlers.clear()

OUTPUT:
2019/07/13 23:54:40 MUTHUKUMAR_TIME_DATE,line: 17     INFO | Logger object created successfully..
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 8     INFO | yes   hfghghg ghgfh
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 9 CRITICAL | CRIC
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 10    ERROR | ERR
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 11  WARNING | WARN
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 12    DEBUG | debug
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 13     INFO | qwerty
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 14     INFO | asdfghjkl
2019/07/13 23:54:40 MUTHUKUMAR_LOGGING_CHECK,line: 15     INFO | zxcvbnm

Thanks, 

0

ফর্ম্যাট বিবরণ

#%(name)s       Name of the logger (logging channel).
#%(levelname)s  Text logging level for the message ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').
#%(asctime)s    Human-readable time when the LogRecord was created. By default this is of the form ``2003-07-08 16:49:45,896'' (the numbers after the comma are millisecond portion of the time).
#%(message)s    The logged message. 

কল করার সাধারণ উপায়

import logging
#logging.basicConfig(level=logging.INFO)
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.info('Start reading database')
# read database here
records = {'john': 55, 'tom': 66}
logger.debug('Records: %s', records)
logger.info('Updating records ...')
# update records here
logger.info('Finish updating records')

আউটপুট

INFO:__main__:Start reading database
DEBUG:__main__:Records: {'john': 55, 'tom': 66}
INFO:__main__:Updating records ...
INFO:__main__:Finish updating records

ডিক্ট, কল মান ব্যবহার করে

import logging
import logging.config
import otherMod2

def main():
    """
    Based on http://docs.python.org/howto/logging.html#configuring-logging
    """
    dictLogConfig = {
        "version":1,
        "handlers":{
                    "fileHandler":{
                        "class":"logging.FileHandler",
                        "formatter":"myFormatter",
                        "filename":"config2.log"
                        }
                    },        
        "loggers":{
            "exampleApp":{
                "handlers":["fileHandler"],
                "level":"INFO",
                }
            },

        "formatters":{
            "myFormatter":{
                "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
                }
            }
        }

    logging.config.dictConfig(dictLogConfig)

    logger = logging.getLogger("exampleApp")

    logger.info("Program started")
    result = otherMod2.add(7, 8)
    logger.info("Done!")

if __name__ == "__main__":
    main()

otherMod2.py

import logging
def add(x, y):
    """"""
    logger = logging.getLogger("exampleApp.otherMod2.add")
    logger.info("added %s and %s to get %s" % (x, y, x+y))
    return x+y

আউটপুট

2019-08-12 18:03:50,026 - exampleApp - INFO - Program started
2019-08-12 18:03:50,026 - exampleApp.otherMod2.add - INFO - added 7 and 8 to get 15
2019-08-12 18:03:50,027 - exampleApp - INFO - Done!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.