Ostatnio postanowiłem nauczyć się obsługi rejestratora log4j2. Pobrałem wymagane pliki jar, utworzyłem bibliotekę, plik konfiguracyjny xml i próbowałem go użyć. Niestety otrzymałem to oświadczenie w konsoli (Eclipse):
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Oto kod mojej klasy testowej:
package log4j.test;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jTest
{
static final Logger logger = LogManager.getLogger(Logger.class.getName());
public static void main(String[] args) {
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
logger.fatal("fatal");
}
}
I mój plik konfiguracyjny xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test"
status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="log4j.test.Log4jTest" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Próbowałem także z xml bez <Logger>
tagów i specyfikacji pakietu oraz w różnych katalogach / pakietach, ale to nie pomogło. Teraz mój log4j2.xml
plik znajduje się bezpośrednio w folderze projektu w eclipse.
Odpowiedzi:
Czy to prosty projekt java zaćmienia bez maven itp.? W takim przypadku będziesz musiał umieścić
log4j2.xml
plik wsrc
folderze, aby móc go znaleźć w ścieżce klas. Jeśli używasz maven, umieść go podsrc/main/resources
lubsrc/test/resources
źródło
sbt
teżlog4j2.xml
wchodzi wsrc/main/resources
.Musisz wybrać jedno z następujących rozwiązań:
źródło
-Dlog4j.configurationFile
jest tym, czego potrzebowałem, ponieważ projekt, nad którym pracuję, nie jest oparty na Mavenie. NiesamowiteKorzystałem z dokumentacji - Apache Log4j2 Configuratoin i Apache Log4j2 Maven w konfiguracji log4j2 z yaml. Zgodnie z dokumentacją wymagane są następujące zależności maven:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.1</version> </dependency>
i
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.8.6</version> </dependency>
Samo dodanie ich nie wybrało konfiguracji i zawsze powodowało błąd. Sposób debugowania konfiguracji poprzez dodanie
-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE
pomógł w obejrzeniu logów. Później trzeba było pobrać źródło za pomocą Mavena, a debugowanie pomogło w zrozumieniu klas zależnych log4j2. Są one wymienione worg.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory
:Dodanie mapowania zależności dla
jackson-dataformat-yaml
nie będzie miało pierwszych dwóch klas. Dlatego dodajjackson-databind
zależność, aby uruchomić konfigurację yaml:<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.6</version> </dependency>
Możesz dodać wersję, odwołując się do
Test Dependencies
sekcjilog4j-api
elementu wersji z repozytorium MVN . Np. W przypadku wersji 2.8.1 log4j-api, przejdź do tego linku i znajdźjackson-databind
wersję.Ponadto możesz użyć poniższego kodu Java, aby sprawdzić, czy klasy są dostępne w ścieżce klas:
System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper", "com.fasterxml.jackson.databind.JsonNode", "com.fasterxml.jackson.core.JsonParser", "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"}; for(String className : classes) { cl.loadClass(className); }
źródło
Oprócz tego, co napisał Tomasz W, uruchamiając swoją aplikację można było skorzystać z ustawień:
aby uzyskać większość problemów z konfiguracją.
Aby uzyskać szczegółowe informacje, zobacz Często zadawane pytania dotyczące Log4j2: Jak debugować konfigurację?
źródło
Eclipse nigdy nie zobaczy pliku, dopóki nie wymusisz odświeżenia IDE. To cecha! Możesz więc umieścić plik w całym projekcie, a Eclipse zignoruje go całkowicie i wyrzuci te błędy. Naciśnij przycisk odświeżania w widoku projektu Eclipse, a potem działa.
źródło
W moim przypadku musiałem umieścić go w folderze bin mojego projektu, nawet jeśli moja ścieżka klas jest ustawiona na folder src. Nie mam pojęcia dlaczego, ale warto spróbować.
źródło