    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    }