log4j: ПОПЕРЕДЖЕННЯ Немає знайдених додатків для реєстратора в web.xml


80

Я вже помістив log4jConfigLocation у web.xml, але все одно отримую таке попередження:

log4j:WARN No appenders could be found for logger ⤦
    ⤥ (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

Що я пропустив?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>suara2</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>suara2</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Відповіді:


43

Якщо це весь файл log4j.properties, схоже, ви ніколи не створюєте реєстратор. Вам потрібен такий рядок, як:

log4j.rootLogger=debug,A1

1
@Kaffiene: здається, це ви не читаєте все питання (у цьому випадку один із коментарів автора до питання надає інформацію, на яку посилається відповідь). @CodeGoat: +1 за читання всіх коментарів.
Франсіско Альварадо

@FranciscoAlvarado У мене є log4j.propertiesфайл у шляху до класу, все ще попереджаю дисплеї в консолі.
UdayKiran Pulipati

29

Я мав log4j.properties у правильному місці в шляху до класу, і все ще отримував це попередження з усім, що використовувало його безпосередньо. Код, що використовує log4j через спільний журнал, чомусь здавався чудовим.

Якщо у вас є:

log4j.rootLogger=WARN

Змініть його на:

log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n

Відповідно до http://logging.apache.org/log4j/1.2/manual.html :

Кореневий реєстратор анонімний, але доступ до нього здійснюється за допомогою методу Logger.getRootLogger (). До кореневого коду немає додатка за замовчуванням.

Це означає, що вам потрібно вказати деякий додаток, будь-який додаток, до кореневого реєстратора, щоб отримати реєстрацію.

Якщо додати цей додаток консолі до rootLogger, ця скарга зникне.


1
Де я можу це вставити.
UdayKiran Pulipati

@udaykiranpulipati, ви можете вставити це в log4j.properties. Якщо у вас немає log4j.properties, створіть його в src / main / resources / якщо використовується SBT / Gradle / Maven / тощо. В іншому випадку помістіть десь, що це опиниться в корені шляху до класу (можливо, у src /).
Ален О'Ді

19

Ви можете отримати цю помилку, коли вас log4j.propertiesнемає в шляху до класу.

Це означає, що вам доведеться перемістити log4j.propertiesпапку src та встановити вихідні дані в папку bin, щоб під час виконання log4j.propertiesчитати з папки bin, і ваша помилка буде легко вирішена.


1
У мене така сама проблема в настільному додатку (аплет). Файл log4j.properties вже знаходиться в папці src. Як мені "встановити вихідні дані в папку bin"?
Dilshad Rana

7

Ви побачите це попередження, якщо log4j ніде не зможе знайти файл "log4j.properties" або "log4j.xml".


2
я підтверджую, що місце розташування правильне. coz, коли я перейменовую log4j.properties на інше ім'я, це видає помилку
комета

7

Або ви можете робити те, що я робив, і визначати реєстратор до завантаження файлу конфігурації журналу. Це було б так, як кажуть: «Поставити віз перед конем».

У коді:

public static Logger logger = Logger.getLogger("RbReport");

... пізніше

PropertyConfigurator.configure(l4j);
logger = Logger.getLogger("RbReport");

Виправлено помилку ініціалізації реєстратора після завантаження конфігурації.

Для вундеркіндів це було "Покласти Декарта b4 d коня".


5

Якщо ви хочете налаштувати окремі програми log4j, ви можете скористатися BasicConfigurator. Це рішення не підійде для веб-додатків, таких як Spring середовище.

Вам потрібно написати-

BasicConfigurator.configure();

або

ServletContext sc = config.getServletContext();
String log4jLocation = config.getInitParameter("log4j-properties-location");
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
PropertyConfigurator.configure(log4jProp);

4

Якщо все-таки допоможе, перевірте назву архіву, воно має бути точно "log4j.properties" або "log4j.xml" (чутливий до регістру), і слідуйте підказці "Ален О'Ді". Я отримував ту ж помилку, але після внесення цих змін все працює нормально. просто як оберіг :-). сподіваюся, це допоможе.


3

У моєму випадку рішення було легким. Вам не потрібно нічого заявляти у своєму web.xml.

Оскільки ваш проект є веб-додатком, файл конфігурації повинен бути включений WEB-INF/classesпісля розгортання. Я раджу вам створити для цього папку ресурсів Java ( src/main/resources) (найкраща практика). Іншим підходом є розміщення конфігураційного файлу у вашому src/main/java.

Обережно з назвою файлу конфігурації. Якщо ви використовуєте XML, ім’я файлу - log4j.xmlінакше log4j.properties.


2

Помістіть ці рядки на початку web.xml:

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:/main/resources/log4j.xml</param-value>
</context-param> 

Вам не потрібно вказувати log4jConfigLocation. Це було б із шляху занять.
Крішна

ви додали файл xml до папки класів?
Крішна

мій log4j знаходиться під src / main / resources / log4j.xml (я використовую spring-інтеграцію, а мій конфігураційний файл знаходиться в src / min / resources / META-INF / spring / Integration /
Spring

папка ресурсів під шлях до класу?
Крішна

1

Добре, я бачу багато відповідей і деякі дуже правильні. Однак ніхто не вирішив моєї проблеми. Проблема в моєму випадку полягала в дозволах файлової системи UNIX, який мав файл log4j.properties, який я редагував на сервері у власності root. і читається лише коренем. Однак веб-програма, яку я розгортав, полягала в тому, що tomcat не міг прочитати файл, оскільки tomcat за замовчуванням працює як користувач tomcat у системах Linux. Сподіваюся, це допомагає. отже, рішенням було ввести 'chown tomcat: tomcat log4j.properties' у директорію, де знаходиться файл log4j.properties.


1

Додайте log4jExposeWebAppRoot -> false у свій web.xml. Це працює зі мною :)

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>path/log4j.properties</param-value>
</context-param>
<context-param>
    <param-name>log4jExposeWebAppRoot</param-name>
    <param-value>false</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

0

У мене була та сама проблема. Ті самі налаштування конфігурації та те саме попереджувальне повідомлення. У мене спрацювало: зміна порядку записів.

  • Я розмістив записи для конфігурації журналу [параметр контексту та прослуховувач] у верхній частині файлу [перед входом для applicationContext.xml], і це спрацювало.

Порядок має значення, я думаю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.