תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

לוגים של פייתון ב-5 צעדים פשוטים

מחבר:
בתאריך:

מאוד קל לכתוב הודעות לקונסולה של פייתון וזה גם מה שרובנו עושים כשאנחנו מפתחים תוכנה אבל כשמעלים את הקוד ל-production מועיל יותר לכתוב את ההודעות לקבצי לוגים בגלל שאנחנו רוצים שהתוכנה תשאיר תיעוד של הפעולות שהיא עושה בפרט אם משהו השתבש. איך כותבים קבצי לוגים בקלות וביעילות? לצורך זה פייתון נותן לנו את המודול logging.

השימוש במערכת הלוגים כרוך בביצוע 5 צעדים פשוטים.

  1. נייבא את המודול logging :

    import logging
  2. נגדיר את רמת החומרה המינימלית של הודעות שאנו מצפים שיופיעו בתיעוד. המודול logging יודע להבחין בין 5 דרגות חומרה של הודעות ללוג:

    • DEBUG
    • INFO
    • WARNING
    • ERROR
    • CRITICAL

    הרשימה מסודרת לפי חומרה: DEBUG זו הרמה הכי פחות חמורה, CRITICAL היא רמת החומרה הגבוהה ביותר.

    צריך להגדיר את רמת החומרה המינימלית של הודעות שאתה מצפה למצוא בלוג באמצעות התחביר:

    logging.basicConfig(level=logging.[LEVEL])

    לדוגמה:

    # Set the logging level
    logging.basicConfig(level=logging.INFO)

    אומר למערכת הלוגים להציג את כל רמות החומרה שהם מעל וכולל רמת INFO. הרמה הנמוכה יותר (DEBUG במקרה זה) לא תירשם ללוגים.

  3. כדי לראות הודעות ברמות חומרה שונות נשתמש בתחביר:

    logging.[LEVEL]()

    לדוגמה:

    import logging
    
    # Set the logging level
    logging.basicConfig(level=logging.DEBUG)
    
    # Add log messages
    logging.debug("This is a debug message")
    logging.info("This is an info message")
    logging.warning("This is a warning message")
    logging.error("This is an error message")
    logging.critical("This is a critical message")

    נריץ את הקוד ונראה את ההודעות מופיעות בקונסולה:

    DEBUG:root:This is a debug message
    INFO:root:This is an info message
    WARNING:root:This is a warning message
    ERROR:root:This is an error message
    CRITICAL:root:This is a critical message

    אומנם ההודעות מופיעות בקונסולה אבל הם לא נרשמות לקובץ. כדי שירשמו תצטרך לעקוב אחר הצעדים הנותרים.

  4. נשתמש ב-formatter על מנת לפרמט את הטמפלייט של הודעות השגיאה כדי שיכלול מידע נוסף דוגמת: זמן הכתיבה ללוג, שם הסקריפט, רמת החומרה.

    # Format the log messages
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    קיימות אפשרויות נוספות להגדרת הפורמט, דוגמת filename ו-funcName בשביל להציג את שם הקובץ ושם הפונקציה. את כל האפשרויות אפשר לראות בתיעוד הרשמי של המודול.

  5. ברירת המחדל היא כתיבה של הלוגים לקונסולה. כדי לכתוב לקובץ המודול נשתמש ב-FileHandler שמקבל את ה-formatter מהסעיף הקודם בתור פרמטר:

    # Format the log messages
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler = logging.FileHandler('example.log')
    file_handler.setFormatter(formatter)
    
    # Write the logs to a file
    logger = logging.getLogger(__name__)
    logger.addHandler(file_handler)
    • הפונקציה getLogging מגדירה אובייקט logger אותו ניתן לקנפג כרצוננו. ברירת המחדל מייחסת את ה-looger ל- root . בקוד לעיל אנו משתמשים בפרמטר __name__ כדי לייחס את ה-logger לסקריפט (או למודול) הנוכחי.

  6. אחרי שביצענו את 5 הצעדים רק נשאר לכתוב הודעה ללוג כדי לוודא שאכן עובד:

    # Add a log message to the file
    logger.error('This is an error message in the file')

    עכשיו הכל ביחד:

    import logging
    
    # Set the logging level
    logging.basicConfig(level=logging.DEBUG)
    
    # Format the log messages
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler = logging.FileHandler('example.log')
    file_handler.setFormatter(formatter)
    
    # Write the logs to a file
    logger = logging.getLogger(__name__)
    logger.addHandler(file_handler)
    
    # Add a log message to the file
    logger.error('This is an error message in the file')

    נריץ את הקוד פעם אחת וכשנפתח את קובץ הלוג "example.log" נראה:

    2023-03-06 06:10:16,537 - __main__ - ERROR - This is an error message in the file

     

    כיצד לרשום Exception ללוגים

    כדי לרשום exceptions ללוגים צריך להשתמש בבלוק try-except כדי לתפוס את ה-exception ואז להשתמש במודול logging כדי לרשום את ה-exception ללוגים. לדוגמה:

    def divide_by_zero():
        try:
            # some code that may raise an exception
            a = 1 / 0
        except Exception as e:
            # log the exception
            logger.exception("An error occurred: %s", str(e))
    
    divide_by_zero()

    התוצאה תהיה רישום של לוג הכולל את ה-exception :

    2023-03-06 06:20:53,307 - __main__ - ERROR - An error occurred: division by zero
    Traceback (most recent call last):
      File "/home/joe/projects/learn_python/venv/learn_logging.py", line 27, in divide_by_zero
        a = 1 / 0
    ZeroDivisionError: division by zero

     

    מדריכים נוספים בסדרה ללימוד פייתון

    קריאה וכתיבה של קבצים בפייתון

    טיפול בחריגים בפייתון באמצעות הבלוקים try ו-except

    קוד אסינכרוני בפייתון באמצעות ספריית asyncio

     

    לכל המדריכים בסדרה ללימוד פייתון

     

    אהבתם? לא אהבתם? דרגו!

    0 הצבעות, ממוצע 0 מתוך 5 כוכבים

     

 

המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.

למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך אומרים בעברית אינטרנט?