שאלה:
שלום שלום לכולם,
אני בדיוק מקנפג באפליקציה כלשהי מערכת רישום אירועים (logging), ספציפית
אני משתמש ב-log4net אבל השאלות שעלו במוחי הן כלליות יותר.
את מודול רישום האירועים מקנפגים לרוב בקובץ הקונפיג' של האתר web.config.
לעתים תכופות יש באתר מודולים חיצוניים (בזמן פיתוח אילו פרוייקטים נוספים,
לאחר מכן אילו DLLים באתר. למשל מודול להצפנה שהוא פרוייקט נפרד לחלוטין. גם הוא רוצה לרשום אירועים.
שאלותיי הן: [שאלות ותשובות שזורות בתשובה לנוחות קריאה]
תשובה:
שאלה 1) האם מבחינה טכנית מודולים חיצוניים יוכלו לגשת ישירות להגדרות web.config? למשל דרך ConfigurationManager?
מבחינה טכנית, קיימת ירושה בין קבצי קונפיגיורציה ברמות שונות. למשל קובץ ה-Web.config של כל אפליקציה יורש בהכרח את הקונפיגיורציה של ה-machine.config.
כל ספריית קוד יורשת את הקובץ קונפיגיורציה של הספריות קוד מעליה.
ולכן למשל, באפליקציית ASP.Net עם קובץ web.config או באפליקציה חלונאית עם קובץ App.config כל הכיוונים בקבצי קונפיגיורציה יהיו זמינים בגישה ל-App.config של הספריות שהן תלויות בהן. גם אם הקובץ קונפיוגרציה של הספריות התלויות לא קיים בפועל, עדיין תתקיים הירושה הזו.
שאלה 2) האם זה נכון לטעמכם מבחינת הנדסת תוכנה שמודולים חיצונים (שיכולים לשמש אתרים אחרים גם) תלויים בקובץ קונפיג של אתר ספציפי ומניחים הנחות לגביו.
כן, קונפיגיורציה של דברים כלליים באפליקציה (לוגינג ואבטחה הן המקרים הקלאסיים) חייבים להיות מרוכזים במקום אחד.
לוגינג למשל זה לא באמת פיצ'ר במערכת אלא זה כלי פיתוח ותחזוקה וחשוב שהשימוש בו יהיה קל ככל הניתן אחרת יפסיק להיות יעיל.
שאלה 3) אינני רוצה שכל קוד באתר שרוצה לרשום אירוע יצטרך לאתחל מופע של מודול הרישום, הייתי רוצה שיהיה מקום מרכזי (סטטי) שדרכו עושים את כל רישום האירועים. איפה וכיצד הכי נכון להגדיר מקום מרכזי כזה?
מבחינת ארכיטוקטורה נהוג ליצור שכבת Common שנגישה לכל הפרוייקטים ב-Solution ושם לשים את ה-Logging.
כמובן שאם הלוגר הוא יותר ממחלקה אחת אלא מערך לוגי מורכב, עדיף ליצור פרוייקט שיהיה בשימוש ע"י ה-Common ויכיל את לוגיקת הלוגינג.
ב-log4net צריך ליצור מחלקה סטטית עם מופע סטטי של הלוגר לפי קובץ הקונפיגיורציה.
כמו כן, אישית, אני מעדיף שהמידע של אסמבליס חיצוניות לא יישב ב-Custom Sections בתוך ה-web.config שלי מחשש ששינוי בקונפיוגרציה לא חיונית יגרום לאתחול האפליקציה. למשל ב-ASP.Net אני יוצר קובץ Log4net.xml שיכיל את הקונפיגיורציה של log4net ולטעון אותו דרך application_start עם Watcher שידאג לטעון את השינויים אם יש כאלו.
בעבודה עם log4net וספריות תוכנה שונות, יש אפשרות לאתחל לוגרים שונים לאפליקציות שונות. כלומר, שלכל אפליקציה יהיה לוגר משלה לפי איזה לוגר היא מנסה לאתחל. למשל, הספרייה NHibenrate מנסה לאתחל לוגר בשם NHibernate ואם זה לא קיים מסתמכת על הברירת מחדל של Log4net (קונפיוגרציית root).
צריך לשקול את הצורך לבצע צעד כזה מול הצורך האמיתי לקבוע רמות לוגינג שונות לחלקים שונים של האפליקציה כנגד העלות התחזוקתית שתיווצר (מחלקות לוגינג שונות לכל חלק מהאפליקציה ולא לוגר מרכזי). למשל באמת במקרה של NHibernate באמת צריך תמיד לדאוג שהלוגר שלו יהיה מכובה אם רוצים שהאפליקציה תרוץ.
קישור (המשך הדיון מומלץ בחום): http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=91944467