logging to file improved
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Tue, 20 Jul 2010 11:04:28 +0000 (11:04 +0000)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Tue, 20 Jul 2010 11:04:28 +0000 (11:04 +0000)
cdm-server/pom.xml
cdm-server/src/main/java/eu/etaxonomy/cdm/server/Bootloader.java
cdm-server/src/main/java/eu/etaxonomy/cdm/server/CommandOptions.java
cdm-server/src/main/resources/log4j.properties

index daf3099bd72d6c599a71f92be065c03aeff96881..45d251bdd6257bafca908a1c6d63f9ba31b89d46 100644 (file)
       <version>1.1</version>
     </dependency>
     
+    <!--  Logging  -->
+    <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-api</artifactId>
+          <version>1.6.1</version>
+       </dependency>
+       <dependency>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-log4j12</artifactId>
+          <version>1.6.1</version>
+       </dependency>
+    
        <dependency>
           <groupId>commons-cli</groupId>
           <artifactId>commons-cli</artifactId>
index 2dd389f55f354c3489276d3c133b708739d3c006..9ff8874ef5ffad6a15876a46ce13c732e98894f2 100644 (file)
@@ -27,12 +27,9 @@ import java.lang.reflect.InvocationTargetException;
 import java.net.URL;
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.EventListener;
 import java.util.Set;
 
 import javax.naming.NamingException;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
 import javax.sql.DataSource;
 
 import org.apache.commons.cli.CommandLine;
@@ -42,6 +39,8 @@ import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.RollingFileAppender;
 import org.eclipse.jetty.jmx.MBeanContainer;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
@@ -76,6 +75,7 @@ public final class Bootloader {
        private static final String DATASOURCE_BEANDEF_FILE = "datasources.xml";
        private static final String USERHOME_CDM_LIBRARY_PATH = System.getProperty("user.home")+File.separator+".cdmLibrary"+File.separator;
        private static final String TMP_PATH = USERHOME_CDM_LIBRARY_PATH + "server" + File.separator;
+       private static final String LOG_PATH = USERHOME_CDM_LIBRARY_PATH + "log" + File.separator;
        
        private static final String APPLICATION_NAME = "CDM Server";
     private static final String WAR_POSTFIX = ".war";
@@ -86,6 +86,7 @@ public final class Bootloader {
     private static final File CDM_WEBAPP_TEMP_FOLDER = new File(TMP_PATH + CDM_WEBAPP_WAR_NAME);
     
     private static final String ATTRIBUTE_JDBC_JNDI_NAME = "cdm.jdbcJndiName";
+    private static final String CDM_LOGFILE = "cdm.logfile";
     
     private static final int KB = 1024;
     
@@ -236,6 +237,17 @@ public final class Bootloader {
 
        private void startServer() throws IOException,
                        FileNotFoundException, Exception, InterruptedException {
+               
+               
+               //assure LOG_PATH exists
+               File logPath = new File(LOG_PATH);
+               if(!logPath.exists()){
+                       FileUtils.forceMkdir(new File(LOG_PATH));
+               }
+               
+               //append logger
+               configureFileLogger();
+               
                logger.info("Starting "+APPLICATION_NAME);
                logger.info("Using  " + System.getProperty("user.home") + " as home directory. Can be specified by -Duser.home=<FOLDER>");
        
@@ -252,6 +264,7 @@ public final class Bootloader {
        }
        tempDir = null;
         
+       
         // WARFILE
         if(cmdLine.hasOption(WEBAPP.getOpt())){
                 webappFile = new File(cmdLine.getOptionValue(WEBAPP.getOpt()));
@@ -363,6 +376,27 @@ public final class Bootloader {
        System.exit(0);
        }
 
+       /**
+        * Configueres and adds a {@link RollingFileAppender} to the root logger
+        * 
+        * The log files of the cdm-remote instances are configured by the 
+        * {@link eu.etaxonomy.cdm.remote.config.LoggingConfigurer}
+        */
+       private void configureFileLogger() {
+
+               PatternLayout layout = new PatternLayout("%d %p [%c] - %m%n");
+               try {
+                       String logFile = LOG_PATH + File.separator + "cdmserver.log";
+                       RollingFileAppender appender = new RollingFileAppender(layout, logFile);
+                       appender.setMaxBackupIndex(3);
+                       appender.setMaxFileSize("250MB");
+                       Logger.getRootLogger().addAppender(appender);
+                       logger.info("logging to :" + logFile);
+               } catch (IOException e) {
+                       logger.error("Creating RollingFileAppender failed:", e);
+               }
+       }
+
        private void addCdmServerContexts(boolean austostart) throws IOException {
                
                for(CdmInstanceProperties conf : configAndStatus){
@@ -384,6 +418,10 @@ public final class Bootloader {
             cdmWebappContext.setAttribute(ATTRIBUTE_JDBC_JNDI_NAME, conf.getJdbcJndiName());
                setWebApp(cdmWebappContext, webappFile);
                
+                       cdmWebappContext.setAttribute(CDM_LOGFILE,
+                                       LOG_PATH + File.separator + "cdm-"
+                                                       + conf.getDataSourceName() + ".log");
+   
                if(webappFile.isDirectory() && isRunningFromSource()){
                        
                                /*
@@ -394,8 +432,10 @@ public final class Bootloader {
                                 * the system classloader would load these resources.
                                 */
                        logger.info("Running webapp from source folder, thus adding java.class.path to WebAppClassLoader");
+
+                       WebAppClassLoader classLoader = new WebAppClassLoader(cdmWebappContext);
+                       
                        String classPath = System.getProperty("java.class.path");
-                       WebAppClassLoader classLoader = new WebAppClassLoader(cdmWebappContext);
                        classLoader.addClassPath(classPath);
                        cdmWebappContext.setClassLoader(classLoader);
                }
index 019e2768725dcd94b37c6fd973b2cf900fcd717f..75b414cdbf3586c214854a7c7f500055b8086c2f 100644 (file)
@@ -23,18 +23,17 @@ public class CommandOptions{
                        "For testing you can use the following jvm options:\n" +\r
                        "   -Dcom.sun.management.jmxremote.ssl=false\n" +\r
                        "   -Dcom.sun.management.jmxremote.authenticate=false\n" +\r
-                       "   -Dcom.sun.management.jmxremote.port=9999\n" );\r
+                       "   -Dcom.sun.management.jmxremote.port=9999" );\r
        \r
        @SuppressWarnings("static-access")\r
        public static final Option WEBAPP = OptionBuilder\r
                        .withArgName("file")\r
                        .hasArg()\r
                        .withDescription( "use the specified webapplication this either can be a compressed war or extracted file. " +\r
-                                       "If this options is used extraction of the war from the cdmserver jar file is omitted." +\r
-                                       "Developers can run the server completely from the traget folder or completly from source " +\r
-                                       "when using the following paths: \n" +\r
-                                       "'{cdmlib-project-root}/cdmlib-remote/target/cdmserver' " +\r
-                                       "'{cdmlib-project-root}/cdmlib-remote/src/main/webapp' " )\r
+                                       "If this option is used extraction of the war from the cdmserver jar file is omitted." +\r
+                                       "Using the following paths developers can run the server completely from the target folder or completely from source:\n" +\r
+                                       "'{cdmlib-project-root}/cdmlib-remote/target/cdmserver'\n " +\r
+                                       "'{cdmlib-project-root}/cdmlib-remote/src/main/webapp'" )\r
                        .create("webapp");\r
 \r
        @SuppressWarnings("static-access")\r
index e40c816c78678e6adc30b89e13a27285a7b0bbf0..6ff83b30f64c68560535ae04055069ae632ec59a 100644 (file)
@@ -7,21 +7,18 @@
 #     java -Dlog4j.configDebug=true\r
 #\r
 \r
-log4j.rootLogger=WARN, stdout, logfile\r
+log4j.rootLogger= WARN, stdout\r
 \r
 \r
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender\r
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r
 log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n\r
 \r
-log4j.appender.logfile=org.apache.log4j.RollingFileAppender\r
-log4j.appender.logfile.File=${user.home}/.cdmLibrary/cdmserver.log\r
-log4j.appender.logfile.MaxFileSize=512KB\r
-#     Keep three backup files.\r
-log4j.appender.logfile.MaxBackupIndex=3\r
-#     Pattern to output: date priority [category] - message\r
-log4j.appender.logfile.layout=org.apache.log4j.PatternLayout\r
-log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n\r
+##\r
+## NOTICE !!!!\r
+## no need to configure a FileAppender here\r
+## this is done in Bootloader.class for you\r
+##\r
 \r
 \r
 ###\r