You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chukwa.apache.org by as...@apache.org on 2009/03/27 23:39:45 UTC

svn commit: r759379 - in /hadoop/chukwa/trunk: ./ src/java/org/apache/hadoop/chukwa/inputtools/log4j/ src/test/org/apache/hadoop/chukwa/inputtools/log4j/

Author: asrabkin
Date: Fri Mar 27 22:39:45 2009
New Revision: 759379

URL: http://svn.apache.org/viewvc?rev=759379&view=rev
Log:
CHUKWA-28.  Late initialization of log4j appender.  (contributed by Jerome Boulon)

Added:
    hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/TestChukwaDailyRollingFileAppender.java
    hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/late-log4j.properties
Modified:
    hadoop/chukwa/trunk/CHANGES.txt
    hadoop/chukwa/trunk/build.xml
    hadoop/chukwa/trunk/src/java/org/apache/hadoop/chukwa/inputtools/log4j/ChukwaDailyRollingFileAppender.java

Modified: hadoop/chukwa/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/chukwa/trunk/CHANGES.txt?rev=759379&r1=759378&r2=759379&view=diff
==============================================================================
--- hadoop/chukwa/trunk/CHANGES.txt (original)
+++ hadoop/chukwa/trunk/CHANGES.txt Fri Mar 27 22:39:45 2009
@@ -35,6 +35,8 @@
 
   BUG FIXES
 
+    CHUKWA-28.  Late initalization of log4j adaptor.  (Jerome Boulon via asrabkin)
+
     CHUKWA-48.  Cleanup code to resolve compiler warnings.  (asrabkin)
 
     CHUKWA-9.  MetricDataLoader should close JDBC connection.  (Jerome Boulon via asrabkin)

Modified: hadoop/chukwa/trunk/build.xml
URL: http://svn.apache.org/viewvc/hadoop/chukwa/trunk/build.xml?rev=759379&r1=759378&r2=759379&view=diff
==============================================================================
--- hadoop/chukwa/trunk/build.xml (original)
+++ hadoop/chukwa/trunk/build.xml Fri Mar 27 22:39:45 2009
@@ -272,7 +272,7 @@
                 <property name="test.build.testjar" value="${test.build.dir}/testjar"/>
                 <property name="test.include" value="Test*"/>
                 <property name="test.classpath.id" value="test.classpath"/>
-                <property name="test.output" value="yes"/>
+                <property name="test.output" value="no"/>
                 <property name="test.timeout" value="900000"/>
                 <property name="test.junit.output.format" value="plain"/>
                 <property name="test.junit.fork.mode" value="perTest" />
@@ -360,13 +360,20 @@
                  <classpath refid="testClasspath" />
                  <classpath refid="testDemuxClasspath" />
             </javac>
+
+            <copy todir="${test.build.dir}/classes/org/apache/hadoop/chukwa/inputtools/log4j/">
+                  <fileset dir="${basedir}/src/test/org/apache/hadoop/chukwa/inputtools/log4j/">
+                     <include name="late-log4j.properties" />
+                  </fileset>
+            </copy>
+
         </target>
 
             <!--printsummary="${test.junit.printsummary}" -->
 
 	<target name="test-chukwa" depends="compile,compile-test" description="Run Chukwa unit tests">
           <mkdir dir="${basedir}/var"/>
-          <junit showoutput="yes"
+          <junit showoutput="${test.output}"
             fork="yes"
             printsummary="withOutAndErr"
             forkmode="${test.junit.fork.mode}"

Modified: hadoop/chukwa/trunk/src/java/org/apache/hadoop/chukwa/inputtools/log4j/ChukwaDailyRollingFileAppender.java
URL: http://svn.apache.org/viewvc/hadoop/chukwa/trunk/src/java/org/apache/hadoop/chukwa/inputtools/log4j/ChukwaDailyRollingFileAppender.java?rev=759379&r1=759378&r2=759379&view=diff
==============================================================================
--- hadoop/chukwa/trunk/src/java/org/apache/hadoop/chukwa/inputtools/log4j/ChukwaDailyRollingFileAppender.java (original)
+++ hadoop/chukwa/trunk/src/java/org/apache/hadoop/chukwa/inputtools/log4j/ChukwaDailyRollingFileAppender.java Fri Mar 27 22:39:45 2009
@@ -183,6 +183,9 @@
    */
   private int maxBackupIndex = 10;
 
+  private ClientFinalizer clientFinalizer = null;
+  
+  boolean hasBeenActivated = false;
   Date now = new Date();
 
   SimpleDateFormat sdf;
@@ -225,7 +228,6 @@
         .println("Daily Rolling File Appender successfully registered file with agent: "
             + filename);
     this.datePattern = datePattern;
-    activateOptions();
   }
 
   /**
@@ -253,6 +255,11 @@
   }
 
   public void activateOptions() {
+    
+    // Prevent early initialisation
+    if (!hasBeenActivated)
+    { return;}
+    
     super.activateOptions();
     if (datePattern != null && fileName != null) {
       now.setTime(System.currentTimeMillis());
@@ -478,7 +485,22 @@
     }
   }
 
-  private ClientFinalizer clientFinalizer = null;
+  
+  /**
+   * Fix for late-initialisation
+   */
+  @Override
+  protected boolean checkEntryConditions() {
+    if (!hasBeenActivated) {
+      synchronized(chukwaLock) {
+        if (!hasBeenActivated) {
+          hasBeenActivated = true;
+          activateOptions();
+        }
+      }
+    }
+    return super.checkEntryConditions();
+  }
 
   /**
    * This method differentiates DailyRollingFileAppender from its super class.
@@ -514,6 +536,11 @@
 
             chukwaClientIsNull = false;
 
+            // FIXME: Hack to make the log file readable by chukwa user. 
+            if(System.getProperty("os.name").intern()=="Linux".intern()) {
+              Runtime.getRuntime().exec("chmod 640 "+getFile());
+            }
+            
             // Watchdog is watching for ChukwaAgent only once every 5 minutes,
             // so there's no point in retrying more than once every 5 mins.
             // In practice, if the watchdog is not able to automatically restart

Added: hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/TestChukwaDailyRollingFileAppender.java
URL: http://svn.apache.org/viewvc/hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/TestChukwaDailyRollingFileAppender.java?rev=759379&view=auto
==============================================================================
--- hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/TestChukwaDailyRollingFileAppender.java (added)
+++ hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/TestChukwaDailyRollingFileAppender.java Fri Mar 27 22:39:45 2009
@@ -0,0 +1,64 @@
+package org.apache.hadoop.chukwa.inputtools.log4j;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Date;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.hadoop.chukwa.datacollection.agent.ChukwaAgent;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.helpers.LogLog;
+import org.apache.log4j.helpers.OptionConverter;
+
+public class TestChukwaDailyRollingFileAppender extends TestCase {
+
+  @SuppressWarnings("deprecation")
+  public void testlateInit4ChukwaDailyRollingFileAppender() {
+
+    String folder = System.getProperty("test.build.data", "/tmp");
+    File tempDir = new File(folder);
+    if (!tempDir.exists()) {
+      tempDir.mkdirs();
+    }
+    // load new log4j
+    String configuratorClassName = OptionConverter.getSystemProperty(
+        LogManager.CONFIGURATOR_CLASS_KEY, null);
+
+    URL url = TestChukwaDailyRollingFileAppender.class
+        .getResource("late-log4j.properties");
+
+    System.getProperties().setProperty("CHUKWA_TEST_LOG_LATE_INIT", folder);
+
+    if (url != null) {
+      LogLog
+          .debug("Using URL [" + url + "] for automatic log4j configuration.");
+      try {
+        OptionConverter.selectAndConfigure(url, configuratorClassName,
+            LogManager.getLoggerRepository());
+      } catch (NoClassDefFoundError e) {
+        LogLog.warn("Error during default initialization", e);
+      }
+    } else {
+      Assert.fail("URL should not be null");
+    }
+    File logFile = new File(folder + "/chukwaTestLateLogInit.log");
+    if (logFile.exists()) {
+      logFile.delete();
+    }
+    Assert.assertTrue("Log file should not be there", logFile.exists() == false);
+    Logger log = Logger.getLogger(ChukwaAgent.class);
+    try {
+      Thread.sleep(2000);
+    }catch (Exception e) {
+      // do nothing
+    }
+    Assert.assertTrue("Log file should not be there", logFile.exists() == false);
+    log.warn("test 123 " + new Date());
+    Assert.assertTrue("Log file should not be there", logFile.exists() == true);
+    logFile.delete();
+  }
+
+}

Added: hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/late-log4j.properties
URL: http://svn.apache.org/viewvc/hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/late-log4j.properties?rev=759379&view=auto
==============================================================================
--- hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/late-log4j.properties (added)
+++ hadoop/chukwa/trunk/src/test/org/apache/hadoop/chukwa/inputtools/log4j/late-log4j.properties Fri Mar 27 22:39:45 2009
@@ -0,0 +1,12 @@
+log4j.rootLogger=INFO, R
+#log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R=org.apache.hadoop.chukwa.inputtools.log4j.ChukwaDailyRollingFileAppender
+log4j.appender.R.File=${CHUKWA_TEST_LOG_LATE_INIT}/chukwaTestLateLogInit.log
+log4j.appender.R.DatePattern=.yyyy-MM-dd
+log4j.appender.R.MaxBackupIndex=10
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%d{ISO8601} %p %t %c{1} - %m%n
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %p %t %c{1} - %m%n