Настройте журнал HTTP-доступа в WSO2 API Manager 3.2.0 для настраиваемых заголовков запросов

Мы следовали приведенной ниже документации, чтобы распечатать пользовательские заголовки запросов в журнале доступа HTTP, но столкнулись с некоторыми проблемами.

URL: https://apim.docs.wso2.com/en/3.2.0/administer/logging-and-monitoring/logging/monitoring-http-access-logs/


**Option 1**: We added below entries in /repository/conf/deployment.toml file
[http_access_log]
useLogger = true
pattern = "%{X-Forwarded-For}i %h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %{X-Custom-Header}i %T"

The changes are reflecting in HOME\repository\conf\tomcat\catlina-server.xml but the custom headers are not getting printed.

**Option 2**: Created a separate log file as mentioned in "Configuring access logs for PassThrough or NIO transports in API Gateway" section. With this we are able to print the custom headers but the response code is not getting printed. It is appearing as "-". 


Log format: access_log_pattern=%{X-Forwarded-For}i %h %l %u %t %r %s \"%{Referer}i\" \"%{User-Agent}i\" %{X-Custom-Header}i %B
Example log entry: - 10.73.122.48 - - [06/Dec/2022:14:49:36.628 +0530] "GET /mcm-stubs/testservice HTTP/1.1" **-** "-" "Synapse-PT-HttpComponents-NIO" "-" -

Пожалуйста помоги

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В диспетчере API есть два набора журналов доступа. Один для компонентов сервлета (хранение/издатель и т. д., доступ к которым осуществляется через порты 9443 и 9763), а второй для сквозного транспорта (доступ через 8280 и 8243). Журналы доступа Sevlet обрабатываются значением Tomcat, и эти конфигурации можно изменить, изменив deployment.toml, что отразится в catlina-server.xml. Эти журналы будут записываться в отдельный файл.

Сквозной транспорт — это место, где вы будете получать фактический трафик API и для изменения формата. Сначала добавьте конфиги логгера в <APIM_HOME>/repository/conf/log4j2.properties.

# Add the new logger to this line
loggers = PassThroughAccess, AUDIT_LOG, SERVICE_LOGGER, trace-messages,..........

# Define the new logger
logger.PassThroughAccess.name = org.apache.synapse.transport.http.access
logger.PassThroughAccess.level = INFO

Затем создайте новый файл с именем access-log.properties в каталоге <APIM_HOME>/repository/conf со следующим содержимым.

# Default access log pattern examples
#access_log_pattern=%{X-Forwarded-For}i %h %l %u %t \”%r\” %s %b \”%{Referer}i\” \”%{User-Agent}i\”
#access_log_pattern=time=%t remoteHostname=%h localPort=%p localIP=%A requestMethod=%m requestURL=%U remoteIP=%a requestProtocol=%H HTTPStatusCode=%s queryString=%q

# combinded log pattern
access_log_pattern=%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Custom-Header}i\"

# file prefix
access_log_prefix=http_gw
# file suffix
access_log_suffix=.log
# file date format
access_log_file_date_format=yyyy-MM-dd

Теперь перезапустите сервер, и когда вы получите доступ к API, журналы доступа будут записываться в новый файл с именем, которое вы указали в приведенной выше конфигурации. С указанными выше конфигурациями логи будут записываться в <APIM_HOME>/repository/logs/http_gw.log

Если это заголовок ответа. Вам нужно использовать следующий шаблон, чтобы получить заголовок.

# To get a custom response Header
%{X-Custom-Header}o

# TO Get response code
%s

# A complete pattern
access_log_pattern=%h %l %u %t \"%r\" %s %b \"%{User-Agent}i\" customHeader=%{X-Custom-Header}o responseCode=%s

Обновлять

Вы не можете регистрировать заголовки запроса в пути ответа. Они будут регистрироваться в двух отдельных строках, поэтому их трудно сопоставить. Один из вариантов — передать пользовательский заголовок серверной части и попросить серверную часть вернуть заголовок с ответом. Тогда вы увидите один и тот же заголовок как в журналах запросов, так и в журналах ответов.

Как упомянул Лакшита, другой вариант — вручную зарегистрировать заголовок и ответ. Для этого сначала вам нужно извлечь настраиваемый заголовок запроса в пути запроса, а затем зарегистрировать его в пути ответа. Есть два способа сделать это, один из них — создать собственный обработчик.

Другой вариант — использовать настраиваемые политики посредничества. Для этого можно использовать следующие две последовательности. (Создайте следующие два файла и загрузите их как пользовательские политики)

Запрос: ExtractHeader.xml

<sequence xmlns = "http://ws.apache.org/ns/synapse" name = "extractHeader">
    <property name = "CUSTOM_HEADER" expression = "$trp:X-Custom-Header" scope = "default" />
</sequence>

Ответ: log_response_code.xml

<sequence xmlns = "http://ws.apache.org/ns/synapse" name = "log_in_response_code">
    <log level = "custom">
        <property name = "Header" expression = "$ctx:CUSTOM_HEADER"/>
        <property name = "StatusCode" expression = "$axis2:HTTP_SC"/>
    </log>
</sequence>

После применения это будет выглядеть так.

Да, мы внесли те же изменения, но проблема в том, что код ответа не регистрируется. Есть ли лучший способ зарегистрировать заголовок клиента вместе с кодом ответа?

PradeepKumar 08.12.2022 10:40

@PradeepKumar является ли настраиваемый заголовок заголовком ответа или заголовком запроса?

ycr 08.12.2022 13:37

Это заголовок запроса. Требование состоит в том, чтобы отслеживать запросы с использованием пользовательского идентификатора заголовка запроса.

PradeepKumar 09.12.2022 05:26

Вы можете добавить последовательность передачи, упомянутую в stackoverflow.com/a/74703690/11414612, в поток запросов.

Lakshitha 09.12.2022 08:59

Привет, я попробовал это посредничество и смог увидеть записи в журнале wso2carbon. Но есть ли способ распечатать эти пользовательские заголовки вместе с кодом состояния в http_gw.log или в самом http_access_.log?

PradeepKumar 14.12.2022 07:34

@PradeepKumar Это будет сложно. Один из вариантов: вы можете создать отдельный сервисный логгер (apim.docs.wso2.com/en/latest/integrate/develop/…) и регистрировать все логи в этом конкретном API в любой файл, который вам нравится. Другой вариант — пользовательский обработчик.

ycr 14.12.2022 13:41

Вариант 2 — правильный подход к регистрации трафика API. Если вы выполнили шаги, описанные в [1], для каждого запроса в файле http_gw_<date>.log будет напечатано четыре строки журналов. Они будут созданы на основе,

  1. Запрос получен шлюзом
  2. Запрос передан на сервер
  3. Ответ получен от серверной части
  4. Ответ от шлюза

Вы не сможете зарегистрировать код ответа в 1-й и 2-й строках журнала, так как в этот момент сервер еще не получил ответа.

Если вам нужно зарегистрировать пользовательский заголовок, полученный от шлюза, вы можете легко добиться этого с помощью посредника, как показано ниже.

<log level = "custom">
     <property name = "Header" expression = "get-property('transport','X-Custom-Header')"/>
</log> 

[1]- https://apim.docs.wso2.com/en/3.2.0/administer/logging-and-monitoring/logging/monitoring-http-access-logs/#configuring-access-logs-for -passthrough-or-nio-transports-in-api-gateway

Привет, Лакшита, спасибо за ответ. Не могли бы вы сообщить мне, где сделать эти изменения посредника?

PradeepKumar 08.12.2022 10:38

Если вы используете APIM 4.1.0, вы можете использовать структуру политик[1]. Если это более старая версия, чем 4.1.0, используйте раздел посредничества в конфигурациях времени выполнения [2]. [1] - apim.docs.wso2.com/en/latest/design/api-policies/create-poli‌​cy [2] - apim.docs.wso2.com/en/4.0.0/ развернуть и опубликовать/…

Lakshitha 08.12.2022 11:03

@PradeepKumar Это сработало? Вы можете добавить его в поток запросов или ответов в зависимости от ваших требований.

Lakshitha 09.12.2022 08:58

Другие вопросы по теме