I'm trying to use a logger across a web application. I have added the FileHandler to write the log into file. Now, I need to use the same handler across other classes/servlets in the project, so that logs from all classes are written to same text file. How can I achieve this?
/***
* Initialize a logger
*/
public static Logger logger;
static {
try {
FileHandler fh = new FileHandler("log.txt", true);
fh.setFormatter(new SimpleFormatter());
logger = Logger.getLogger(MyClass.class.getName());
logger.addHandler(fh);
}
catch (IOException e) {
e.printStackTrace();
}
}
Do I need to initialize the logger and add handler in every class as in above code? Any other techniques?
package package_name;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Log {
public Log()
{
Properties props = new Properties();
try {
props.load(getClass().getResourceAsStream("/log4j.properties"));
} catch (IOException e) {
e.printStackTrace();
}
PropertyConfigurator.configure(props);//PropertyConfigurator.configure("log4j.properties");
}
public Logger getLogger(Object obj)
{
Logger logger = Logger.getLogger(Object.class);
return logger;
}
}
then we have to maintain a log4j.properties file in one of our packages,and the file should be as follows,
log4j.properties
log4j.rootLogger=DEBUG, R,CA
log4j.appender.R = org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File = c:\\our project name+LOGSLIVE\\logs\\project short name.log
log4j.appender.R.Append = true
log4j.appender.R.DatePattern = '_'yyyy-MM-dd'.log'
log4j.appender.R.layout = org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %m%n
log4j.appender.R.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %5p [%t] (%F:%L) - %m%n
#Console Appender
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
I'd consider using a logging framework such as Log4J.
Using it would just boil down to configuring the appenders (e.g. FileAppender) and log levels in a central file (.xml or .properties) and in each class that needs to define a logger you'd just do Log l = LogFactory.getLog(clazz);
(where clazz is the class you define the logger for).
You could make the logger public static and use it from other classes as well but I'd not recommend it, since you normally want to know which logger (i.e. which class that logger was defined for) generated a log entry.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With