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ülcü 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 }