View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17
    18  package org.apache.log4j.pattern;
    19
    20  import org.apache.log4j.spi.LoggingEvent;
    21
    22
    23  /**
    24   * Return the relative time in milliseconds since loading of the LoggingEvent
    25   * class.
    26   *
    27   * @author Ceki G&uuml;lc&uuml;
    28   */
    29  public class RelativeTimePatternConverter extends LoggingEventPatternConverter {
    30    /**
    31     * Cached formatted timestamp.
    32     */
    33    private CachedTimestamp lastTimestamp = new CachedTimestamp(0, "");
    34
    35    /**
    36     * Private constructor.
    37     */
    38    public RelativeTimePatternConverter() {
    39      super("Time", "time");
    40    }
    41
    42    /**
    43     * Obtains an instance of RelativeTimePatternConverter.
    44     * @param options options, currently ignored, may be null.
    45     * @return instance of RelativeTimePatternConverter.
    46     */
    47    public static RelativeTimePatternConverter newInstance(
    48      final String[] options) {
    49      return new RelativeTimePatternConverter();
    50    }
    51
    52    /**
    53     * {@inheritDoc}
    54     */
    55    public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
    56      long timestamp = event.timeStamp;
    57
    58      if (!lastTimestamp.format(timestamp, toAppendTo)) {
    59        final String formatted =
    60          Long.toString(timestamp - LoggingEvent.getStartTime());
    61        toAppendTo.append(formatted);
    62        lastTimestamp = new CachedTimestamp(timestamp, formatted);
    63      }
    64    }
    65
    66    /**
    67     * Cached timestamp and formatted value.
    68     */
    69    private static final class CachedTimestamp {
    70      /**
    71       * Cached timestamp.
    72       */
    73      private final long timestamp;
    74
    75      /**
    76       * Cached formatted timestamp.
    77       */
    78      private final String formatted;
    79
    80      /**
    81       * Creates a new instance.
    82       * @param timestamp timestamp.
    83       * @param formatted formatted timestamp.
    84       */
    85      public CachedTimestamp(long timestamp, final String formatted) {
    86        this.timestamp = timestamp;
    87        this.formatted = formatted;
    88      }
    89
    90      /**
    91       * Appends the cached formatted timestamp to the buffer if timestamps match.
    92       * @param newTimestamp requested timestamp.
    93       * @param toAppendTo buffer to append formatted timestamp.
    94       * @return true if requested timestamp matched cached timestamp.
    95       */
    96      public boolean format(long newTimestamp, final StringBuffer toAppendTo) {
    97        if (newTimestamp == timestamp) {
    98          toAppendTo.append(formatted);
    99
    100         return true;
    101       }
    102
    103       return false;
    104     }
    105   }
    106 }