הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.
לעיון במסמכי התיעוד של
Apigee Edge
המדיניות MessageLogging מאפשרת לכם לרשום ביומן הודעות מותאמות אישית ב-Cloud Logging או ב-syslog. אתם יכולים להשתמש במידע שביומנים למשימות שונות, כמו איתור בעיות בסביבת זמן הריצה של ה-API.
המדיניות הזו היא מדיניות שניתנת להרחבה, והשימוש בה עשוי להשפיע על העלויות או על הניצול, בהתאם לרישיון שלכם ל-Apigee. למידע על סוגי מדיניות והשלכות השימוש, אפשר לעיין במאמר בנושא סוגי מדיניות.
יש שתי דרכים להשתמש במדיניות MessageLogging:
- רכיב
<CloudLogging>מתעד הודעות ב-Logging. כדי להשתמש בשיטה הזו, צריך להפעיל את Cloud Logging API בפרויקט Google Cloud . למידע נוסף על הפעלת ממשקי API בפרויקט Google Cloud , אפשר לעיין במאמר הפעלה והשבתה של שירותים. - רכיב
<Syslog>מתעד הודעות ב-syslog, פרוטוקול סטנדרטי לשליחת יומן מערכת או הודעות אירוע לשרת ספציפי. כדי להשתמש בשיטה הזו, צריך שיהיה שרת syslog זמין. אם אין לכם שרת כזה, אתם יכולים להשתמש בשירותים ציבוריים לניהול יומנים, כמו Splunk, Sumo Logic ו-Loggly. מידע נוסף זמין במאמר בנושא הגדרת שירותים לניהול יומנים של צד שלישי.
הערה: אי אפשר להשתמש גם ברכיב <CloudLogging> וגם ברכיב <Syslog> באותה מדיניות.
רכיב <MessageLogging>
הגדרה של מדיניות <MessageLogging>.
| ערך ברירת המחדל | מידע נוסף מופיע בכרטיסייה מדיניות ברירת המחדל שבהמשך |
| חובה? | חובה |
| סוג | סוג |
| רכיב אב | לא רלוונטי |
| רכיבי צאצא | <CloudLogging><Syslog><logLevel> |
רכיב <MessageLogging> משתמש בתחביר הבא:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <MessageLogging continueOnError="false" enabled="true" name="Message-Logging-1"> <DisplayName>Message Logging-1</DisplayName> <Syslog> <!-- Note: You cannot use both the <Syslog> element and the <CloudLogging> element in the same policy. --> <Message>Some message for syslog</Message> <Host>localhost</Host> <Port>514</Port> </Syslog> <CloudLogging> <!-- Note: You cannot use both the <CloudLogging> and the <Syslog> element in the same policy. --> <LogName>projects/{organization.name}/logs/{log.id}</LogName> <Message contentType="application/json">{"{message.queryparam.key}": "{message.queryparam.value}"}</Message> <Labels> <Label> <Key>key1</Key> <Value>value1</Value> </Label> <Label> <Key>key2</Key> <Value>value2</Value> </Label> </Labels> <ResourceType>api</ResourceType> <Endpoint>regional-endpoint</Endpoint> </CloudLogging> <logLevel>ALERT</logLevel> </MessageLogging>
לרכיב הזה יש את המאפיינים הבאים שמשותפים לכל המדיניות:
| מאפיין | ברירת מחדל | חובה? | תיאור |
|---|---|---|---|
name |
לא רלוונטי | חובה |
השם הפנימי של המדיניות. הערך של מאפיין אפשר להשתמש ברכיב |
continueOnError |
FALSE | אופציונלי | מגדירים את הערך false כדי להחזיר שגיאה אם המדיניות נכשלת. זו התנהגות צפויה ברוב המקרים. הגדרה ל-true מאפשרת להמשיך את הביצוע של התהליך גם אחרי שמדיניות נכשלת. מאמרים קשורים:
|
enabled |
TRUE | אופציונלי | מגדירים את הערך true כדי לאכוף את המדיניות, או את הערך false כדי להשבית את המדיניות. המדיניות לא נאכפת גם אם היא עדיין משויכת לזרימה. |
async |
FALSE | הוצא משימוש | המאפיין הזה הוצא משימוש. |
בטבלה הבאה מפורטים רכיבי המשנה של <MessageLogging>:
| שם השדה | תיאור השדה |
|---|---|
CloudLogging |
הגדרת רישום הודעות ב-Cloud Logging. |
Syslog |
הגדרת ההודעות כך שיירשמו ביומן ב- |
דוגמאות
CloudLogging
<MessageLogging name="LogToCloudLogging">
<CloudLogging>
<LogName>projects/{organization.name}/logs/{log.id}</LogName>
<Message contentType="application/json">{"{message.queryparam.key}": "{message.queryparam.value}"}</Message>
<Labels>
<Label>
<Key>key1</Key>
<Value>value1</Value>
</Label>
<Label>
<Key>key2</Key>
<Value>value2</Value>
</Label>
</Labels>
<ResourceType>api</ResourceType>
<Endpoint>logging.us.rep.googleapis.com:443</Endpoint>
</CloudLogging>
</MessageLogging>בדוגמה הזו מוצג שימוש ב
תבניות של הודעות. Since the Message element contains the flow
variables
{"{message.queryparam.key}": "{message.queryparam.value}"}כשמישהו מתקשר לשרת ה-proxy עם הערכים
message.queryparam.key = "fruit" ו-
message.queryparam.value = "apple", רשומת היומן שתתקבל תהיה
{"fruit": "apple"}.
Syslog
<MessageLogging name="LogToSyslog">
<Syslog>
<Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {request.queryparam.w}.</Message>
<Host>logs-01.loggly.com</Host>
<Port>514</Port>
<Protocol>TCP</Protocol>
<FormatMessage>true</FormatMessage>
<DateFormat>yyMMdd-HH:mm:ss.SSS</DateFormat>
</Syslog>
<logLevel>ALERT</logLevel>
</MessageLogging>בדוגמה הזו, נניח שאתם צריכים לרשום ביומן מידע על כל הודעת בקשה שממשק ה-API מקבל מאפליקציות צרכניות. הערך 3f509b58 מייצג ערך מפתח ספציפי לשירות loggly. אם יש לכם חשבון Loggly, מחליפים את מפתח Loggly. הודעת היומן שנוצרת תאוכלס בארבעה ערכים: הארגון, ה-API proxy ושם הסביבה שמשויכים לעסקה, יחד עם הערך של פרמטר שאילתה בהודעת הבקשה. הפורמט של חותמות הזמן יהיה דומה ל-230704-13:42:17.376, בהתאם לפורמט שצוין ברכיב DateFormat.
Syslog באמצעות TLS/SSL
<MessageLogging name="LogToSyslog">
<Syslog>
<Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {request.queryparam.w}.</Message>
<Host>logs-01.loggly.com</Host>
<Port>6514</Port>
<Protocol>TCP</Protocol>
<FormatMessage>true</FormatMessage>
<SSLInfo>
<Enabled>true</Enabled>
</SSLInfo>
</Syslog>
<logLevel>WARN</logLevel>
</MessageLogging>אתם יכולים לשלוח הודעות לספקי רישום הודעות של צד שלישי באמצעות TLS/SSL על ידי הוספת הבלוק <SSLInfo>.
הפניה לרכיב צאצא
בקטעים הבאים מתוארים רכיבי הצאצא של <MessageLogging>.
<CloudLogging>
משתמשים ברכיב <CloudLogging> כדי לרשום הודעות ביומן ב-Cloud Logging.
| שם השדה | חובה? | תיאור |
|---|---|---|
LogName |
כן | שם היומן. שם היומן צריך להיות בפורמט projects/{PROJECT_ID}/logs/{LOG_ID}.
אפשר להשתמש במשתנים במקום ב-{PROJECT_ID} וב-{LOG_ID}.
|
Message |
כן |
ההודעה שרוצים לרשום ביומן. להודעה יש מאפיין |
Label |
לא | תווית לצירוף להודעת היומן, אם יש כזו.
התוויות יהיו בפורמט של צמד מפתח/ערך כמו בדוגמה הבאה:
<Label>
<Key>key1</Key>
<Value>value1</Value>
</Label> |
ResourceType |
לא (ברירת המחדל היא כללית) | מייצג את המשאב במעקב שמייצר את היומנים. |
אימות ב-Cloud Logging
כדי להשתמש ברכיב <CloudLogging>, צריך לפרוס את ה-proxy ל-API כך שישתמש באימות של Google. Apigee ישתמש בפרטי כניסה שמתאימים לזהות של חשבון השירות שציינתם בבקשות היוצאות אל Cloud Logging. לפרטים נוספים, ראו שימוש באימות של Google.
לחשבון השירות שמצורף ל-proxy ל-API בזמן הפריסה צריך להיות תפקיד עם ההרשאה logging.logEntries.create. אלא אם אתם צריכים שליטה מדויקת יותר, מומלץ להשתמש בתפקיד המוגדר מראש roles/logging.logWriter לחשבון השירות. למידע נוסף על תפקידים בניהול זהויות והרשאות גישה (IAM) ב-<CloudLogging>, אפשר לעיין במדריך בקרת הגישה.
פריסת שרת proxy ב-Apigee Hybrid
אם משתמשים ב-Hybrid,
חשבון השירות של זמן הריצה שיוצרים עבור Hybrid צריך להתחזות לחשבון השירות של ה-proxy כדי לבצע קריאות מאומתות בשמו. לכן, לחשבון השירות של זמן הריצה של Hybrid צריך להיות התפקיד iam.serviceAccountTokenCreator בחשבון השירות של ה-proxy.
<Syslog>
משתמשים ברכיב <Syslog> כדי להגדיר את ההודעות שיירשמו ביומן ב-syslog.
כשמשתמשים ב-<Syslog>, שרת proxy ל-API מעביר הודעות יומן מ-Apigee לשרת syslog מרוחק. כדי להשתמש בשיטה הזו, צריך שיהיה שרת syslog זמין. אם אין לכם, תוכלו להשתמש בשירותים ציבוריים לניהול יומנים כמו Splunk, Sumo Logic ו-Loggly. מידע נוסף זמין במאמר בנושא הגדרת שירותים לניהול יומנים של צד שלישי.
| שם השדה | חובה? | תיאור השדה |
|---|---|---|
Message |
כן |
ההודעה שרוצים לרשום ביומן. להודעה יש מאפיין |
Host |
לא | שם המארח או כתובת ה-IP של השרת שאליו צריך לשלוח את ה-syslog. אם לא כוללים את הרכיב הזה, ברירת המחדל היא localhost. |
Port |
לא | היציאה שבה פועל syslog. אם לא כוללים את הרכיב הזה, ברירת המחדל היא 514. |
Protocol |
לא | TCP או UDP (ברירת מחדל). פרוטוקול UDP מספק ביצועים טובים יותר, אבל פרוטוקול TCP מבטיח שהודעות יועברו ליומן הרישום בשרת syslog. לשליחת הודעות syslog ב-TLS/SSL, נתמך רק TCP. |
FormatMessage |
לא, אבל נדרש <FormatMessage>true</FormatMessage> כדי להשתמש ב-Loggly. |
האלמנט הזה מאפשר לכם לשלוט בפורמט של תוכן שנוצר על ידי Apigee ומוסף לפני ההודעה. אם המדיניות מוגדרת כ-True, לפני הודעת ה-syslog מופיע מספר קבוע של תווים, שמאפשר לכם לסנן את המידע הזה מההודעות. דוגמה לפורמט הקבוע:
המידע שנוצר על ידי Apigee כולל:
אם המדיניות מוגדרת כ-false (ברירת מחדל), התווים הקבועים האלה לא יתווספו בתחילת ההודעה. |
PayloadOnly |
לא |
הרכיב הזה מגדיר את הפורמט של הודעות שנוצרות על ידי Apigee כך שיכילו רק את גוף ההודעה של syslog, בלי התווים שנוספו בתחילת ההודעה שצוינו על ידי FormatMessage. אם לא כוללים את הרכיב הזה או משאירים אותו ריק, ערך ברירת המחדל הוא |
DateFormat |
לא |
מחרוזת תבנית עיצוב שמשמשת לעיצוב חותמת הזמן של כל הודעת יומן.
כברירת מחדל, Apigee משתמש ב- |
SSLInfo |
לא |
מאפשר לכם לרשום הודעות ביומן באמצעות SSL/TLS. שימוש עם רכיב המשנה אם לא כוללים את הרכיב הזה או משאירים אותו ריק, ערך ברירת המחדל הוא false (ללא TLS/SSL). <SSLInfo>
<Enabled>true</Enabled>
</SSLInfo>אפשר להגדיר את התג <SSLInfo> באותו אופן שבו מגדירים אותו ב-TargetEndpoint, כולל הפעלת TLS/SSL דו-כיווני, כפי שמתואר בהפניה להגדרת proxy ל-API. יש תמיכה רק בפרוטוקול TCP. |
<logLevel>
הערכים התקפים לרכיב <logLevel> הם: INFO (ברירת מחדל), ALERT, WARN, ERROR.
מגדירה רמה ספציפית של מידע שייכלל ביומן ההודעות.
אם משתמשים ברכיב FormatMessage (ומגדירים אותו כ-true), ההגדרה <logLevel> משפיעה על ניקוד העדיפות המחושב (המספר בתוך הסוגריים הזוויתיים) במידע שנוצר על ידי Apigee ומצורף בתחילת ההודעה.
הערות לגבי השימוש
כשמצרפים מדיניות MessageLogging לזרימת proxy ל-API, מומלץ למקם אותה בתגובת ProxyEndpoint, בזרימה מיוחדת שנקראת PostClientFlow. הזרימה PostClientFlow מופעלת אחרי שהתגובה נשלחת ללקוח ששלח את הבקשה, וכך מוודאים שכל המדדים זמינים לרישום ביומן. פרטים על השימוש ב-PostClientFlow מופיעים במאמר הפניה להגדרת proxy ל-API.
ה-PostClientFlow הוא מיוחד בשתי דרכים:
- היא מופעלת רק כחלק מתהליך התגובה.
- זהו התהליך היחיד שמופעל אחרי שה-proxy עובר למצב שגיאה.
היא מופעלת בלי קשר להצלחה או לכישלון של ה-proxy, ולכן אפשר להציב מדיניות MessageLogging ב-PostClientFlow ולהיות בטוחים שהיא תמיד תופעל.
בתמונה הבאה של כלי הניפוי באגים מוצגת מדיניות MessageLogging שמופעלת כחלק מה-PostClientFlow, אחרי הפעלת DefaultFaultRule:

בדוגמה הזו, המדיניות Verify API Key (אימות מפתח API) גרמה לשגיאה בגלל מפתח לא תקין.
בהמשך מוצגת ההגדרה של ProxyEndpoint שכוללת את PostClientFlow:
<ProxyEndpoint name="default">
...
<PostClientFlow>
<Response>
<Step>
<Name>Message-Logging-1</Name>
</Step>
</Response>
</PostClientFlow>
...
</ProxyEndpoint>הודעות ביומנים של Apigee נרשמות כטקסט פשוט, ואפשר להגדיר את הרישום ביומן כך שיכלול משתנים, כמו: התאריך והשעה שבהם הבקשה או התגובה התקבלו, זהות המשתמש בבקשה, כתובת ה-IP של המקור שממנו נשלחה הבקשה וכן הלאה.
הודעות ביומנים של Apigee נרשמות באופן אסינכרוני: התשובה מוחזרת בזמן שהיומנים עדיין נכתבים. כתוצאה מכך, חסימת קריאות לא מוסיפה זמן אחזור ל-API. יכול להיות שיהיו מקרים שבהם יומן לא ייכתב בלי שתחזור שגיאה, אבל האירועים האלה נדירים.
המדיניות MessageLogging כותבת הודעות שנרשמו ביומן בזיכרון למאגר זמני. כלי הרישום של ההודעות קורא הודעות מהמאגר ואז כותב ליעד שהגדרתם. לכל יעד יש מאגר משלו.
אם קצב הכתיבה למאגר גדל מעבר לקצב הקריאה, מתרחשת גלישה במאגר והרישום ייכשל. אם זה קורה, יכול להיות שאחת מההודעות הבאות תופיע בקובץ היומן:
- שימוש ב-
<CloudLogging>:steps.messagelogging.TooManyPendingLoggingRequest
- שימוש ב-
<Syslog>:Log message size exceeded. Increase the max message size setting
מגדילים את המאפיין max.log.message.size.in.kb (ערך ברירת המחדל = 128KB) בקובץ message-logging.properties.
ערכי ברירת מחדל למשתנים בתבנית הודעה
אפשר לציין ערכי ברירת מחדל לכל משתנה בתבנית ההודעה בנפרד. לדוגמה,
אם אי אפשר לפתור את המשתנה request.header.id, הערך שלו מוחלף
בערך unknown.
<Message>This is a test message. id = {request.header.id:unknown}</Message>אפשר לציין ערך ברירת מחדל משותף לכל המשתנים שלא נפתרו על ידי הגדרת המאפיין defaultVariableValue ברכיב Message:
<Message defaultVariableValue="unknown">This is a test message. id = {request.header.id}</Message>הגדרה של שירותי ניהול יומנים של צד שלישי
מדיניות MessageLogging מאפשרת לשלוח הודעות syslog לשירותי ניהול יומנים של צד שלישי, כמו Splunk, Sumo Logic ו-Loggly. אם רוצים לשלוח syslog לאחד מהשירותים האלה, צריך לעיין בתיעוד של השירות כדי להגדיר את המארח, היציאה והפרוטוקול של השירות, ואז להגדיר את רכיב ה-Syslog במדיניות בהתאם.
מידע על הגדרת ניהול יומנים של צד שלישי זמין במאמרי העזרה הבאים:
- Splunk (צריך לבחור את גרסת המוצר)
אפשר גם לעיין בפוסט הזה בקהילת Apigee: Log messages into Splunk -
Sumo
Logic
- כדאי גם לעיין בפוסט הזה בקהילת Apigee: הגדרת רישום ביומן באמצעות Sumo Logic
- דוגמה מלאה לשימוש ב-Sumo Logic כשירות רישום ביומן מופיעה בפוסט הבא בקהילת Apigee. הפתרון משתמש במדיניות JavaScript אחת כדי לבצע בקשות HTTP POST אל Sumo Logic HTTP Source Collector: Logging to Sumo Logic using JavaScript and HTTP
- Loggly
כשמשתמשים ב-Loggly, צריך להשתמש ב-<FormatMessage>true</FormatMessage>במדיניות כרכיב צאצא של רכיב<Syslog>.
מידע נוסף על רישום הודעות ב-Loggly זמין גם בפוסט הזה בקהילת Apigee: רישום הודעות ב-Loggly
הפניה לשגיאה
בקטע הזה מתוארים קודי התקלה והודעות השגיאה שמוחזרים, ומשתני התקלה שמוגדרים על ידי Apigee כשמדיניות כזו מפעילה שגיאה. חשוב לדעת את המידע הזה אם אתם מפתחים כללי תקלות לטיפול בתקלות. מידע נוסף על שגיאות שקשורות למדיניות ועל טיפול בשגיאות
שגיאות זמן ריצה
השגיאות האלה יכולות להתרחש כשהמדיניות מופעלת.
| קוד תקלה | סטטוס HTTP | מטרה |
|---|---|---|
steps.messagelogging.StepDefinitionExecutionFailed |
500 |
לצפייה במחרוזת השגיאה. |
steps.messagelogging.InvalidGoogleCloudLogName |
500 |
השגיאה הזו מוצגת אם הביטוי LogName לא מניב את הפורמט התקין של projects/{project}/logs/{logid}. |
steps.messagelogging.InvalidJsonMessage |
500 |
השגיאה הזו מופיעה כשערך המאפיינים contentType נבחר כ-application/json, אבל ערך ההודעה בפועל הוא לא מחרוזת JSON תקינה. |
steps.messagelogging.TooManyPendingLoggingRequest |
500 |
השגיאה הזו מופיעה כשיש יותר מ-2,500 בקשות בהמתנה שעדיין לא נכתבו ב-Cloud Logging. המגבלה של 2,500 היא לכל פוד של זמן ריצה ב-Apigee. לדוגמה, אם התנועה מתחלקת בין שני מופעים של פודים של Apigee runtime, המגבלה האפקטיבית היא 5,000 בקשות. |
שגיאות בהטמעה
השגיאות האלה יכולות להתרחש כשפורסים שרת proxy שמכיל את המדיניות הזו.
| שם השגיאה | מטרה | תיקון |
|---|---|---|
InvalidProtocol |
פריסת המדיניות MessageLogging עלולה להיכשל עם השגיאה הזו אם הפרוטוקול
שצוין ברכיב <Protocol> לא תקין. הפרוטוקולים התקינים הם TCP ו-UDP.
לשליחת הודעות syslog ב-TLS/SSL, נתמך רק TCP. |
build |
InvalidPort |
פריסת המדיניות MessageLogging עלולה להיכשל עם השגיאה הזו אם מספר היציאה
לא מצוין ברכיב <Port> או אם הוא לא תקין. מספר היציאה חייב להיות מספר שלם גדול מאפס. |
build |
משתני תקלות
המשתנים האלה מוגדרים כשמתרחשת שגיאת זמן ריצה. מידע נוסף על שגיאות שקשורות למדיניות
| משתנים | כאשר: | דוגמה |
|---|---|---|
fault.name="fault_name" |
fault_name הוא שם התקלה, כפי שמופיע בטבלה Runtime errors שלמעלה. שם התקלה הוא החלק האחרון של קוד התקלה. | fault.name Matches "StepDefinitionExecutionFailed" |
messagelogging.policy_name.failed |
policy_name הוא השם שהמשתמש הגדיר למדיניות שגרמה לשגיאה. | messagelogging.ML-LogMessages.failed = true |
דוגמה לתגובת שגיאה
{
"fault":{
"detail":{
"errorcode":"steps.messagelogging.StepDefinitionExecutionFailed"
},
"faultstring":"Execution failed"
}
}דוגמה לכלל שגיאה
<FaultRule name="MessageLogging">
<Step>
<Name>ML-LogMessages</Name>
<Condition>(fault.name Matches "StepDefinitionExecutionFailed") </Condition>
</Step>
<Condition>(messagelogging.ML-LogMessages.failed = true) </Condition>
</FaultRule>משתנים בתהליך
המשתנים הבאים מאוכלסים אם יש כשל במדיניות.
messagelogging.failedmessagelogging.{stepdefinition-name}.failed
נושאים קשורים
- משתנים שנחשפים על ידי Apigee: הפניה למשתני זרימה