Вопрос или проблема
У меня проблема с моим сервером WildFly. Я пытаюсь выводить логи, но они не отображаются, какие бы изменения в настройках логов WildFly я ни вносил. Вот код с начальным классом, который запускается, но ни одного лога, которые я пытаюсь напечатать, не отображается:
package com.company.web.action;
import org.apache.struts2.action.ServletRequestAware;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import com.company.client.AAAClient;
import com.company.model.Operator;
public class LoginAction implements ServletRequestAware{
private String userName;
private String password;
private String flag;
private HttpServletRequest request;
private static final Logger log = Logger.getLogger(LoginAction.class.getName());
// Геттеры и сеттеры для свойств формы
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
// Инъекция HttpServletRequest
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
// Метод действия Struts 2
public String login() {
log.info("Имя пользователя: " + userName + ", Пароль: " + password);
log.info("инициация входа");
AAAClient aaa = new AAAClient();
boolean result = aaa.auth(userName, password);
if (result) {
// Аутентификация успешна
log.info("Пользователь вошел в систему. id -> " + userName);
Operator op = aaa.getOperator(userName);
HttpSession session = request.getSession();
session.setAttribute("AAAFlag", op);
session.setAttribute("CurrentUser", op);
if ("pos".equals(flag)) {
return "pos_success";
}
return "success";
} else {
// Аутентификация не удалась
log.info("Вход пользователя не удался. id -> " + userName);
return "failure";
}
}
public String logout() {
// Аннулирование сессии
if (request != null) {
request.getSession().invalidate();
}
return "logout";
}
@Override
public void withServletRequest(HttpServletRequest arg0) {
this.request = arg0;
}
}
Вот часть моего кода Struts, обрабатывающего вход:
<action name="login" class="com.company.web.action.LoginAction" method="login">
<result name="input">/login.jsp</result>
<result name="failure">/login.jsp</result>
<result name="success">/Statistics.do?reqCode=dashboard</result>
<result name="pos_success">/POS.do?reqCode=display</result>
</action>
И, что самое важное, часть моего standalone.xml, где я установил все логи на DEBUG, но по-прежнему не вижу строки, которые я хотел бы журналировать:
<subsystem xmlns="urn:jboss:domain:logging:8.0">
<console-handler name="CONSOLE">
<level name="DEBUG"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
<target name="System.out"/>
</console-handler>
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="stdout">
<level name="DEBUG"/>
<handlers>
<handler name="CONSOLE"/>
</handlers>
</logger>
<logger category="com.company">
<level name="DEBUG"/>
</logger>
<root-logger>
<level name="DEBUG"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<formatter name="PATTERN">
<pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
<formatter name="COLOR-PATTERN">
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
</subsystem>
Единственное, что я получаю из отладки, это моя попытка авторизации:
### НАЧАЛО генерации /janasi-web-service/login.do ############################
# Параметры : password(TestPassword), reqCode(login), userName(TestName),
# Атрибуты сессии :
#################################################################
Я пытался использовать slf4j и jboss logger, но результат идентичен. Также пытался использовать System.out.print вместо логов, но ничего не отображалось, даже несмотря на то, что у меня есть логгер с категорией stdout. Пожалуйста, помогите мне, я долго пытался, но теперь я застрял
Ответ или решение
Конечно, столкнувшись с проблемой отсутствия вывода логов в консоли WildFly, важно проанализировать различные аспекты конфигурации и настройки приложения. Рассмотрим возможные причины и решения этой проблемы, основываясь на предоставленной информации.
Теория
WildFly использует модульную архитектуру для управления логированием, в основе которого лежит JBoss Logging. Система логирования обычно настроена через файл standalone.xml
, где можно указать нужный уровень логирования и обработчики (handlers), которые будут обрабатывать и отображать логи.
Есть несколько причин, по которым логи не выводятся в консоль:
-
Некорректная конфигурация логирования: Модули и обработчики должны быть правильно настроены. Отсутствие связи между логгером и обработчиком может стать причиной отсуствия логов в консоли.
-
Ошибки в коде приложения: Код может не достигать точек логирования из-за ошибок в логике приложения или условий.
-
Ошибки в конфигурации среды: Иногда конфигурации среды, такие как переменные окружения, могут препятствовать нормальной работе логирования.
Пример
Давайте подробнее рассмотрим ваш файл standalone.xml
. В нем заданы разные уровни логирования и обработчики, такие как CONSOLE
и FILE
. Особое внимание стоит обратить на категорию логгера и задействованные обработчики:
<logger category="com.company">
<level name="DEBUG"/>
</logger>
В данном случае, вы настраиваете уровень DEBUG
для категории com.company
, но недостаточно просто установить уровень логирования. Нужно обеспечить, чтобы данный логгер использовал обработчики, которые выводят информацию в консоль или файл.
Применение
Для решения проблемы, предлагаю следующий план действий:
-
Проверьте настройки обработчиков: Убедитесь, что ваш логгер для
com.company
подключен кCONSOLE
-обработчику. В текущей конфигурации нет явного указания на обработчик для этой категории. Добавьте явное задание обработчика в секции<logger>
:<logger category="com.company"> <level name="DEBUG"/> <handlers> <handler name="CONSOLE"/> </handlers> </logger>
-
Убедитесь в правильности конфигурации корневого логгера: Корневой логгер уже настроен для использования
CONSOLE
иFILE
. Этим вы удостоверяетесь, что все логи через root-логгер должны отображаться в консоли. Также проверьте, что в разделе<formatter>
логического вывода добавлено:<formatter name="COLOR-PATTERN"> <pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/> </formatter>
-
Проверьте исходный код: В вашей Java программе все классы и методы, которые осуществляют логирование, должны использовать правильный логгер с уровнем
DEBUG
. Проверьте, достигается ли методlogin()
в вашем коде:log.info("login init");
Если вызов метода не регистрируется, возможно, что до кода просто не доходит выполнение. Убедитесь, что условия или выполненные методы не останавливают выполнение кода до строки с логированием.
-
Используйте отладочные сообщения: Вместо
log.info
, временно измените наlog.fine
и убедитесь, что в конфигурации логгера учитываются более низкие уровни логирования такие какFINE
. -
Задействуйте System.out.printf: Хотя, как вы упомянули "System.out.print" не помог, повторю проверку этого способа. Возможно, настройте System.out или отлов исключений на стороне сервера, чтобы удостовериться в прохождении выполнения до ожидаемых точек.
-
Перезагрузите сервер: После внесения изменений в конфигурацию, убедитесь, что сервер был перезапущен для применения изменений.
Заключение
Такая комплексная проверка поможет вам исчерпать все вероятные причины. Всегда полезно проверять журналы ошибок WildFly на предмет ассоциации с проблемой логирования. Помните, что отладка проблемы может быть многоуровневым процессом, в котором стоит действовать методично для выявления и исправления всех ошибок конфигурации и кода.