001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache license, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the license for the specific language governing permissions and
015 * limitations under the license.
016 */
017 package org.apache.logging.log4j.status;
018
019 import java.io.ByteArrayOutputStream;
020 import java.io.PrintStream;
021 import java.io.Serializable;
022 import java.text.SimpleDateFormat;
023 import java.util.Date;
024
025 import org.apache.logging.log4j.Level;
026 import org.apache.logging.log4j.message.Message;
027
028 /**
029 * The Status data.
030 */
031 public class StatusData implements Serializable {
032 private static final long serialVersionUID = -4341916115118014017L;
033
034 private final long timestamp;
035 private final StackTraceElement caller;
036 private final Level level;
037 private final Message msg;
038 private final Throwable throwable;
039
040 /**
041 * Creates the StatusData object.
042 * @param caller The method that created the event.
043 * @param level The logging level.
044 * @param msg The message String.
045 * @param t The Error or Exception that occurred.
046 */
047 public StatusData(final StackTraceElement caller, final Level level, final Message msg, final Throwable t) {
048 this.timestamp = System.currentTimeMillis();
049 this.caller = caller;
050 this.level = level;
051 this.msg = msg;
052 this.throwable = t;
053 }
054
055 /**
056 * Returns the event's timestamp.
057 * @return The event's timestamp.
058 */
059 public long getTimestamp() {
060 return timestamp;
061 }
062
063 /**
064 * Returns the StackTraceElement for the method that created the event.
065 * @return The StackTraceElement.
066 */
067 public StackTraceElement getStackTraceElement() {
068 return caller;
069 }
070
071 /**
072 * Returns the logging level for the event.
073 * @return The logging level.
074 */
075 public Level getLevel() {
076 return level;
077 }
078
079 /**
080 * Returns the message associated with the event.
081 * @return The message associated with the event.
082 */
083 public Message getMessage() {
084 return msg;
085 }
086
087 /**
088 * Returns the Throwable associated with the event.
089 * @return The Throwable associated with the event.
090 */
091 public Throwable getThrowable() {
092 return throwable;
093 }
094
095 /**
096 * Formats the StatusData for viewing.
097 * @return The formatted status data as a String.
098 */
099 public String getFormattedStatus() {
100 final StringBuilder sb = new StringBuilder();
101 final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
102 sb.append(format.format(new Date(timestamp)));
103 sb.append(' ');
104 sb.append(level.toString());
105 sb.append(' ');
106 sb.append(msg.getFormattedMessage());
107 final Object[] params = msg.getParameters();
108 Throwable t;
109 if (throwable == null && params != null && params[params.length - 1] instanceof Throwable) {
110 t = (Throwable) params[params.length - 1];
111 } else {
112 t = throwable;
113 }
114 if (t != null) {
115 sb.append(' ');
116 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
117 t.printStackTrace(new PrintStream(baos));
118 sb.append(baos.toString());
119 }
120 return sb.toString();
121 }
122 }