לוגים של פייתון ב-5 צעדים פשוטים
מאוד קל לכתוב הודעות לקונסולה של פייתון וזה גם מה שרובנו עושים כשאנחנו מפתחים תוכנה אבל כשמעלים את הקוד ל-production מועיל יותר לכתוב את ההודעות לקבצי לוגים בגלל שאנחנו רוצים שהתוכנה תשאיר תיעוד של הפעולות שהיא עושה בפרט אם משהו השתבש. איך כותבים קבצי לוגים בקלות וביעילות? לצורך זה פייתון נותן לנו את המודול logging.
השימוש במערכת הלוגים כרוך בביצוע 5 צעדים פשוטים.
-
נייבא את המודול logging :
import logging
-
נגדיר את רמת החומרה המינימלית של הודעות שאנו מצפים שיופיעו בתיעוד. המודול 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 במקרה זה) לא תירשם ללוגים.
-
כדי לראות הודעות ברמות חומרה שונות נשתמש בתחביר:
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
אומנם ההודעות מופיעות בקונסולה אבל הם לא נרשמות לקובץ. כדי שירשמו תצטרך לעקוב אחר הצעדים הנותרים.
-
נשתמש ב-formatter על מנת לפרמט את הטמפלייט של הודעות השגיאה כדי שיכלול מידע נוסף דוגמת: זמן הכתיבה ללוג, שם הסקריפט, רמת החומרה.
# Format the log messages formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
קיימות אפשרויות נוספות להגדרת הפורמט, דוגמת filename ו-funcName בשביל להציג את שם הקובץ ושם הפונקציה. את כל האפשרויות אפשר לראות בתיעוד הרשמי של המודול.
-
ברירת המחדל היא כתיבה של הלוגים לקונסולה. כדי לכתוב לקובץ המודול נשתמש ב-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 לסקריפט (או למודול) הנוכחי.
-
אחרי שביצענו את 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 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.