Logging fileHandler and StreamHandler in python

 fileHandler

#  কোনো ইরর হলে সেটি db_errors.log নামক ফাইলে জমা হবে।
# Logging Library: Python-এর বিল্ট-ইন logging মডিউল ব্যবহার করে আপনি প্রফেশনাল ভাবে লগ ট্র্যাক করতে পারেন।
# Try-Except Block: কোডের মূল অংশকে try ব্লকের মধ্যে রাখা হয়েছে যাতে কোনো লাইন এক্সিকিউট করার সময় সমস্যা হলে প্রোগ্রামটি বন্ধ না হয়ে সরাসরি except ব্লকে চলে যায় এবং এররটি লগ ফাইলে লিখে দেয়।INSERT OR IGNORE: আপনি যদি কোডটি দ্বিতীয়বার রান করেন, তবে প্রাইমারি কি-র কারণে ইরর আসতে পারে। এটি এড়াতে INSERT OR IGNORE ব্যবহার করা নিরাপদ।
import sqlite3
import logging

# লগিং কনফিগারেশন
logger = logging.getLogger('db_logger')
logger.setLevel(logging.ERROR) # শুধুমাত্র এরর লেভেল বা তার উপরের মেসেজ রেকর্ড করবে

# ফাইল হ্যান্ডলার তৈরি (যে ফাইলে লগ সেভ হবে)
file_handler = logging.FileHandler('db_errors.log')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

try:
    connection = sqlite3.connect("store_db.db")
    cursore = connection.cursor()

    # create store table
    command1 = """CREATE TABLE IF NOT EXISTS
    stores(store_id INTEGER PRIMARY KEY, location text)"""
    cursore.execute(command1)

    # create purchase table
    command2 = """CREATE TABLE IF NOT EXISTS
    purchase(purchase_id integer primary key,
    store_id integer, total_cost float,
    foreign key(store_id) references stores(store_id))
    """
    cursore.execute(command2)

    # add to store (একই আইডি বার বার ইনসার্ট করলে যেন ক্র্যাশ না করে তাই INSERT OR IGNORE ব্যবহার করা হয়েছে)
    cursore.execute("INSERT OR IGNORE INTO stores VALUES (21,'fultala')")
    cursore.execute("INSERT OR IGNORE INTO stores VALUES (22,'shakpala')")
    cursore.execute("INSERT OR IGNORE INTO stores VALUES (23,'sathmatha')")

    # add to purchase
    cursore.execute("INSERT OR IGNORE INTO purchase VALUES(54,21,50.52)")
    cursore.execute("INSERT INTO purchase VALUES(55,22,60.52)")

    connection.commit()
    print("কাজ সফলভাবে সম্পন্ন হয়েছে।")

except sqlite3.Error as e:
    # ডাটাবেজ সংক্রান্ত যেকোনো ইরর ফাইলে লিখে রাখবে
    logger.error(f"Database error: {e}")
    print(f"একটি ডাটাবেজ ইরর হয়েছে। বিস্তারিত 'db_errors.log' ফাইলে দেখুন।")

finally:
    if connection:
        connection.close()

//////////////////////////////////

streamHandler

# FileHandler-এর পাশাপাশি StreamHandler যুক্ত করে দেওয়া হলো। এর ফলে এররগুলো একই সাথে আপনার লগ ফাইলে জমা হবে এবং আপনার টার্মিনাল বা কনসোলে (Screen) সরাসরি দেখা যাবে।
# StreamHandler(sys.stdout): এটি আপনার পাইথন আউটপুট স্ক্রিনে বা টার্মিনালে লগ মেসেজগুলো প্রিন্ট করবে।লেভেল ম্যানেজমেন্ট: আমি StreamHandler-এ DEBUG লেভেল দিয়েছি যাতে আপনি সব ছোটখাটো ইনফরমেশনও স্ক্রিনে দেখতে পান, কিন্তু FileHandler-এ শুধু ERROR দিয়েছি যাতে লগ ফাইলটি অকারণে বড় না হয়।logger.info(): সফল ধাপগুলো স্ক্রিনে দেখার জন্য এটি ব্যবহার করা হয়েছে।
import sqlite3
import logging
import sys

# ১. লগার সেটআপ
logger = logging.getLogger('db_logger')
logger.setLevel(logging.DEBUG) # সব ধরনের মেসেজ ধরার জন্য DEBUG লেভেল

# ২. ফরম্যাটার তৈরি (মেসেজটি দেখতে কেমন হবে)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# ৩. FileHandler: এররগুলো ফাইলে সেভ করার জন্য
file_handler = logging.FileHandler('db_errors.log')
file_handler.setLevel(logging.ERROR) # ফাইলে শুধু ERROR গুলো থাকবে
file_handler.setFormatter(formatter)

# ৪. StreamHandler: টার্মিনালে সরাসরি আউটপুট দেখার জন্য
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(logging.DEBUG) # কনসোলে সব ধরনের (INFO, DEBUG, ERROR) মেসেজ দেখাবে
stream_handler.setFormatter(formatter)

# ৫. হ্যান্ডলারগুলো লগারের সাথে যুক্ত করা
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

try:
    connection = sqlite3.connect("store_db.db")
    cursore = connection.cursor()

    # টেবিল তৈরি
    cursore.execute("""CREATE TABLE IF NOT EXISTS
    stores(store_id INTEGER PRIMARY KEY, location text)""")

    cursore.execute("""CREATE TABLE IF NOT EXISTS
    purchase(purchase_id integer primary key,
    store_id integer, total_cost float,
    foreign key(store_id) references stores(store_id))""")

    # ডাটা ইনসার্ট (সহজে ভুল ধরার জন্য সাধারণ INSERT ব্যবহার করা হয়েছে)
    logger.info("ডাটা ইনসার্ট করা হচ্ছে...")
   
    cursore.execute("INSERT INTO stores VALUES (21,'fultala')")
    cursore.execute("INSERT INTO stores VALUES (22,'shakpala')")
    cursore.execute("INSERT INTO stores VALUES (23,'sathmatha')")

    cursore.execute("INSERT INTO purchase VALUES(54,21,50.52)")
    cursore.execute("INSERT INTO purchase VALUES(55,22,60.52)")

    connection.commit()
    logger.info("সব ডাটা সফলভাবে সেভ হয়েছে।")

except sqlite3.Error as e:
    # ডাটাবেজ এরর হলে তা ফাইল এবং কনসোল উভয় জায়গায় দেখাবে
    logger.error(f"Database error occurred: {e}")

finally:
    if 'connection' in locals():
        connection.close()
        logger.info("ডাটাবেজ কানেকশন বন্ধ করা হয়েছে।")


Comments

Popular posts from this blog

Basic Web Design with HTML and CSS

Web Design JavaScript