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 package org.apache.logging.log4j.core.pattern;
18
19 import org.apache.logging.log4j.core.LogEvent;
20 import org.apache.logging.log4j.core.impl.LocationAware;
21
22 /**
23 *
24 */
25 public class PatternFormatter {
26 private final LogEventPatternConverter converter;
27 private final FormattingInfo field;
28 private final boolean skipFormattingInfo;
29
30 public PatternFormatter(final LogEventPatternConverter converter, final FormattingInfo field) {
31 this.converter = converter;
32 this.field = field;
33 this.skipFormattingInfo = field == FormattingInfo.getDefault();
34 }
35
36 public void format(final LogEvent event, final StringBuilder buf) {
37 if (skipFormattingInfo) {
38 converter.format(event, buf);
39 } else {
40 formatWithInfo(event, buf);
41 }
42 }
43 private void formatWithInfo(final LogEvent event, final StringBuilder buf) {
44 final int startField = buf.length();
45 converter.format(event, buf);
46 field.format(startField, buf);
47 }
48
49 public LogEventPatternConverter getConverter() {
50 return converter;
51 }
52
53 public FormattingInfo getFormattingInfo() {
54 return field;
55 }
56
57 /**
58 * Normally pattern formatters are not meant to handle Exceptions although few pattern formatters might.
59 * <p>
60 * By examining the return values for this method, the containing layout will determine whether it handles
61 * throwables or not.
62 * </p>
63 *
64 * @return true if this PatternConverter handles throwables
65 */
66 public boolean handlesThrowable() {
67 return converter.handlesThrowable();
68 }
69
70 /**
71 * Most pattern formatters do not use location information. When they do they should return true here
72 * so that the logging system can efficiently capture it.
73 * @return true if location information is required.
74 */
75 public boolean requiresLocation() {
76 return converter instanceof LocationAware && ((LocationAware) converter).requiresLocation();
77 }
78
79 /**
80 * Returns a String suitable for debugging.
81 *
82 * @return a String suitable for debugging.
83 */
84 @Override
85 public String toString() {
86 final StringBuilder sb = new StringBuilder();
87 sb.append(super.toString());
88 sb.append("[converter=");
89 sb.append(converter);
90 sb.append(", field=");
91 sb.append(field);
92 sb.append(']');
93 return sb.toString();
94 }
95 }