MAPREDUCE-2372. TaskLogAppender mechanism shouldn't be set up in log4j.properties. Contributed by Todd Lipcon.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/mapreduce/trunk@1125082 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index bd406fc..4936c25 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -116,6 +116,9 @@
     MAPREDUCE-2483. Remove duplication of jars between Hadoop subprojects
     from build artifacts. (Eric Yang via omalley)
 
+    MAPREDUCE-2372. TaskLogAppender mechanism shouldn't be set up in
+    log4j.properties (todd)
+
   OPTIMIZATIONS
     
     MAPREDUCE-2026. Make JobTracker.getJobCounters() and
diff --git a/src/java/org/apache/hadoop/mapred/TaskLogAppender.java b/src/java/org/apache/hadoop/mapred/TaskLogAppender.java
index 3eaf42d..d60b64a 100644
--- a/src/java/org/apache/hadoop/mapred/TaskLogAppender.java
+++ b/src/java/org/apache/hadoop/mapred/TaskLogAppender.java
@@ -34,13 +34,20 @@
 public class TaskLogAppender extends FileAppender {
   private String taskId; //taskId should be managed as String rather than TaskID object
   //so that log4j can configure it from the configuration(log4j.properties). 
-  private int maxEvents;
+  private Integer maxEvents;
   private Queue<LoggingEvent> tail = null;
-  private boolean isCleanup;
+  private Boolean isCleanup;
+
+  // System properties passed in from JVM runner
+  static final String ISCLEANUP_PROPERTY = "hadoop.tasklog.iscleanup";
+  static final String LOGSIZE_PROPERTY = "hadoop.tasklog.totalLogFileSize";
+  static final String TASKID_PROPERTY = "hadoop.tasklog.taskid";
 
   @Override
   public void activateOptions() {
     synchronized (this) {
+      setOptionsFromSystemProperties();
+
       if (maxEvents > 0) {
         tail = new LinkedList<LoggingEvent>();
       }
@@ -50,6 +57,26 @@
       super.activateOptions();
     }
   }
+
+  /**
+   * The Task Runner passes in the options as system properties. Set
+   * the options if the setters haven't already been called.
+   */
+  private synchronized void setOptionsFromSystemProperties() {
+    if (isCleanup == null) {
+      String propValue = System.getProperty(ISCLEANUP_PROPERTY, "false");
+      isCleanup = Boolean.valueOf(propValue);
+    }
+
+    if (taskId == null) {
+      taskId = System.getProperty(TASKID_PROPERTY);
+    }
+
+    if (maxEvents == null) {
+      String propValue = System.getProperty(LOGSIZE_PROPERTY, "0");
+      setTotalLogFileSize(Long.valueOf(propValue));
+    }
+  }
   
   @Override
   public void append(LoggingEvent event) {
@@ -83,21 +110,21 @@
    * Getter/Setter methods for log4j.
    */
   
-  public String getTaskId() {
+  public synchronized String getTaskId() {
     return taskId;
   }
 
-  public void setTaskId(String taskId) {
+  public synchronized void setTaskId(String taskId) {
     this.taskId = taskId;
   }
 
   private static final int EVENT_SIZE = 100;
   
-  public long getTotalLogFileSize() {
+  public synchronized long getTotalLogFileSize() {
     return maxEvents * EVENT_SIZE;
   }
 
-  public void setTotalLogFileSize(long logSize) {
+  public synchronized void setTotalLogFileSize(long logSize) {
     maxEvents = (int) logSize / EVENT_SIZE;
   }
 
@@ -107,7 +134,7 @@
    * @param isCleanup
    *          true if the task is cleanup attempt, false otherwise.
    */
-  public void setIsCleanup(boolean isCleanup) {
+  public synchronized void setIsCleanup(boolean isCleanup) {
     this.isCleanup = isCleanup;
   }
 
@@ -116,7 +143,7 @@
    * 
    * @return true if the task is cleanup attempt, false otherwise.
    */
-  public boolean getIsCleanup() {
+  public synchronized boolean getIsCleanup() {
     return isCleanup;
   }
 }
diff --git a/src/java/org/apache/hadoop/mapred/TaskRunner.java b/src/java/org/apache/hadoop/mapred/TaskRunner.java
index 97afa26..2a300ee 100644
--- a/src/java/org/apache/hadoop/mapred/TaskRunner.java
+++ b/src/java/org/apache/hadoop/mapred/TaskRunner.java
@@ -460,9 +460,10 @@
     vargs.add("-Dhadoop.log.dir=" + 
         new File(System.getProperty("hadoop.log.dir")).getAbsolutePath());
     vargs.add("-Dhadoop.root.logger=" + getLogLevel(conf).toString() + ",TLA");
-    vargs.add("-Dhadoop.tasklog.taskid=" + taskid);
-    vargs.add("-Dhadoop.tasklog.iscleanup=" + t.isTaskCleanupTask());
-    vargs.add("-Dhadoop.tasklog.totalLogFileSize=" + logSize);
+    vargs.add("-D" + TaskLogAppender.TASKID_PROPERTY +  "=" + taskid);
+    vargs.add("-D" + TaskLogAppender.ISCLEANUP_PROPERTY +
+              "=" + t.isTaskCleanupTask());
+    vargs.add("-D" + TaskLogAppender.LOGSIZE_PROPERTY + "=" + logSize);
   }
 
   /**