הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.
לעיון במסמכי התיעוד של
Apigee Edge
המדיניות MessageLogging מאפשרת לכם לרשום ביומן הודעות בהתאמה אישית ב-Cloud Logging או ב-syslog. אפשר להשתמש במידע שבלוגים למשימות שונות, כמו איתור בעיות בסביבת זמן הריצה של ה-API.
המדיניות הזו היא מדיניות ניתנת להרחבה, והשימוש בה עשוי להשפיע על העלויות או על ניצול המשאבים, בהתאם לרישיון Apigee שלכם. מידע על סוגי המדיניות וההשלכות של השימוש בהם זמין במאמר סוגי מדיניות.
יש שתי דרכים להשתמש במדיניות MessageLogging:
- הרכיב
<CloudLogging>מתעד הודעות ב-Cloud 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> </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>
</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 over 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
אם אתם משתמשים ב-Apigee hybrid,
חשבון השירות של זמן הריצה שאתם יוצרים עבור Apigee hybrid צריך להתחזות לחשבון השירות של ה-proxy כדי לבצע קריאות מאומתות בשמו. לכן, לחשבון השירות של זמן הריצה של Apigee 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: Log Messages into Loggly
הפניה לשגיאה
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause |
|---|---|---|
steps.messagelogging.StepDefinitionExecutionFailed |
500 |
See fault string. |
steps.messagelogging.InvalidGoogleCloudLogName |
500 |
This error is thrown when the LogName does not evaluate to the valid
format of projects/{project}/logs/{logid}. |
steps.messagelogging.InvalidJsonMessage |
500 |
This error is thrown when the contentType attributes value has been
chosen as application/json but the actual message value is not a valid
JSON string, |
steps.messagelogging.TooManyPendingLoggingRequest |
500 |
This error is thrown when there are more than 2500 pending requests that are yet to be written to Cloud Logging. The 2500 limit is for each Apigee runtime pod. For example, if the traffic is distributed over two instances of Apigee runtime pods, the effective limit is 5000 requests. |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidProtocol |
The deployment of the MessageLogging policy can fail with this error if the protocol
specified within the <Protocol> element is not valid. The valid protocols are TCP and UDP.
For sending syslog messages over TLS/SSL, only TCP is supported. |
build |
InvalidPort |
The deployment of the MessageLogging policy can fail with this error if the port number
is not specified within the <Port> element or if it is not valid. The port number must be
an integer greater than zero. |
build |
Fault variables
These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "StepDefinitionExecutionFailed" |
messagelogging.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | messagelogging.ML-LogMessages.failed = true |
Example error response
{
"fault":{
"detail":{
"errorcode":"steps.messagelogging.StepDefinitionExecutionFailed"
},
"faultstring":"Execution failed"
}
}Example fault rule
<FaultRule name="MessageLogging">
<Step>
<Name>ML-LogMessages</Name>
<Condition>(fault.name Matches "StepDefinitionExecutionFailed") </Condition>
</Step>
<Condition>(messagelogging.ML-LogMessages.failed = true) </Condition>
</FaultRule>משתני Flow
המשתנים הבאים מאוכלסים אם המדיניות נכשלת.
messagelogging.failedmessagelogging.{stepdefinition-name}.failed
נושאים קשורים
- משתנים שנחשפים על ידי Apigee: הפניה למשתני זרימה