INFO [STDOUT]
обычно приходит из log4j и прослушивает System.out.У нас был похожий случай, когда само приложение имело свою собственную конфигурацию log4j и, таким образом, получило своего собственного корневого приложения.Это приведет к входу в консоль, которую прослушивает JBoss log4j.Это, в свою очередь, добавляет INFO [STDOUT]
, как если бы вы писали непосредственно в System.out
(или ERROR [STDERR]
при записи в System.err
).
Решение в нашем случае состояло в том, чтобы удалить специфическую для приложения конфигурацию log4j и просто использовать ту, в которую пишет JBoss.
Другим способом может быть прямая запись в файл журнала приложения, а не запись в консоль.В серверной среде вы, скорее всего, в любом случае будете ссылаться на файлы журналов.
Что касается второй части, то есть автоматического расширения журналов с ответом, запросом и т. Д. Данными:
В одном случае мы имелисуперкласс для сессионных компонентов без сохранения состояния, который обеспечивал функциональность регистрации и имел (перезаписываемый) журнал для каждого экземпляра.Базовые методы, такие как info
, будут вызывать регистратор и автоматически добавлять необходимые данные.
Второй подход может быть MCD
, т.е. вы помещаете некоторые данные (например, запрос) в локальный поток MDC (в основном это карта), а затем получите к ним доступ в своем определении шаблона.
Например, у нас есть несколько похожих приложений, каждое из которых имеет несколько классов, которые есть и у других.Таким образом, нам понадобится приложение, из которого пришло сообщение, и, следовательно, добавление имени приложения в MDC:
В коде:
MDC.put("app.name", "myapplication");
В конфигурации шаблона log4j:
<param name="ConversionPattern" value="%d %-5p [%c (%X{app.name})] %m%n"/>
(обратите внимание на % X {app.name} )
Я не проверял, можно ли сделать что-то вроде ввода запроса в MDC и затем использовать: %X{request.getAttribute('xyz')}
, но если он просто получает значение в MDC и вызывает toString()
, вы можете создать оболочку запроса следующим образом:
class RequestLogWrapper {
private HttpServletRequest request; //initialize through constructor etc.
public String toString() {
return request.getAttribute("xyz") + ";" + request.getAttribute("abc") + ... //handle null etc. as well
}
}
Затем вызовите MDC.put("request", new RequestLogWrapper(request));
и в конфигурации используйте %X{request}
.