Hibernate utilizza log4j ma lo fa attraverso una ulteriore API che si chiama slf4j (Simple Light Facade For Java).
Da precedenti esperimenti, avevo scoperto che di default hibernate usa il jar slf-simple che in pratica consente solo l’output a video e non su file, quindi ho sostituito quel jar con i seguenti:

slf4j-log4j12-1.5.10.jar
slf4j-api-1.5.10.jar

Fatta la sostituzione ovviamente resta da configurare il log4j all’interno della nostra applicazione, in particolare ho aggiunto a livello di web.xml un context-param con il path in cui andare a leggere il file di properties.

Infine, occorre caricare il tutto, nel mio caso all’interno di un context listener:

String pathLog4J = event.getServletContext().getRealPath(“/”);
String fileLog4J = event.getServletContext().getInitParameter(“log4jConfigPath”);
PropertyConfigurator.configure(pathLog4J+fileLog4J);

In questo modo le impostazioni presenti sul file log4j.properties diventano attive.

In alternativa all’uso del path per il file di configurazione, ho trovato in giro questo ottimo metodo che sfruttando le API di reflection sulle classi permette di caricare il log4j.properties ad esempio da dentro un nostro package di classi:

public void reloadLog4jProperties() throws Throwable {

try {
ClassLoader cl = getClass().getClassLoader();
Class logManagerClass = cl.loadClass(“org.apache.log4j.LogManager”);

Method resetConfiguration = logManagerClass.getMethod(“resetConfiguration”, new Class[]{});
resetConfiguration.invoke(null, new Object[]{});

URL log4jprops = cl.getResource(“log4j.properties”);
if (log4jprops != null) {
Class propertyConfiguratorClass = cl.loadClass(“org.apache.log4j.PropertyConfigurator”);
Method configure = propertyConfiguratorClass.getMethod(“configure”, new Class[]{URL.class});
configure.invoke(null, new Object[]{log4jprops});
}
} catch (InvocationTargetException e) {
throw e.getTargetException();
}
}

In questo modo il caricamento di log4j risulta slegato dal file system in cui installo l’applicazione.