TaskLogAppender.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:3k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.mapred;
  19. import java.util.LinkedList;
  20. import java.util.Queue;
  21. import org.apache.log4j.FileAppender;
  22. import org.apache.log4j.spi.LoggingEvent;
  23. /**
  24.  * A simple log4j-appender for the task child's 
  25.  * map-reduce system logs.
  26.  * 
  27.  */
  28. public class TaskLogAppender extends FileAppender {
  29.   private String taskId; //taskId should be managed as String rather than TaskID object
  30.   //so that log4j can configure it from the configuration(log4j.properties). 
  31.   private int maxEvents;
  32.   private Queue<LoggingEvent> tail = null;
  33.   @Override
  34.   public void activateOptions() {
  35.     synchronized (this) {
  36.       if (maxEvents > 0) {
  37.         tail = new LinkedList<LoggingEvent>();
  38.       }
  39.       setFile(TaskLog.getTaskLogFile(TaskAttemptID.forName(taskId), 
  40.                                      TaskLog.LogName.SYSLOG).toString());
  41.       setAppend(true);
  42.       super.activateOptions();
  43.     }
  44.   }
  45.   
  46.   @Override
  47.   public void append(LoggingEvent event) {
  48.     synchronized (this) {
  49.       if (tail == null) {
  50.         super.append(event);
  51.       } else {
  52.         if (tail.size() >= maxEvents) {
  53.           tail.remove();
  54.         }
  55.         tail.add(event);
  56.       }
  57.     }
  58.   }
  59.   
  60.   public void flush() {
  61.     qw.flush();
  62.   }
  63.   @Override
  64.   public synchronized void close() {
  65.     if (tail != null) {
  66.       for(LoggingEvent event: tail) {
  67.         super.append(event);
  68.       }
  69.     }
  70.     super.close();
  71.   }
  72.   /**
  73.    * Getter/Setter methods for log4j.
  74.    */
  75.   
  76.   public String getTaskId() {
  77.     return taskId;
  78.   }
  79.   public void setTaskId(String taskId) {
  80.     this.taskId = taskId;
  81.   }
  82.   private static final int EVENT_SIZE = 100;
  83.   
  84.   public long getTotalLogFileSize() {
  85.     return maxEvents * EVENT_SIZE;
  86.   }
  87.   public void setTotalLogFileSize(long logSize) {
  88.     maxEvents = (int) logSize / EVENT_SIZE;
  89.   }
  90. }