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