151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
31cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util.logging;
2847f3c98d3c706c02c898cd15fbe6ee19d840c2c6Piotr Jastrzebskiimport dalvik.system.VMStack;
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.*;
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.atomic.AtomicInteger;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.atomic.AtomicLong;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * LogRecord objects are used to pass logging requests between
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the logging framework and individual log Handlers.
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * When a LogRecord is passed into the logging framework it
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * logically belongs to the framework and should no longer be
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used or updated by the client application.
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Note that if the client application has not specified an
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * explicit source method name and source class name, then the
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * LogRecord class will infer them automatically when they are
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * first accessed (due to a call on getSourceMethodName or
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * getSourceClassName) by analyzing the call stack.  Therefore,
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if a logging Handler wants to pass off a LogRecord to another
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * thread, or to transmit it over RMI, and if it wishes to subsequently
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * obtain method name or class name information it should call
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * one of getSourceClassName or getSourceMethodName to force
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the values to be filled in.
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <b> Serialization notes:</b>
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ul>
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>The LogRecord class is serializable.
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li> Because objects in the parameters array may not be serializable,
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * during serialization all objects in the parameters array are
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * written as the corresponding Strings (using Object.toString).
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li> The ResourceBundle is not transmitted as part of the serialized
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * form, but the resource bundle name is, and the recipient object's
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * readObject method will attempt to locate a suitable resource bundle.
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul>
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class LogRecord implements java.io.Serializable {
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final AtomicLong globalSequenceNumber
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        = new AtomicLong(0);
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The default value of threadID will be the current thread's
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * thread id, for ease of correlation, unless it is greater than
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * MIN_SEQUENTIAL_THREAD_ID, in which case we try harder to keep
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * our promise to keep threadIDs unique by avoiding collisions due
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to 32-bit wraparound.  Unfortunately, LogRecord.getThreadID()
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returns int, while Thread.getId() returns long.
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int MIN_SEQUENTIAL_THREAD_ID = Integer.MAX_VALUE / 2;
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final AtomicInteger nextThreadId
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        = new AtomicInteger(MIN_SEQUENTIAL_THREAD_ID);
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final ThreadLocal<Integer> threadIds = new ThreadLocal<>();
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Logging message level
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private Level level;
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Sequence number
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private long sequenceNumber;
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Class that issued logging call
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String sourceClassName;
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Method that issued logging call
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String sourceMethodName;
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Non-localized raw message text
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String message;
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Thread ID for thread that issued logging call.
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int threadID;
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Event time in milliseconds since 1970
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private long millis;
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial The Throwable (if any) associated with log message
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private Throwable thrown;
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Name of the source Logger.
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String loggerName;
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serial Resource bundle name to localized log message.
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String resourceBundleName;
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private transient boolean needToInferCaller;
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private transient Object parameters[];
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private transient ResourceBundle resourceBundle;
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the default value for a new LogRecord's threadID.
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int defaultThreadID() {
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        long tid = Thread.currentThread().getId();
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (tid < MIN_SEQUENTIAL_THREAD_ID) {
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return (int) tid;
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Integer id = threadIds.get();
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (id == null) {
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                id = nextThreadId.getAndIncrement();
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                threadIds.set(id);
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return id;
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Construct a LogRecord with the given level and message values.
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The sequence property will be initialized with a new unique value.
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * These sequence values are allocated in increasing order within a VM.
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The millis property will be initialized to the current time.
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The thread ID property will be initialized with a unique ID for
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the current thread.
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * All other properties will be initialized to "null".
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param level  a logging level value
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param msg  the raw non-localized logging message (may be null)
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public LogRecord(Level level, String msg) {
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Make sure level isn't null, by calling random method.
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        level.getClass();
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.level = level;
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        message = msg;
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Assign a thread ID and a unique sequence number.
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sequenceNumber = globalSequenceNumber.getAndIncrement();
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        threadID = defaultThreadID();
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        millis = System.currentTimeMillis();
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        needToInferCaller = true;
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski   }
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the source Logger's name.
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return source logger name (may be null)
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String getLoggerName() {
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return loggerName;
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the source Logger's name.
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param name   the source logger name (may be null)
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setLoggerName(String name) {
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        loggerName = name;
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the localization resource bundle
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This is the ResourceBundle that should be used to localize
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the message string before formatting it.  The result may
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be null if the message is not localizable, or if no suitable
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * ResourceBundle is available.
2134ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak     * @return the localization resource bundle
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public ResourceBundle getResourceBundle() {
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return resourceBundle;
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the localization resource bundle.
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param bundle  localization bundle (may be null)
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setResourceBundle(ResourceBundle bundle) {
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        resourceBundle = bundle;
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the localization resource bundle name
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This is the name for the ResourceBundle that should be
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * used to localize the message string before formatting it.
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The result may be null if the message is not localizable.
2344ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak     * @return the localization resource bundle name
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String getResourceBundleName() {
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return resourceBundleName;
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the localization resource bundle name.
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param name  localization bundle name (may be null)
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setResourceBundleName(String name) {
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        resourceBundleName = name;
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the logging message level, for example Level.SEVERE.
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the logging message level
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Level getLevel() {
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return level;
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the logging message level, for example Level.SEVERE.
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param level the logging message level
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setLevel(Level level) {
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (level == null) {
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NullPointerException();
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.level = level;
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the sequence number.
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sequence numbers are normally assigned in the LogRecord
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * constructor, which assigns unique sequence numbers to
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * each new LogRecord in increasing order.
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the sequence number
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public long getSequenceNumber() {
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sequenceNumber;
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the sequence number.
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sequence numbers are normally assigned in the LogRecord constructor,
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * so it should not normally be necessary to use this method.
2854ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak     * @param seq the sequence number
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setSequenceNumber(long seq) {
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sequenceNumber = seq;
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the  name of the class that (allegedly) issued the logging request.
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Note that this sourceClassName is not verified and may be spoofed.
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This information may either have been provided as part of the
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * logging call, or it may have been inferred automatically by the
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * logging framework.  In the latter case, the information may only
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be approximate and may in fact describe an earlier call on the
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * stack frame.
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * May be null if no information could be obtained.
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the source class name
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String getSourceClassName() {
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (needToInferCaller) {
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            inferCaller();
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sourceClassName;
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the name of the class that (allegedly) issued the logging request.
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param sourceClassName the source class name (may be null)
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setSourceClassName(String sourceClassName) {
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.sourceClassName = sourceClassName;
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        needToInferCaller = false;
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the  name of the method that (allegedly) issued the logging request.
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Note that this sourceMethodName is not verified and may be spoofed.
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This information may either have been provided as part of the
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * logging call, or it may have been inferred automatically by the
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * logging framework.  In the latter case, the information may only
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be approximate and may in fact describe an earlier call on the
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * stack frame.
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * May be null if no information could be obtained.
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the source method name
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String getSourceMethodName() {
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (needToInferCaller) {
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            inferCaller();
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sourceMethodName;
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the name of the method that (allegedly) issued the logging request.
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param sourceMethodName the source method name (may be null)
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setSourceMethodName(String sourceMethodName) {
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.sourceMethodName = sourceMethodName;
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        needToInferCaller = false;
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the "raw" log message, before localization or formatting.
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * May be null, which is equivalent to the empty string "".
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This message may be either the final text or a localization key.
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * During formatting, if the source logger has a localization
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * ResourceBundle and if that ResourceBundle has an entry for
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this message string, then the message string is replaced
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the localized value.
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the raw message string
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String getMessage() {
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return message;
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the "raw" log message, before localization or formatting.
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param message the raw message string (may be null)
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setMessage(String message) {
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.message = message;
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get the parameters to the log message.
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the log message parameters.  May be null if
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                  there are no parameters.
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Object[] getParameters() {
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return parameters;
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set the parameters to the log message.
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param parameters the log message parameters. (may be null)
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setParameters(Object parameters[]) {
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.parameters = parameters;
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get an identifier for the thread where the message originated.
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This is a thread identifier within the Java VM and may or
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * may not map to any operating system ID.
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return thread ID
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getThreadID() {
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return threadID;
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set an identifier for the thread where the message originated.
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param threadID  the thread ID
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setThreadID(int threadID) {
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.threadID = threadID;
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get event time in milliseconds since 1970.
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return event time in millis since 1970
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public long getMillis() {
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return millis;
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set event time.
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param millis event time in millis since 1970
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setMillis(long millis) {
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.millis = millis;
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Get any throwable associated with the log record.
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * If the event involved an exception, this will be the
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * exception object. Otherwise null.
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a throwable
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Throwable getThrown() {
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return thrown;
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Set a throwable associated with the log event.
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param thrown  a throwable (may be null)
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setThrown(Throwable thrown) {
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.thrown = thrown;
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final long serialVersionUID = 5372048053134512534L;
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serialData Default fields, followed by a two byte version number
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * (major byte, followed by minor byte), followed by information on
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the log record parameter array.  If there is no parameter array,
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * then -1 is written.  If there is a parameter array (possible of zero
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * length) then the array length is written as an integer, followed
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by String values for each parameter.  If a parameter is null, then
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * a null String is written.  Otherwise the output of Object.toString()
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is written.
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void writeObject(ObjectOutputStream out) throws IOException {
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // We have to call defaultWriteObject first.
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        out.defaultWriteObject();
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Write our version number.
47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        out.writeByte(1);
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        out.writeByte(0);
47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (parameters == null) {
47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            out.writeInt(-1);
47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return;
48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        out.writeInt(parameters.length);
48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Write string values for the parameters.
48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < parameters.length; i++) {
48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (parameters[i] == null) {
48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                out.writeObject(null);
48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                out.writeObject(parameters[i].toString());
48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void readObject(ObjectInputStream in)
49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        throws IOException, ClassNotFoundException {
49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // We have to call defaultReadObject first.
49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        in.defaultReadObject();
49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Read version number.
49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        byte major = in.readByte();
49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        byte minor = in.readByte();
50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (major != 1) {
50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IOException("LogRecord: bad version: " + major + "." + minor);
50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int len = in.readInt();
5041cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak        if (len < -1) {
5051cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak            throw new NegativeArraySizeException();
5061cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak        } else if (len == -1) {
50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            parameters = null;
5081cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak        } else if (len < 255) {
50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            parameters = new Object[len];
51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            for (int i = 0; i < parameters.length; i++) {
51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                parameters[i] = in.readObject();
51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
5131cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak        } else {
5141cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak            List<Object> params = new ArrayList<>(Math.min(len, 1024));
5151cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak            for (int i = 0; i < len; i++) {
5161cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak                params.add(in.readObject());
5171cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak            }
5181cfadde2152806a52c5c7e68d0d028160d89edc7Przemyslaw Szczepaniak            parameters = params.toArray(new Object[params.size()]);
51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If necessary, try to regenerate the resource bundle.
52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (resourceBundleName != null) {
52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            try {
5234ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak                // use system class loader to ensure the ResourceBundle
5244ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak                // instance is a different instance than null loader uses
5254ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak                final ResourceBundle bundle =
5264ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak                        ResourceBundle.getBundle(resourceBundleName,
5274ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak                                Locale.getDefault(),
5284ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak                                ClassLoader.getSystemClassLoader());
5294ff539dbc5a809ef3eacbe2d9f2b97f640b7e9cfPrzemyslaw Szczepaniak                resourceBundle = bundle;
53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } catch (MissingResourceException ex) {
53107c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                try {
53207c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                    resourceBundle = ResourceBundle.getBundle(resourceBundleName, Locale.getDefault(),
53307c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                            Thread.currentThread().getContextClassLoader());
53407c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                } catch (MissingResourceException innerE){
53507c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                    // This is not a good place to throw an exception,
53607c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                    // so we simply leave the resourceBundle null.
53707c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                    resourceBundle = null;
53807c4a0eab5348a975ea278d17afdd608270d0f53Shubham Ajmera                }
53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        needToInferCaller = false;
54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Private method to infer the caller's class and method names
54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void inferCaller() {
54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        needToInferCaller = false;
54847f3c98d3c706c02c898cd15fbe6ee19d840c2c6Piotr Jastrzebski        // Android-changed: Use VMStack.getThreadStackTrace.
54947f3c98d3c706c02c898cd15fbe6ee19d840c2c6Piotr Jastrzebski        StackTraceElement[] stack = VMStack.getThreadStackTrace(Thread.currentThread());
55047f3c98d3c706c02c898cd15fbe6ee19d840c2c6Piotr Jastrzebski        int depth = stack.length;
55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        boolean lookingForLogger = true;
55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int ix = 0; ix < depth; ix++) {
55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // Calling getStackTraceElement directly prevents the VM
55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // from paying the cost of building the entire stack frame.
55647f3c98d3c706c02c898cd15fbe6ee19d840c2c6Piotr Jastrzebski            //
55747f3c98d3c706c02c898cd15fbe6ee19d840c2c6Piotr Jastrzebski            // Android-changed: Use value from getThreadStackTrace.
55847f3c98d3c706c02c898cd15fbe6ee19d840c2c6Piotr Jastrzebski            StackTraceElement frame = stack[ix];
55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            String cname = frame.getClassName();
56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            boolean isLoggerImpl = isLoggerImplFrame(cname);
56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (lookingForLogger) {
56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // Skip all frames until we have found the first logger frame.
56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (isLoggerImpl) {
56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    lookingForLogger = false;
56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            } else {
56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (!isLoggerImpl) {
56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    // skip reflection call
56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (!cname.startsWith("java.lang.reflect.") && !cname.startsWith("sun.reflect.")) {
57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                       // We've found the relevant frame.
57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                       setSourceClassName(cname);
57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                       setSourceMethodName(frame.getMethodName());
57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                       return;
57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // We haven't found a suitable frame, so just punt.  This is
57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // OK as we are only committed to making a "best effort" here.
58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private boolean isLoggerImplFrame(String cname) {
58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // the log record could be created for a platform logger
58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (cname.equals("java.util.logging.Logger") ||
58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                cname.startsWith("java.util.logging.LoggingProxyImpl") ||
58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                cname.startsWith("sun.util.logging."));
58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
589