Мы следовали приведенной ниже документации, чтобы распечатать пользовательские заголовки запросов в журнале доступа HTTP, но столкнулись с некоторыми проблемами.
**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" "-" -
Пожалуйста помоги
В диспетчере 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 является ли настраиваемый заголовок заголовком ответа или заголовком запроса?
Это заголовок запроса. Требование состоит в том, чтобы отслеживать запросы с использованием пользовательского идентификатора заголовка запроса.
Вы можете добавить последовательность передачи, упомянутую в stackoverflow.com/a/74703690/11414612, в поток запросов.
Привет, я попробовал это посредничество и смог увидеть записи в журнале wso2carbon. Но есть ли способ распечатать эти пользовательские заголовки вместе с кодом состояния в http_gw.log или в самом http_access_.log?
@PradeepKumar Это будет сложно. Один из вариантов: вы можете создать отдельный сервисный логгер (apim.docs.wso2.com/en/latest/integrate/develop/…) и регистрировать все логи в этом конкретном API в любой файл, который вам нравится. Другой вариант — пользовательский обработчик.
Вариант 2 — правильный подход к регистрации трафика API. Если вы выполнили шаги, описанные в [1], для каждого запроса в файле http_gw_<date>.log
будет напечатано четыре строки журналов. Они будут созданы на основе,
Вы не сможете зарегистрировать код ответа в 1-й и 2-й строках журнала, так как в этот момент сервер еще не получил ответа.
Если вам нужно зарегистрировать пользовательский заголовок, полученный от шлюза, вы можете легко добиться этого с помощью посредника, как показано ниже.
<log level = "custom">
<property name = "Header" expression = "get-property('transport','X-Custom-Header')"/>
</log>
Привет, Лакшита, спасибо за ответ. Не могли бы вы сообщить мне, где сделать эти изменения посредника?
Если вы используете APIM 4.1.0, вы можете использовать структуру политик[1]. Если это более старая версия, чем 4.1.0, используйте раздел посредничества в конфигурациях времени выполнения [2]. [1] - apim.docs.wso2.com/en/latest/design/api-policies/create-policy [2] - apim.docs.wso2.com/en/4.0.0/ развернуть и опубликовать/…
@PradeepKumar Это сработало? Вы можете добавить его в поток запросов или ответов в зависимости от ваших требований.
Да, мы внесли те же изменения, но проблема в том, что код ответа не регистрируется. Есть ли лучший способ зарегистрировать заголовок клиента вместе с кодом ответа?