Una pratica comune quando si configura una Web Application per utilizzare log4j è la seguente.
Definiamo innanzitutto un appender per il log della nostra applicazione e poi tramite una servlet che si carica all'attivazione dell'applicazione configuriamo il log4j.
Nel nostro caso la servlet cerca un parametro definito a livello di Web-xml (un context parameter) e, se lo trova valorizzato allora cerca il log4j.properties nella directory specificata, altrimenti utilizza l'impostazione di default.
Ricordiamo che i livelli di log previsti dal frqamework log4j sono i seguenti:
log4j.properties
##############################################################
################### DEFINIZIONE DEI LOGGER ###################
##############################################################
log4j.rootLogger=INFO,ApplicationConsoleLog
#Gestione log4j generale per l'Applicazione
log4j.logger.WebTest.MyLogger=DEBUG, ApplicationLog
###############################################################
########## DEFINIZIONE DEGLI APPENDER DEFINITI SOPRA ##########
###### CONSOLE ########
#######################
log4j.appender.ApplicationConsoleLog=org.apache.log4j.ConsoleAppender
log4j.appender.ApplicationConsoleLog.layout=org.apache.log4j.PatternLayout
###### EXCEPTION ######
#######################
log4j.appender.ApplicationLog=org.apache.log4j.RollingFileAppender
log4j.appender.ApplicationLog.File=
log4j.appender.ApplicationLog.MaxFileSize=2000KB
log4j.appender.ApplicationLog.MaxBackupIndex=10
log4j.appender.ApplicationLog.layout=org.apache.log4j.PatternLayout
log4j.appender.ApplicationLog.layout.ConversionPattern=%d{dd-MM-yyyy HH\:mm\:ss} -%p- %m%n
Sono definiti 2 logger, un ApplicationConsoleLog che opera solo a livello di console dell'application server e poi un ApplicationLog che si occupa di loggare su File.
Il codice della Servlet è il seguente:
InitServlet
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String LOG4J_FILE_PROP="log4j.appender.ApplicationLog.File";
/**
* @see HttpServlet#HttpServlet()
*/
public InitServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext ctx=config.getServletContext();
StringBuffer log4jConf=new StringBuffer();
log4jConf.append(getConfigPath(ctx));
log4jConf.append(File.separator);
log4jConf.append("log4j.properties");
try
{
File log4JFile=new File(log4jConf.toString());
if(log4JFile.exists()){
InputStream stream=new FileInputStream(log4JFile);
Properties log4jProp = new Properties();
log4jProp.load(stream);
if(log4jProp.getProperty(LOG4J_FILE_PROP).trim().equals("")){
String logDir=getLogFileDefault(ctx);
log4jProp.setProperty(LOG4J_FILE_PROP, logDir);
}
PropertyConfigurator.configure(log4jProp);
Logger.getLogger("WebTest.MyLogger").warn("###########################\nLog4j CARICATO CON SUCCESSO");
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
private String getLogFileDefault(ServletContext ctx){
StringBuffer sb=new StringBuffer();
sb.append(ctx.getRealPath(""));
sb.append(File.separator);
sb.append("logs");
sb.append(File.separator);
sb.append("log.log");
return sb.toString();
}
/**
* Cerco la directory contenente il file di configurazione di log4j <br>
* nella directory specificata nel context parameter"locationConfig"<br>
* se il percorso non è specificato allora lo cerco dentro la directory config della web-app
* @param ctx
* @return
*/
private String getConfigPath(ServletContext ctx) {
String path="";
String nome="locationConfig";
path = ctx.getInitParameter(nome);
if(path==null || path.trim().equals("")){
// non � stato configurato via Web Xml
path=ctx.getRealPath("")+File.separator+"config";
}
return path;
}
}
web.xml
<servlet>
<description></description>
<display-name>InitServlet</display-name>
<servlet-name>InitServlet</servlet-name>
<servlet-class>it.servlet.InitServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/InitServlet</url-pattern>
</servlet-mapping>
<context-param>
<param-name>locationConfig</param-name>
<param-value></param-value>
</context-param>
.....
Per richiamare il nostro log all'interno del codice Java sarà sufficiente scrivere:
.......
Definiamo innanzitutto un appender per il log della nostra applicazione e poi tramite una servlet che si carica all'attivazione dell'applicazione configuriamo il log4j.
Nel nostro caso la servlet cerca un parametro definito a livello di Web-xml (un context parameter) e, se lo trova valorizzato allora cerca il log4j.properties nella directory specificata, altrimenti utilizza l'impostazione di default.
Ricordiamo che i livelli di log previsti dal frqamework log4j sono i seguenti:
- TRACE;
- DEBUG;
- INFO;
- WARN;
- ERROR;
- FATAL.
log4j.properties
##############################################################
################### DEFINIZIONE DEI LOGGER ###################
##############################################################
log4j.rootLogger=INFO,ApplicationConsoleLog
#Gestione log4j generale per l'Applicazione
log4j.logger.WebTest.MyLogger=DEBUG, ApplicationLog
###############################################################
########## DEFINIZIONE DEGLI APPENDER DEFINITI SOPRA ##########
###### CONSOLE ########
#######################
log4j.appender.ApplicationConsoleLog=org.apache.log4j.ConsoleAppender
log4j.appender.ApplicationConsoleLog.layout=org.apache.log4j.PatternLayout
###### EXCEPTION ######
#######################
log4j.appender.ApplicationLog=org.apache.log4j.RollingFileAppender
log4j.appender.ApplicationLog.File=
log4j.appender.ApplicationLog.MaxFileSize=2000KB
log4j.appender.ApplicationLog.MaxBackupIndex=10
log4j.appender.ApplicationLog.layout=org.apache.log4j.PatternLayout
log4j.appender.ApplicationLog.layout.ConversionPattern=%d{dd-MM-yyyy HH\:mm\:ss} -%p- %m%n
Sono definiti 2 logger, un ApplicationConsoleLog che opera solo a livello di console dell'application server e poi un ApplicationLog che si occupa di loggare su File.
Il codice della Servlet è il seguente:
InitServlet
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String LOG4J_FILE_PROP="log4j.appender.ApplicationLog.File";
/**
* @see HttpServlet#HttpServlet()
*/
public InitServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext ctx=config.getServletContext();
StringBuffer log4jConf=new StringBuffer();
log4jConf.append(getConfigPath(ctx));
log4jConf.append(File.separator);
log4jConf.append("log4j.properties");
try
{
File log4JFile=new File(log4jConf.toString());
if(log4JFile.exists()){
InputStream stream=new FileInputStream(log4JFile);
Properties log4jProp = new Properties();
log4jProp.load(stream);
if(log4jProp.getProperty(LOG4J_FILE_PROP).trim().equals("")){
String logDir=getLogFileDefault(ctx);
log4jProp.setProperty(LOG4J_FILE_PROP, logDir);
}
PropertyConfigurator.configure(log4jProp);
Logger.getLogger("WebTest.MyLogger").warn("###########################\nLog4j CARICATO CON SUCCESSO");
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
private String getLogFileDefault(ServletContext ctx){
StringBuffer sb=new StringBuffer();
sb.append(ctx.getRealPath(""));
sb.append(File.separator);
sb.append("logs");
sb.append(File.separator);
sb.append("log.log");
return sb.toString();
}
/**
* Cerco la directory contenente il file di configurazione di log4j <br>
* nella directory specificata nel context parameter"locationConfig"<br>
* se il percorso non è specificato allora lo cerco dentro la directory config della web-app
* @param ctx
* @return
*/
private String getConfigPath(ServletContext ctx) {
String path="";
String nome="locationConfig";
path = ctx.getInitParameter(nome);
if(path==null || path.trim().equals("")){
// non � stato configurato via Web Xml
path=ctx.getRealPath("")+File.separator+"config";
}
return path;
}
}
web.xml
....
<description></description>
<display-name>InitServlet</display-name>
<servlet-name>InitServlet</servlet-name>
<servlet-class>it.servlet.InitServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>InitServlet</servlet-name>
<url-pattern>/InitServlet</url-pattern>
</servlet-mapping>
<context-param>
<param-name>locationConfig</param-name>
<param-value></param-value>
</context-param>
.....
Per richiamare il nostro log all'interno del codice Java sarà sufficiente scrivere:
.......
private static Logger log=Logger.getLogger("WebTest.MyLogger");
Nessun commento:
Posta un commento