Я переношу старое веб-приложение (войну), написанное на Primefaces 8 с использованием зависимостей Apache и Weld, на Jakarta EE 10 и Primefaces 13.0.4 с использованием WildFly 31.0.1.Final.
Пока все прошло успешно, все bean-компоненты были изменены для использования новых аннотаций, и потребовались небольшие изменения интерфейса. Но я вижу, что в журналах беспорядок.
Я успешно настроил Log4j2 в своем веб-приложении (файл .war). Все журналы приложений записываются в определенный файл как старое приложение, но в автономных журналах WildFly и в консоли Eclipse я вижу, что мои журналы Log4j2 записываются «внутри» журналов WildFly.
Поскольку я хочу использовать только один менеджер журналов (не один для приложения, а другой для сервера приложений), у меня есть 3 вопроса:
Это пример «журнала внутри журнала», о котором я упоминал:
15:39:34,029 INFO [org.primefaces.webapp.PostConstructApplicationEventListener] (ServerService Thread Pool -- 96) Running on PrimeFaces 13.0.4
15:39:34,344 INFO [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 96) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class br.com.powerdba.r2.JakartaRestConfiguration$Proxy$_$$_WeldClientProxy
15:39:34,373 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 96) WFLYUT0021: Registered web context: '/r2' for server 'default-server'
15:39:34,416 INFO [org.jboss.as.server] (ServerService Thread Pool -- 45) WFLYSRV0010: Deployed "r2-1.0.0.war" (runtime-name : "r2-1.0.0.war")
15:39:34,457 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server
15:39:34,461 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
15:39:34,461 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
15:39:34,464 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 31.0.1.Final (WildFly Core 23.0.3.Final) started in 7537ms - Started 463 of 683 services (322 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml
15:39:35,498 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.497 [default task-1] ValidateLoginFilter - uri = /r2/
15:39:35,500 INFO [stdout] (default task-1) [WARN ] 2024-04-18 15:39:35.500 [default task-1] ValidateLoginFilter - Page needs authenticated users and user is not logged in. Calling Login page.
15:39:35,506 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - uri = /r2/login.xhtml
15:39:35,506 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - Calling doFilter for login page
15:39:35,753 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.753 [default task-1] LoginBean - ---/nLoginBean/n---
[INFO ] 2024-04-18 15:39:35.497 [default task-1] ValidateLoginFilter - uri = /r2/
[WARN ] 2024-04-18 15:39:35.500 [default task-1] ValidateLoginFilter - Page needs authenticated users and user is not logged in. Calling Login page.
[INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - uri = /r2/login.xhtml
[INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - Calling doFilter for
[INFO ] 2024-04-18 15:39:35.753 [default task-1] LoginBean - ---/nLoginBean/n---
Я уже использую консольное приложение в конфигурации log4j2. Дело в том, что я хочу перенаправить все журналы сервера приложений в одни и те же приложения log4j2.
- Можно ли перенаправить все журналы сервера приложений WildFly в журналы, настроенные моим приложением Log4j2, минуя или игнорируя менеджер журналов WildFly по умолчанию? Возможно ли это с помощью кода Java или с помощью дополнительного файла XML/свойств?
Нет, вы не можете перенаправить сообщения журнала с сервера в свою собственную конфигурацию журналирования. Сообщения журнала из модулей за пределами вашего развертывания всегда будут использовать конфигурацию журнала, определенную в подсистеме журналирования.
- Если 1 выше невозможно, как я могу использовать журналы сервера приложений WildFly по умолчанию? Я пытался использовать классы java.util.logging, но они ничего не пишут ни в консоли, ни в отдельных файлах журналов.
Вы можете продолжать использовать log4j-api для своих средств ведения журнала внутри своего приложения. Вам просто нужно удалить библиотеку из вашего развертывания, а также удалить библиотеку log4j-core. Затем вы можете настроить подсистему ведения журнала или использовать профиль ведения журнала или конфигурацию ведения журнала (logging.properties) в вашем развертывании.
- Просто ради моего здравомыслия: как лучше всего регистрировать сообщения приложений при использовании WildFly?
Это действительно зависит. Реально можно использовать любой фасад рубки; log4j-api (log4j2), slf4j, jboss-logging, commons-logging или JUL. С точки зрения приложения все, что вам нужно сделать, это регистрировать сообщения. Конфигурация будет происходить в контейнере.
Для «внутреннего» сообщения журнала, например. [stdout]
вы видите. WildFly оборачивает System.out
и System.err
в логгеры JUL. Это сделано для случаев, когда у вас нет доступа к консоли, но вы не хотите пропустить какой-нибудь лог из какой-то случайной библиотеки, которая использовала System.out
вместо настоящего логгера. Причина, по которой вы это видите, заключается в том, что у вас есть ConsoleAppender
, определенный в вашей конфигурации ведения журнала в вашем развертывании.
Вы также можете продолжить, просто используя log4j-core и свою собственную конфигурацию ведения журнала в своем развертывании. Единственное, чего вы не получите — это логирования с серверных модулей. В большинстве случаев это не имеет большого значения, но я вижу, где желательно иметь журналы, скажем, из спящего режима. Подробности смотрите в документации.
Привет, Джеймс, спасибо за исчерпывающий ответ. Может быть, вы могли бы дать более подробную информацию о том, как использовать регистратор сервера по умолчанию? Например: я удалил все зависимости log4j2 и slf4j и создаю пакет java.util.logging, как в private static final Logger logger = Logger.getLogger(ValidateLoginFilter.class.toString());
, но это приводит к тому, что при моих вызовах вообще не записывается журнал.
Неважно. Я только что повторно развернул новую установку WildFly, и все заработало. Большое спасибо!
stdout в журнале WildFly означает, что вы также отправляете эти сообщения журнала в System.out. Может ли это быть определено в вашей конфигурации log4j2?