Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Политика MessageLogging в Apigee Edge позволяет разработчикам API-прокси записывать пользовательские сообщения в syslog или на диск (только в Edge для частного облака). Любая важная информация, связанная с запросом API, такая как входные параметры, полезная нагрузка запроса, код ответа, сообщения об ошибках (если таковые имеются) и т. д., может быть записана для последующего использования или отладки. Хотя политика использует фоновый процесс для выполнения логирования, существуют ограничения на ее использование.
Антипаттерн
Политика MessageLogging предоставляет эффективный способ получения дополнительной информации о запросе API и отладки любых проблем, возникающих при выполнении запроса API. Однако использование одной и той же политики MessageLogging несколько раз или использование нескольких политик MessageLogging для записи данных порциями в одном и том же API-прокси в потоках, отличных от PostClientFlow, может иметь негативные последствия. Это связано с тем, что Apigee Edge открывает соединение с внешним сервером syslog для политики MessageLogging. Если политика использует TLS поверх TCP, возникает дополнительная нагрузка на установление TLS-соединения.
Давайте объясним это на примере API-прокси.
API-прокси
В следующем примере политика логирования сообщений с именем "LogRequestInfo" помещена в поток запроса, а другая политика логирования сообщений с именем "LogResponseInfo" добавлена в поток ответа. Обе находятся в предварительном потоке ProxyEndpoint. Политика LogRequestInfo выполняется в фоновом режиме, как только API-прокси получает запрос, а политика LogResponseInfo выполняется после того, как прокси получит ответ от целевого сервера, но до того, как прокси вернет ответ API-клиенту. Это приведет к потреблению дополнительных системных ресурсов, поскольку потенциально устанавливаются два TLS-соединения.
Кроме того, существует политика логирования сообщений под названием "LogErrorInfo", которая выполняется только в случае ошибки во время выполнения API-прокси.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
...
<FaultRules>
<FaultRule name="fault-logging">
<Step>
<Name>LogErrorInfo</Name>
</Step>
</FaultRule>
</FaultRules>
<PreFlow name="PreFlow">
<Request>
<Step>
<Name>LogRequestInfo</Name>
</Step>
</Request>
</PreFlow>
<PreFlow name="PreFlow">
<Response>
<Step>
<Name>LogResponseInfo</Name>
</Step>
</Response>
</PreFlow>
...
</ProxyEndpoint>Политика ведения журнала сообщений
В приведенных ниже примерах конфигураций политик данные записываются на сторонние серверы журналов с использованием TLS поверх TCP. Если в одном и том же API-прокси используется более одной такой политики, накладные расходы на установление и управление TLS-соединениями будут занимать дополнительную системную память и циклы ЦП, что приведет к проблемам с производительностью в масштабе.
Политика LogRequestInfo
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogRequestInfo">
<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>INFO</logLevel>
</MessageLogging>Политика LogResponseInfo
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogResponseInfo">
<Syslog>
<Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Status: {response.status.code}, Response {response.content}.</Message>
<Host>logs-01.loggly.com</Host>
<Port>6514</Port>
<Protocol>TCP</Protocol>
<FormatMessage>true</FormatMessage>
<SSLInfo>
<Enabled>true</Enabled>
</SSLInfo>
</Syslog>
<logLevel>INFO</logLevel>
</MessageLogging>Политика LogErrorInfo
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogErrorInfo">
<Syslog>
<Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Fault name: {fault.name}.</Message>
<Host>logs-01.loggly.com</Host>
<Port>6514</Port>
<Protocol>TCP</Protocol>
<FormatMessage>true</FormatMessage>
<SSLInfo>
<Enabled>true</Enabled>
</SSLInfo>
</Syslog>
<logLevel>ERROR</logLevel>
</MessageLogging>Влияние
- Увеличение накладных расходов на сеть из-за многократного установления соединений с серверами журналов в процессе работы API-прокси.
- Если сервер syslog работает медленно или не справляется с большим объемом запросов syslog, это создаст дополнительную нагрузку на обработчик сообщений, что приведет к замедлению обработки запросов и потенциально к высокой задержке или ошибкам 504 Gateway Timeout.
- В конфигурациях частного облака, где используется логирование файлов, увеличилось количество одновременно открываемых обработчиком сообщений файловых дескрипторов.
Если политика MessageLogging размещена в потоках, отличных от потока PostClient, существует вероятность того, что информация может не быть записана в журнал, поскольку политика MessageLogging не будет выполнена, если до ее выполнения произойдет какой-либо сбой.
В предыдущем примере с ProxyEndpoint информация не будет записываться в журнал при следующих обстоятельствах:
- Если какая-либо из политик, расположенных перед политикой LogRequestInfo в потоке запросов, завершится неудачей.
или - Если целевой сервер выдает ошибку (HTTP 4XX, 5XX), то в этом случае, если не получен успешный ответ, политика LogResponseInfo не будет выполнена.
В обоих случаях будет выполнена политика LogErrorInfo, которая будет записывать в журнал только информацию, относящуюся к ошибке.
- Если какая-либо из политик, расположенных перед политикой LogRequestInfo в потоке запросов, завершится неудачей.
Передовая практика
- Используйте политику ExtractVariables или политику JavaScript , чтобы задать все переменные потока, которые должны быть зарегистрированы, сделав их доступными для политики MessageLogging.
- Используйте единую политику MessageLogging для записи всех необходимых данных в PostClientFlow, который выполняется безусловно.
- Используйте протокол UDP, в рамках которого не требуется гарантированная доставка сообщений на сервер syslog, а использование TLS/SSL не является обязательным.
Политика MessageLogging разработана таким образом, чтобы быть независимой от фактической функциональности API, включая обработку ошибок. Поэтому её вызов в PostClientFlow, который находится вне обработки запросов/ответов, означает, что данные будут всегда записываться в лог независимо от того, завершился ли API с ошибкой или нет.
Вот пример вызова политики MessageLogging в PostClientFlow:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
...
<PostClientFlow>
<Request/>
<Response>
<Step>
<Name>LogInfo</Name>
</Step>
</Response>
</PostClientFlow>
...Вот пример политики MessageLogging под названием LogInfo, которая записывает все данные в журнал:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogInfo">
<Syslog>
<Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {woeid} Status: {weather.response.code}, Response {weather.response}, Fault: {fault.name:None}.</Message>
<Host>logs-01.loggly.com</Host>
<Port>6514</Port>
<Protocol>TCP</Protocol>
<FormatMessage>true</FormatMessage>
<SSLInfo>
<Enabled>true</Enabled>
</SSLInfo>
</Syslog>
<logLevel>INFO</logLevel>
</MessageLogging> Поскольку переменные ответа недоступны в PostClientFlow после обработки ошибки, важно явно установить переменные woeid и weather.response* с помощью ExtractVariables или политик JavaScript.
Дополнительная информация
- политика JavaScript
- политика ExtractVariables
- Запуск кода после обработки прокси-сервера, в том числе при возникновении ошибок, с помощью PostClientFlow.