No appenders could be found for logger using Log4j - java

I'm running an application locally and trying to get it to output logs to a file I created. the log4j.properties file looks like this:
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=C:\\Users\\jkm144\\workspace\\LdapPurge\\log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
It's a Maven project. It's defined in my pom.xml and is listed in my Maven dependencies.
I've imported three classes:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.FileAppender;
and the code I'm using to define the logger is:
static Logger log = Logger.getLogger(LdapPurge.class.getName());
Any time I run into a log, it tells me that "log4j:WARN No appenders could be found for logger"
I'm not sure exactly what I'm doing wrong. This is my first time using log4j.

Your screenshot suggests this is a Maven project, so put the log4j.properties in src/main/resources. This is the Maven-standard path for resource files that need to end up on the classpath at runtime, and anything you put in there will be packaged into your application's JAR file along with the classes that were compiled from the sources in src/main/java.

You should place the log4j.properties under the
WEB-INF/classes
directory of your web-applications. Log4j will find the properties file and initialize itself. This is easy to do and it works.
Manaully Adding log4j.properties:
you can add it any where you want, when you run your project configure the classpath and add the location of the log4j.properties files by clicking on: Run->Run Configuration -> [classpath tab] -> click on user Entries -> Advanced -> Select Add Folder -> select the location of your log4j.properties file. Click OK

Related

Where to place log4j.xml file in a non Maven Project

I have my log4j.xml file stored in the project directory but i am getting following error:
log4j:WARN No appenders could be found for logger (p1.Employee).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more
info.
When i palced it in the bin folder Everything works fine. But i dont check in the bin folder in the code repository so i dont want to place it there.
I dont want to use DOMConfigurator.configure("log4j.xml") as well
Below is my Project Stucture.
In a normal Java Project, you can place a log4j configuration file, i.e., a log4j.properties or a log4j.xml, in a resources directory. The resources directory should be on the same level as src. Putting it here, will allow log4j to use the configuration file automatically.
Otherwise, you can set the log4j configuration file to use via a VM option by doing something like:
-Dlog4j.configuration=file:///path/to/log4j.xml
In your case, if you want to place it in the TrailProject project directory, you can do
-Dlog4j.configuration=file:///path/to/TrailProject/log4j.xml
As per the maven java project folder structure, the ideal path to put the config.xml would be in /src/main/resources directory, so for a non maven project you would put it in an equivalent /resources directory.

log4j properties file not found into netbeans spring

I am using netbeans, and log4j for logging , but getting file not found log4j.properties Please help to right place for log4j.properties file
Please Place your log4j.properties file into Default Package:
- Project Folder
- Source Package
- Default Package
Put log4j.jar file into Libraries folder and import correct namespace.
After that keep log4j.properties into a specific namespace and import that.

Cannot find log file in my project logs folder in spring mvc project

I use log4j in my spring mvc project and I create log file uing log4j.properties in the following.
# Root logger option
log4j.rootLogger= INFO, info, file, stdout, error
# Direct log messages to a log file [INFO]
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File=.logs\\mylog.log
log4j.appender.info.Threshold=INFO
log4j.appender.info.MaxFileSize=1Kb
log4j.appender.info.MaxBackupIndex=10
log4j.appender.info.DatePattern='.'yyyy-MM-dd
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
I want it to be stored in myapp/logs folder in my web application . what part i should for the file.
here is the directory
Right now it will be saved in the current working directory of your IDE (Eclipse or STS, I guess). Its not a good idea to put the file in the project structure, because that structure wont exist, once you deployed the app anywhere.
In Spring you can define a property in youe web.xml, to make the location variable:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>mywebapp.root</param-value>
</context-param>
Then add a variable to your config:
log4j.appender.info.File=${mywebapp.root}/logs/mylog.log
If you have to store it in the application, you can also define that programmatically, by makeing use of "ServletContext.getRealPath(".") to find out where your app is deployed, and then set the path to the file.
In the normal scenario web-app checks for your log file at the root of your class path. To load a file from custom location , have a look at below posts
Change location of log4j.properties
How to use custom file instead of log4j.properties
EDIT :
From op's comment to generate your log file in the projects path , where you have placed your logs directory . you can simply specify it as ,
log4j.appender.file.File= logs/mylog.log

Cannot get log4j log file created

I know this question has been asked before, but none of the answers have worked for me. I have the following log4j.properties file:
# Define the root logger with appender file
log4j.rootLogger = INFO, FILE, stdout
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=/home/sutureself/log.out
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
# Define the layout for the stdout appender
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}
I have this file located in <workspace-root>/resources (I have tried it within src and in <workspace-root>. The resources folder has been added to the build path in Eclipse, along with the jar files log4j-api-2.0-rc1.jar and log4j-core-2.0-rc1.jar. However, when I export the project as a runnable jar, no log file is created, and also nothing is written to stdout either.
I read in some of the other answers on SO, that it needs to be in a folder that is on your classpath. So I added the following to my code:
String classpath = System.getProperty("java.class.path");
System.out.println("Classpath [" + classpath + "]");
... and put the properties file in the location this printed out, but still no file or stdout. In each of my java files where the logger is used, it is implemented:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SutureSelfExample {
private static Logger log = LogManager.getLogger(SutureSelfExample.class.getName());
...
log.info("Log something interesting.");
}
If I run the jar with the following commands:
./SutureSelfRunnable.jar -Dlog4j.configuration=./log4j.properties
./SutureSelfRunnable.jar -cp /home/sutureself/
... still nothing.
What is missing? Do I need to have more in my Java code in order to get this working?
for log4j 2 you need to config by xml config file : see Configuration Log4j 2 for more.
if you want to use the properties file you must downgrade your libs to log4j 1.x.

Two projects | Two log files

Project1 is using classes from project2 and project3.
Project 2 and project 3 has seperate log4j.properties file and logging classes (Pro2.java & Pro3.java with info,debug methods) in their src folder.
Project1 has a main method that calls
Pro2.logInfo("This is a log for project2");
Pro3.logInfo("This is a log for project3");
I want these logs to be logged in two seperate log files as I set in their log4j.properties file.
In general, you can only have one active log4j.properties file (there are exceptions in J2EE environments).
what you want to do, is configure the logging for both projects in a single properties file. You'd need to define two appenders, and specify the categories for each project to use their own appender.
Log4j will automatically look for and use config files it finds on the classpath. It looks for files called log4j.properties and log4j.properties and possibly others.
Alternatively you can programatically load config using;
String filename = "/path/to/config/Project1log4j.properties";
PropertyConfigurator.configure(filename);

Categories