7. září 2007

Více prostředí pomocí Springu, log4j

Aby byla implementace více prostředí ve Springu kompletní, tak ještě zbývá vyřešit nastavení logování (konkrétně Log4j) pro jednotlivá prostředí. Logger se spouští odděleně od vlastní inicializace Springu a samozřejmě by se měl spouštět jako první. Možná si někdo řekne, že už je to přehnané mít více nastavení loggerů, ale my jsme ty požadavky měly - produkční logger posílá chyby mailem, logger pro vývoj pouze loguje na konzoli a logger pro akceptační testy loguje do souboru. Zde je vidět, že potřeba více loggerů opravdu je.

Tento článek se odvolává na věci uvedené v předchozích článcích na toto téma - Více prostředí pomocí Springu, úvod a Více prostředí pomocí Springu, implementace.

Zjištění cesty ke konfiguraci loggeru

Nastavení loggeru bude umístěno v souboru log4j.xml v adresářích představující jednotlivá prostředí (DEVELOP, ANECT, apod.). Podle volby prostředí v konf. souboru config.properties je potřeba zjistit cestu ke správné konfiguraci loggeru. Do třídy EnvironmentUtils přidáme následující metodu:
  /**
* Method returns location of log4j configuration file.
* @return path to log4j conf. file
*/
public static String getLog4jConfigLocation() {
return "classpath:/config/env/" + getEnvironment() + "/log4j.xml";
}

Vlastní implementace Log4jConfigListener

Známe cestu ke konfiguraci a potřebujeme podle toho upravit standardní Log4jConfigListener.
/**
* Custom listener for log4j inicialization.
*
* This listener is aware of different environments.
*
* @author pjuza@anect.com
*/
public class EnvironmentAwareLog4jConfigListener extends Log4jConfigListener {

/**
* This method is overridden because we need to have environment aware initialization.
* From this reason we need to use custom Log4j configurer.
*/
@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext servletContext = event.getServletContext();

String location = EnvironmentUtils.getLog4jConfigLocation();

// Write log message to server log.
servletContext.log("Initializing Log4J from [" + location + "]");

//Expose the web app root system property.
WebUtils.setWebAppRootSystemProperty(servletContext);

try {
Log4jConfigurer.initLogging(location);
}
catch (FileNotFoundException ex) {
servletContext.log("Log4J config file [" + location + "] not found", ex);
}
}
}
Na závěr je ještě nutné upravit konfiguraci web.xml.
  <listener>
<listener-class>cz.anect.mis.utils.config.EnvironmentAwareLog4jConfigListener</listener-class>
</listener>

Žádné komentáře: