Ik heb log4j in mijn buildpath gezet, maar ik krijg het volgende bericht wanneer ik mijn applicatie start:
log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Wat betekenen deze waarschuwingen? Wat is de bijlage hier?
Antwoord 1, autoriteit 100%
Deze Korte introductie tot log4j-gids is een beetje oud, maar nog steeds geldig .
Die gids geeft je wat informatie over het gebruik van loggers en appenders.
Om u op weg te helpen zijn er twee eenvoudige benaderingen die u kunt volgen.
De eerste is om deze regel toe te voegen aan je hoofdmethode:
BasicConfigurator.configure();
De tweede benadering is om dit standaard log4j.properties
-bestand (overgenomen uit de bovengenoemde handleiding) toe te voegen aan je classpath:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Antwoord 2, autoriteit 15%
Het lijkt erop dat u de locatie van uw log4j.properties
-bestand moet toevoegen aan het klassenpad in Eclipse.
Zorg ervoor dat uw project is geopend in Eclipse, klik vervolgens op het menu “Uitvoeren” bovenaan Eclipse en klik op het volgende:
- Rennen
- Configuraties uitvoeren
- Klaspad (tabblad)
- Gebruikersinvoer
- Geavanceerd (knop aan de rechterkant)
- Mappen toevoegen
- navigeer vervolgens naar de map die uw log4j.properties-bestand bevat
- Toepassen
- Rennen
De foutmelding zou niet meer moeten verschijnen.
Antwoord 3, autoriteit 10%
Snelle oplossing:
-
code toevoegen aan hoofdfunctie:
String log4jConfPath = "/path/to/log4j.properties"; PropertyConfigurator.configure(log4jConfPath);
-
maak een bestand met de naam log4j.properties op /path/to
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
Antwoord 4, autoriteit 7%
Dit is slechts een waarschuwing.
Reparatie
Dit gebeurt wanneer de standaardconfiguratiebestanden log4j.properties
en log4j.xml
niet kunnen worden gevonden en de toepassing geen expliciete configuratie uitvoert.
Om dat op te lossen, maakt/kopieer je eenvoudig log4j.properties
of log4j.xml
naar een locatie op het classpath (meestal hetzelfde als de jar-bestanden).
Optioneel java-optie instellen: -Dlog4j.configuration=file:///path/to/log4j.properties
.
log4J
gebruiktThread.getContextClassLoader().getResource()
om de standaardconfiguratiebestanden te vinden en controleert niet rechtstreeks het bestandssysteem. Het kennen van de juiste locatie omlog4j.properties
oflog4j.xml
te plaatsen, vereist inzicht in de zoekstrategie van de gebruikte klassenlader.log4J
biedt geen standaardconfiguratie omdat uitvoer naar de console of naar het bestandssysteem in sommige omgevingen verboden kan zijn.
Foutopsporing
Voor foutopsporing kunt u proberen de parameter -Dlog4j.debug=true
te gebruiken.
Configuratie van log4j.properties
Voorbeeldconfiguratie van log4j.properties
:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
Hier is nog een configuratiebestand dat meerdere appenders gebruikt:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Apache Solr
Als u Solr gebruikt, kopieert u <solr>/example/resources/log4j.properties
naar een locatie op het classpath.
Voorbeeldconfiguratie van log4j.properties
van Solr gaat als volgt:
# Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n
#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9
#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n
log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN
# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF
Zie ook:
- Korte introductie tot log4j: standaard initialisatieprocedure
- Waarom kan log4j mijn eigenschappen niet vinden in een J2EE- of WAR-toepassing ?
Antwoord 5, autoriteit 4%
De meeste antwoorden hier suggereerden dat het bestand log4j.properties
op de juiste locatie moest worden geplaatst (voor het maven-project zou het zich in src/main/resources
moeten bevinden)
Maar voor mij is het probleem dat mijn log4j.properties
niet correct is geconfigureerd. Hier is een voorbeeld dat voor mij werkt, je kunt het eerst uitproberen.
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Antwoord 6, autoriteit 2%
Zoals eerder uitgelegd zijn er 2 benaderingen
De eerste is om deze regel toe te voegen aan je hoofdmethode:
BasicConfigurator.configure();
Tweede benadering is om dit standaard log4j.properties-bestand toe te voegen aan je classpath:
Terwijl u een tweede benadering kiest, moet u ervoor zorgen dat u het bestand correct initialiseert,
Bijv.
Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");
Zorg ervoor dat u de vereiste map maakt om logbestanden op te slaan.
Antwoord 7
U gebruikt de Logger
in uw code om een bericht te loggen. De Appender
is een Object toegevoegd aan een Logger
om het bericht naar een specifiek doel te schrijven. Er zijn FileAppender
om naar tekstbestanden te schrijven of de ConsoleAppender
om naar de console te schrijven. U moet uw code van de Logger- en Appender-configuratie tonen voor meer hulp.
lees de zelfstudie voor een beter begrip van de interactie tussen Logger en Bijlage.
Antwoord 8
Zorg ervoor dat het eigenschappenbestand correct is ingesteld.
En nogmaals, het lijkt erop dat de compiler het eigenschappenbestand niet kan vinden, je kunt het als volgt instellen bij de pom (alleen als je maven-project gebruikt).
<build>
<sourceDirectory> src/main/java</sourceDirectory>
<testSourceDirectory> src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
</build >
Antwoord 9
Ik had hetzelfde probleem toen ik de JUnit-testklasse probeerde uit te voeren.
Het probleem is opgelost nadat ik het bestand log4j.properties handmatig heb toegevoegd aan de map src/test/resources.
Door de onderstaande code toe te voegen aan het bestand log4j.properties is het probleem opgelost:
# Root logger option
log4j.rootLogger=INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Antwoord 10
Ik krijg dezelfde foutmelding. Hier het probleem dat tot deze foutmelding leidt:
Ik maak een aantal objecten die de Logger gebruiken voordat ik de log4j configureer:
Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);
Oplossing:
Configureer de log4j aan het begin in de hoofdmethode:
PropertyConfigurator.configure(xmlLog4JConfigFile);
// or BasicConfigurator.configure(); if you dont have a config file
Antwoord 11
Voeg het volgende toe als de eerste code:
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
Antwoord 12
Ik denk dat je moet begrijpen waar het log4j jar-bestand of de Java-code naar de log4j-configuratiebestanden zoekt.
src/main/resources/log4j.properties
is het Eclipse-pad.
Plaats ze op een goede locatie, zodat u het absolute pad in de code niet hard hoeft te coderen.
Lees daarvoor mijn artikel en voorbeeldoplossing
https://askyourquestions.info/how -om-te-zien-waar-het-logboek-is-logger-in-slf4j/
Antwoord 13
Een andere reden waarom dit kan gebeuren (in RCP4) is dat u meerdere logging-frameworks gebruikt in uw doelbestand. Dit gebeurt bijvoorbeeld als u een combinatie van slf4j, log4j en ch.qos.logback.slf4j gebruikt in het inhoudtabblad van uw doelbestanden.
Antwoord 14
In mijn geval was de fout de vlag “additiviteit“. Als het “false” is voor uw root-projectpakket, dan hebben de onderliggende pakketten geen apper en ziet u de fout “appender not found“.
Antwoord 15
Als je Eclipse gebruikt en dit probleem verscheen uit het niets nadat alles eerst goed werkte, ga dan naar Project - Clean - Clean
.
Antwoord 16
Ik kwam dit probleem tegen toen ik probeerde een uitvoerbare jar te bouwen met maven in intellij 12. Het bleek dat omdat het Java-manifestbestand geen klassenpad bevatte, het log4j-eigenschappenbestand niet op rootniveau kon worden gevonden (van waaruit het jar-bestand werd uitgevoerd.)
Ter info, ik kreeg de logger als volgt:
Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);
En ik kon het werkend krijgen met een pom-bestand dat dit bevatte:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.mainPackage.mainClass</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path> <!-- need to add current directory to classpath properties files can be found -->
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Antwoord 17
Zorg ervoor dat uw project is geopend in Eclipse, klik vervolgens op het menu “Uitvoeren” bovenaan Eclipse en klik op het volgende:
-
Uitvoeren
-
Configuraties uitvoeren
-
Klaspad (tabblad)
-
Gebruikersinvoer
-
voeg pot aan de rechterkant toe
-
voeg log4j jar-bestand toe
-
Solliciteer
-
Uitvoeren
De foutmelding zou niet meer moeten verschijnen.
Antwoord 18
De reden kan het ontbreken van het woord static
zijn in sommige:
final static Logger logging = Logger.getLogger(ProcessorTest.class);
Als ik logger het instantieveld maak, krijg ik precies deze waarschuwing:
No appenders could be found for logger (org.apache.kafka.producer.Sender)
Erger nog, de waarschuwing verwijst niet naar ProcessorTest
, waar de fout leeft, maar naar een absoluut andere klasse (Sender) als bron van problemen. Die klasse heeft de juiste set logger en hoeft niet te worden gewijzigd! We kunnen eeuwen naar het probleem zoeken!
Antwoord 19
Ik had hetzelfde probleem toen ik log4j2 gebruikte. Mijn probleem wordt veroorzaakt door het gebruik van een verkeerde afhankelijke bibliotheek:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>runtime</scope>
</dependency>
In plaats daarvan zou ik het volgende moeten gebruiken:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>runtime</scope>
</dependency>
In mijn geval heb ik een log4j2.xml gedefinieerd in mijn “resources” directory, en gespecificeerd om het te gebruiken door:
System.setProperty("log4j.configurationFile", "log4j2.xml");
Antwoord 20
Log4J geeft dit waarschuwingsbericht weer wanneer Log4j Java-code zoekt om een eerste logregel in uw programma te maken.
Op dit moment maakt Log4j 2 dingen
- het zoekt om het bestand
log4j.properties
te vinden - het zoekt om de appender te instantiëren die is gedefinieerd in
log4j.properties
Als log4J
het bestand log4j.properties
niet vindt of als appender gedeclareerd in log4j.rootlogger
niet elders in log4j.properties
bestand wordt het waarschuwingsbericht weergegeven.
LET OP: de inhoud van het Eigenschappenbestand moet correct zijn.
De volgende inhoud is NIET correct
log4j.rootLogger=file
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false
omdat file
appender wordt gedeclareerd in LOWER CASE in log4j.rootlogger
statement en gedefinieerd in log4j.appender statement met HOOFDLETTERS!
Een correct bestand zou zijn
log4j.rootLogger=file
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false
Als MAVEN wordt gebruikt, moet u log4j.properties-bestanden in src/main/resources
plaatsen EN een MAVEN-build starten.
Log4j.properties-bestand wordt vervolgens gekopieerd naar de map target/classes
.
Log4J gebruikt het bestand log4j.properties
dat het vond in target/classes
!
Antwoord 21
Ik had dit probleem ook.
Ik ben alleen vergeten de bronnenmap in IntelliJ IDEA te markeren
- Klik met de rechtermuisknop op uw directory
- Markeer map als
- Bronnen root
Antwoord 22
Allereerst: Maak een log4j.properties-bestand
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Plaats het in src/main/resources/
Gebruik daarna deze 2 afhankelijkheden:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
Het is noodzakelijk om deze laatste afhankelijkheid toe te voegen aan het POM-bestand:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
Antwoord 23
Mijn Eclipse-installatie kon log4j.properties
niet vinden bij het uitvoeren van JUnit-tests vanuit Eclipse, ook al stond het bestand op src/test/resources
.
De reden was dat Eclipse (of de m2e connector) geen inhoud kopieerde van src/test/resources
naar de verwachte uitvoermap target/test-classes
– de hoofdoorzaak was dat in de eigenschappen van het project onder Java Build Path -> Tabblad Bron -> Bronmappen op bouwpad -> src/test/resources, op de een of andere manier was er een Excluded: **
invoer. Ik heb dat uitgesloten item verwijderd.
Als alternatief had ik src/test/resources/log4j.properties
ook handmatig kunnen kopiëren naar target/test-classes/log4j.properties
.
Antwoord 24
Als log4j.properties
inderdaad op het klassenpad staat, je Spring Boot gebruikt om een WAR-bestand te maken voor implementatie op een app-server, laat je een web.xml
bestand ten gunste van Spring Boot’s autoconfig, en u krijgt helemaal geen logberichten, moet u Log4j expliciet configureren. Ervan uitgaande dat u Log4j 1.2.x gebruikt:
public class AppConfig extends SpringBootServletInitializer {
public static void main( String[] args ) {
// Launch the application
ConfigurableApplicationContext context = SpringApplication.run( AppConfig.class, args );
}
@Override
protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
InputStream log4j = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
PropertyConfigurator.configure(log4j);
return application;
}
// Other beans as required...
}
Antwoord 25
Misschien voeg het relevante project log4j toe in het Java-buildpad, ik voeg er mahout_h2o aan toe toen ik dit probleem tegenkwam in een mahout-project met eclipse, het werkt!
Antwoord 26
Als je met veel projecten samenwerkt, kun je met een stijlprobleem worden geconfronteerd.
*u moet één bestand lof4j.properties hebben en dit bestand bevat logeigenschappen van een ander project.
*Bovendien kun je proberen log4j-eigenschappenbestanden in het src-pad te plaatsen wanneer het project wordt bewerkt. Linux OS, bibliotheken van andere projecten en log4.properties-bestanden kunnen zich onder één map op een locatie op het klassenpad bevinden.
Antwoord 27
Eerste import:
import org.apache.log4j.PropertyConfigurator;
Voeg vervolgens onderstaande code toe aan de hoofdmethode:
String log4jConfPath ="path to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);
Maak een bestand op pad naar en voeg de onderstaande code toe aan dat bestand.
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
Antwoord 28
De oplossing op deze site werkte voor mij https: //crunchify.com/java-how-to-configure-log4j-logger-property-correctly/. Ik zie nu helemaal geen waarschuwingen van log4j
Ik heb dit in een log4j.properties-bestand geplaatst dat ik in src/main/resources heb geplaatst
# This sets the global logging level and specifies the appenders
log4j.rootLogger=INFO, theConsoleAppender
# settings for the console appender
log4j.appender.theConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.theConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.theConsoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Antwoord 29
Overweeg het log4j JVM-argument Dlog4j.configuration
In het algemeen:
Voeg het JVM-argument toe dat verwijst naar het log4j-configuratiebestand.
De syntaxis is als volgt:
java [ options ] -jar file.jar [ arguments ]
Een voorbeeld van een echte opdrachtregel ziet er als volgt uit:
java -Dlog4j.configuration=conf/log4j.xml -jar myJarFile.jar myArg1 myArg2
Voor IntelliJ IDE-gebruikers:
1.Run/Debug Configurations
2.Edit configurations...
3.VM options
4.Enter the same value also starting with "-D"
Tips:
1.Eclipse IDE-gebruikers zullen een gelijkwaardige aanpak vinden
2.Voor de configuratie-editor voor uitvoeren/debuggen is het zeer waarschijnlijk dat, aan het begin van de tijd, uw specifieke uitvoerbare bestand er niet is. Afhankelijk van de grootte van het project waaraan u momenteel werkt, kan het onaangenaam zijn om door mappen te navigeren om het te vinden. Het is minder lastig als u het bestand slechts één keer uitvoert/uitvoert (klik op afspelen) voordat u doorgaat met het uitvoeren/debuggen van de configuratie ongeacht het resultaat van de uitvoering.
3.Let op je werkmap, relatieve paden en klassenpad.
Antwoord 30
Voor mij was de reden blijkbaar anders en de foutmelding misleidend.
Met alleen dit in mijn build.gradle, zou het klagen dat slf4j ontbrak aan het begin van het logboek, maar nog steeds dingen loggen, zij het in een slecht formaat:
compile 'log4j:log4j:1.2.17'
Het toevoegen van die afhankelijkheid zou voor mij de besproken “geen appenders kunnen worden gevonden” foutmelding veroorzaken, ook al had ik ze gedefinieerd in src/main/java/log4j.properties
:
compile 'log4j:log4j:1.2.17'
compile 'org.slf4j:slf4j-log4j12:1.7.25'
Ten slotte loste het toevoegen van de volgende afhankelijkheid (waarvan ik alleen vermoedde door het van een ander project te kopiëren) het probleem op:
compile 'log4j:log4j:1.2.17'
compile 'org.slf4j:slf4j-log4j12:1.7.25'
compile 'commons-logging:commons-logging:1.2'
Ik weet niet waarom, maar hiermee werkt het. Enig idee daarover?