Wyświetlasz dokumentację Apigee Edge.
Przejdź do
dokumentacji Apigee X. info
Zasada MessageLogging w Apigee Edge umożliwia deweloperom proxy interfejsu API rejestrowanie niestandardowych wiadomości w syslogu lub na dysku (tylko Edge for Private Cloud). Wszystkie ważne informacje związane z żądaniem interfejsu API, takie jak parametry wejściowe, ładunek żądania, kod odpowiedzi, komunikaty o błędach (jeśli występują) itp., można rejestrować w celu późniejszego odniesienia lub debugowania. Zasada używa procesu działającego w tle do rejestrowania, ale jej stosowanie wiąże się z pewnymi ograniczeniami.
Antywzorzec
Zasada MessageLogging to skuteczny sposób na uzyskanie większej ilości informacji o żądaniu do interfejsu API i debugowanie problemów, które mogą wystąpić podczas jego realizacji. Jednak używanie tej samej zasady MessageLogging więcej niż raz lub stosowanie wielu zasad MessageLogging, które rejestrują dane w blokach w tym samym proxy interfejsu API w przepływach innych niż PostClientFlow, może mieć negatywne konsekwencje. Dzieje się tak, ponieważ Apigee Edge otwiera połączenie z zewnętrznym serwerem syslog na potrzeby zasady MessageLogging. Jeśli zasada używa protokołu TLS przez TCP, występuje dodatkowy narzut związany z nawiązywaniem połączenia TLS.
Wyjaśnijmy to na przykładzie proxy interfejsu API.
Proxy interfejsu API
W poniższym przykładzie zasada MessageLogging o nazwie "LogRequestInfo" jest umieszczona w przepływie żądania, a do przepływu odpowiedzi dodano inną zasadę MessageLogging o nazwie "LogResponseInfo". Obie znajdują się w PreFlow ProxyEndpoint. Zasada LogRequestInfo jest wykonywana w tle, gdy tylko proxy interfejsu API otrzyma żądanie, a zasada LogResponseInfo jest wykonywana po otrzymaniu przez proxy odpowiedzi z serwera docelowego , ale zanim proxy zwróci odpowiedź do klienta interfejsu API. Spowoduje to zużycie dodatkowych zasobów systemowych, ponieważ mogą zostać nawiązane 2 połączenia TLS.
Dodatkowo istnieje zasada MessageLogging o nazwie „LogErrorInfo”, która jest wykonywana tylko gdy podczas wykonywania proxy interfejsu API wystąpi błąd.
<?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>Zasada MessageLogging
W poniższych przykładach konfiguracji zasad dane są rejestrowane na serwerach logów innych firm za pomocą protokołu TLS przez TCP. Jeśli w tym samym proxy interfejsu API używana jest więcej niż 1 z tych zasad, narzut związany z nawiązywaniem połączeń TLS i zarządzaniem nimi będzie zajmować dodatkową pamięć systemową i cykle procesora, co spowoduje problemy z wydajnością na dużą skalę.
Zasada 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>Zasada 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>Zasada 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>Wpływ
- Zwiększony narzut sieciowy spowodowany wielokrotnym nawiązywaniem połączeń z serwerami logów multiple times podczas przepływu proxy interfejsu API.
- Jeśli serwer syslog jest wolny lub nie może obsłużyć dużej liczby wywołań syslog spowoduje to wzrost obciążenia procesora wiadomości, co spowoduje wolne przetwarzanie żądań i potencjalnie duże opóźnienie lub błędy 504 Gateway Timeout.
- Zwiększona liczba współbieżnych deskryptorów plików otwartych przez procesor wiadomości w konfiguracjach Private Cloud, w których używane jest rejestrowanie w plikach.
Jeśli zasada MessageLogging jest umieszczona w przepływach innych niż PostClientFlow, istnieje możliwość, że informacje nie zostaną zarejestrowane, ponieważ zasada MessageLogging nie zostanie wykonana, jeśli przed jej wykonaniem wystąpi jakikolwiek błąd.
W poprzednim przykładzie ProxyEndpoint informacje nie zostaną zarejestrowane w tych okolicznościach:
- Jeśli któraś z zasad umieszczonych przed zasadą LogRequestInfo w
przepływie żądania zakończy się niepowodzeniem.
lub - Jeśli serwer docelowy zakończy się niepowodzeniem z powodu błędu (HTTP 4XX, 5XX). W takiej sytuacji, gdy nie zostanie zwrócona prawidłowa odpowiedź, zasada LogResponseInfo nie zostanie wykonana.
W obu przypadkach zasada LogErrorInfo zostanie wykonana i zarejestruje tylko informacje związane z błędem.
- Jeśli któraś z zasad umieszczonych przed zasadą LogRequestInfo w
przepływie żądania zakończy się niepowodzeniem.
Sprawdzona metoda
- Użyj zasady ExtractVariables lub zasady JavaScript, aby ustawić wszystkie zmienne przepływu , które mają być rejestrowane, i udostępnić je zasadzie MessageLogging.
- Użyj jednej zasady MessageLogging, aby rejestrować wszystkie wymagane dane w PostClientFlow, który jest wykonywany bezwarunkowo.
- Użyj protokołu UDP, w którym nie jest wymagane gwarantowane dostarczanie wiadomości do serwera syslog, a protokół TLS/SSL nie jest obowiązkowy.
Zasada MessageLogging została zaprojektowana tak, aby była niezależna od rzeczywistej funkcjonalności interfejsu API, w tym obsługi błędów. Dlatego wywoływanie jej w PostClientFlow, który znajduje się poza przetwarzaniem żądań i odpowiedzi, oznacza, że zawsze będzie rejestrować dane, niezależnie od tego, czy interfejs API zakończył się niepowodzeniem.
Oto przykład wywoływania zasady MessageLogging w PostClientFlow:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
...
<PostClientFlow>
<Request/>
<Response>
<Step>
<Name>LogInfo</Name>
</Step>
</Response>
</PostClientFlow>
...Oto przykład zasady MessageLogging, LogInfo, która rejestruje wszystkie dane:
<?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>Ponieważ zmienne
odpowiedzi nie są dostępne w PostClientFlow po przepływie błędów, ważne jest
aby jawnie ustawić woeid i weather.response* zmienne za pomocą
zasad ExtractVariables lub JavaScript.
Więcej informacji
- Zasada JavaScript
- Zasada ExtractVariables
- Wykonywanie kodu po przetworzeniu proxy, w tym w przypadku wystąpienia błędów, za pomocą PostClientFlow