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 import java.util.Iterator; 23 import java.util.Set; 24 import org.apache.log4j.helpers.*; 25 26 27 /** 28 * Able to handle the contents of the LoggingEvent's Property bundle and either 29 * output the entire contents of the properties in a similar format to the 30 * java.util.Hashtable.toString(), or to output the value of a specific key 31 * within the property bundle 32 * when this pattern converter has the option set. 33 * 34 * @author Paul Smith 35 * @author Ceki Gülcü 36 */ 37 public final class PropertiesPatternConverter 38 extends LoggingEventPatternConverter { 39 /** 40 * Name of property to output. 41 */ 42 private final String option; 43 44 /** 45 * Private constructor. 46 * @param options options, may be null. 47 */ 48 private PropertiesPatternConverter( 49 final String[] options) { 50 super( 51 ((options != null) && (options.length > 0)) 52 ? ("Property{" + options[0] + "}") : "Properties", "property"); 53 54 if ((options != null) && (options.length > 0)) { 55 option = options[0]; 56 } else { 57 option = null; 58 } 59 } 60 61 /** 62 * Obtains an instance of PropertiesPatternConverter. 63 * @param options options, may be null or first element contains name of property to format. 64 * @return instance of PropertiesPatternConverter. 65 */ 66 public static PropertiesPatternConverter newInstance( 67 final String[] options) { 68 return new PropertiesPatternConverter(options); 69 } 70 71 /** 72 * {@inheritDoc} 73 */ 74 public void format(final LoggingEvent event, final StringBuffer toAppendTo) { 75 // if there is no additional options, we output every single 76 // Key/Value pair for the MDC in a similar format to Hashtable.toString() 77 if (option == null) { 78 toAppendTo.append("{"); 79 80 try { 81 Set keySet = MDCKeySetExtractor.INSTANCE.getPropertyKeySet(event); 82 if (keySet != null) { 83 for (Iterator i = keySet.iterator(); i.hasNext();) { 84 Object item = i.next(); 85 Object val = event.getMDC(item.toString()); 86 toAppendTo.append("{").append(item).append(",").append(val).append( 87 "}"); 88 } 89 } 90 } catch(Exception ex) { 91 LogLog.error("Unexpected exception while extracting MDC keys", ex); 92 } 93 94 toAppendTo.append("}"); 95 } else { 96 // otherwise they just want a single key output 97 Object val = event.getMDC(option); 98 99 if (val != null) { 100 toAppendTo.append(val); 101 } 102 } 103 } 104 }