Ответ 1
Если весь файл log4j.properties выглядит так, будто вы на самом деле не создаете регистратор. Вам нужна строка, например:
log4j.rootLogger=debug,A1
Я уже помещал 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>
Если весь файл log4j.properties выглядит так, будто вы на самом деле не создаете регистратор. Вам нужна строка, например:
log4j.rootLogger=debug,A1
У меня был log4j.properties в правильном месте в пути к классам, и я получил это предупреждение со всем, что использовало его напрямую. Код, использующий log4j через commons-logging, казался нормальным по какой-то причине.
Если у вас есть:
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(). К корню не прикреплено приложение по умолчанию.
Это означает, что вам нужно указать какой-либо appender, любой appender, для корневого регистратора, чтобы включить регистрацию.
Добавление этого консольного приложения к rootLogger приводит к исчезновению этой жалобы.
Вы можете получить эту ошибку, если ваш log4j.properties
отсутствует в пути к классам.
Это означает, что вы должны переместить log4j.properties
в папку src и установить вывод в папку bin, чтобы во время выполнения log4j.properties
читалось из папки bin, и ваша ошибка будет легко решена.
Вы увидите это предупреждение, если log4j не сможет найти файл "log4j.properties" или "log4j.xml" где угодно.
Или вы могли бы сделать то, что я сделал, и определить регистратор до того, как файл конфигурации журнала был загружен. Это было бы, как говорится: "Взять телегу перед лошадью".
В коде:
public static Logger logger = Logger.getLogger("RbReport");
... позже
PropertyConfigurator.configure(l4j);
logger = Logger.getLogger("RbReport");
Исправлена ошибка инициализации регистратора после загрузки конфигурации.
Для вундеркиндов это было "Помещение Декарта b4 d лошади".
Если вы хотите настроить для автономных приложений 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);
Если вы по-прежнему помогаете, проверьте имя архива, оно должно быть точным "log4j.properties" или "log4j.xml" (с учетом регистра) и следовать подсказке "Alain O'Dea". Я получал ту же ошибку, но после внесения этих изменений все работает отлично. просто как очарование:-). надеюсь, что это поможет.
В моем случае решение было легко. Вам не нужно объявлять что-либо в своем web.xml
.
Поскольку ваш проект является веб-приложением, после его развертывания файл конфигурации должен находиться на WEB-INF/classes
.
Я советую вам создать папку ресурсов Java (src/main/resources
), чтобы сделать это (лучшая оценка). Другой подход состоит в том, чтобы поместить файл конфигурации в ваш src/main/java
.
Остерегайтесь имени файла конфигурации. Если вы используете XML, имя файла log4j.xml
, иначе log4j.properties
.
Поместите эти строки в начало 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>
См. эту ссылку для более подробной информации: http://mariemjabloun.blogspot.com/2014/04/resolved-log4jwarn-no-appenders-could.html
Хорошо, я вижу много ответов, а некоторые очень правильные. Однако никто не исправил мою проблему. Проблема в моем случае заключалась в том, что разрешения файловой системы UNIX имели файл log4j.properties, который я редактировал на сервере, как принадлежащий root. и читается только root. Тем не менее, веб-приложение, которое я развертывал, было для tomcat, не смог прочитать файл, поскольку tomcat по умолчанию работает как пользователь tomcat в системах Linux. Надеюсь это поможет. поэтому решение набрало "chown tomcat: tomcat log4j.properties" в каталоге, где находится файл log4j.properties.
Добавьте 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>
У меня была та же проблема. Те же настройки конфигурации и одно и то же предупреждение. Что для меня работало: Изменение порядка записей.
Дело в порядке, я думаю.
I had configured <filter> in my web.xml which was creating problem. I commented that, worked for me!
Вы можете добавить эту строку в свой XML файл
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
И убедитесь, что xml файл находится в папке src