ceki 2002/10/21 16:20:34 Modified: src/java/org/apache/log4j/spi LoggingEvent.java Log: Another formatting test. Tabs turned off this time. Revision Changes Path 1.34 +372 -372 jakarta-log4j/src/java/org/apache/log4j/spi/LoggingEvent.java Index: LoggingEvent.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/spi/LoggingEvent.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- LoggingEvent.java 21 Oct 2002 23:02:48 -0000 1.33 +++ LoggingEvent.java 21 Oct 2002 23:20:34 -0000 1.34 @@ -34,379 +34,379 @@ @since 0.8.2 */ public class LoggingEvent implements java.io.Serializable { - private static long startTime = System.currentTimeMillis(); + private static long startTime = System.currentTimeMillis(); - /** Fully qualified name of the calling category class. */ - transient public final String fqnOfCategoryClass; + /** Fully qualified name of the calling category class. */ + transient public final String fqnOfCategoryClass; - /** - * The category of the logging event. This field is not serialized - * for performance reasons. - * - * <p>It is set by the LoggingEvent constructor or set by a remote - * entity after deserialization. - * - * @deprecated This field will be marked as private or be completely - * removed in future releases. Please do not use it. - * */ - transient private Category logger; - - /** - * <p>The category (logger) name. - * - * @deprecated This field will be marked as private in future - * releases. Please do not access it directly. Use the {@link - * #getLoggerName} method instead. - - * */ - final public String categoryName; - - /** - * Level of logging event. Level cannot be serializable because it - * is a flyweight. Due to its special seralization it cannot be - * declared final either. - * - * <p> This field should not be accessed directly. You shoud use the - * {@link #getLevel} method instead. - * - * @deprecated This field will be marked as private in future - * releases. Please do not access it directly. Use the {@link - * #getLevel} method instead. - * */ - transient public Priority level; - - /** The nested diagnostic context (NDC) of logging event. */ - private String ndc; - - /** The mapped diagnostic context (MDC) of logging event. */ - private Hashtable mdcCopy; - - /** Have we tried to do an NDC lookup? If we did, there is no need - * to do it again. Note that its value is always false when - * serialized. Thus, a receiving SocketNode will never use it's own - * (incorrect) NDC. See also writeObject method. */ - private boolean ndcLookupRequired = true; - - /** Have we tried to do an MDC lookup? If we did, there is no need - * to do it again. Note that its value is always false when - * serialized. See also the getMDC and getMDCCopy methods. */ - private boolean mdcCopyLookupRequired = true; - - /** The application supplied message of logging event. */ - transient private Object message; - - /** The application supplied message rendered through the log4j - objet rendering mechanism.*/ - private String renderedMessage; - - /** The name of thread in which this logging event was generated. */ - private String threadName; - - /** This - variable contains information about this event's throwable - */ - private ThrowableInformation throwableInfo; - - /** The number of milliseconds elapsed from 1/1/1970 until logging event - was created. */ - public final long timeStamp; - /** Location information for the caller. */ - private LocationInfo locationInfo; - - // Serialization - static final long serialVersionUID = -868428216207166145L; - - static final Integer[] PARAM_ARRAY = new Integer[1]; - static final String TO_LEVEL = "toLevel"; - static final Class[] TO_LEVEL_PARAMS = new Class[] { int.class }; - static final Hashtable methodCache = new Hashtable(3); // use a tiny table - - /** - Instantiate a LoggingEvent from the supplied parameters. - - <p>Except {@link #timeStamp} all the other fields of - <code>LoggingEvent</code> are filled when actually needed. - <p> - @param category The category of this event. - @param level The level of this event. - @param message The message of this event. - @param throwable The throwable of this event. */ - public LoggingEvent( - String fqnOfCategoryClass, - Category logger, - Priority priority, - Object message, - Throwable throwable) { - this.fqnOfCategoryClass = fqnOfCategoryClass; - this.logger = logger; - this.categoryName = logger.getName(); - this.level = priority; - this.message = message; - if (throwable != null) { - this.throwableInfo = new ThrowableInformation(throwable); - } - timeStamp = System.currentTimeMillis(); - } - - /** - Instantiate a LoggingEvent from the supplied parameters. - - <p>Except {@link #timeStamp} all the other fields of - <code>LoggingEvent</code> are filled when actually needed. - <p> - @param category The category of this event. - @param timeStamp the timestamp of this logging event - @param level The level of this event. - @param message The message of this event. - @param throwable The throwable of this event. */ - public LoggingEvent( - String fqnOfCategoryClass, - Category logger, - long timeStamp, - Priority priority, - Object message, - Throwable throwable) { - this.fqnOfCategoryClass = fqnOfCategoryClass; - this.logger = logger; - this.categoryName = logger.getName(); - this.level = priority; - this.message = message; - if (throwable != null) { - this.throwableInfo = new ThrowableInformation(throwable); - } - - this.timeStamp = timeStamp; - } - - /** - Set the location information for this logging event. The collected - information is cached for future use. - */ - public LocationInfo getLocationInformation() { - if (locationInfo == null) { - locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass); - } - return locationInfo; - } - - /** - * Return the level of this event. Use this form instead of directly - * accessing the <code>level</code> field. */ - public Level getLevel() { - return (Level) level; - } - - /** - * Return the name of the logger. Use this form instead of directly - * accessing the <code>categoryName</code> field. - */ - public String getLoggerName() { - return categoryName; - } - - /** - Return the message for this logging event. - - <p>Before serialization, the returned object is the message - passed by the user to generate the logging event. After - serialization, the returned value equals the String form of the - message possibly after object rendering. - - @since 1.1 */ - public Object getMessage() { - if (message != null) { - return message; - } else { - return getRenderedMessage(); - } - } - - /** - * This method returns the NDC for this event. It will return the - * correct content even if the event was generated in a different - * thread or even on a different machine. The {@link NDC#get} method - * should <em>never</em> be called directly. */ - public String getNDC() { - if (ndcLookupRequired) { - ndcLookupRequired = false; - ndc = NDC.get(); - } - return ndc; - } - - /** - Returns the the context corresponding to the <code>key</code> - parameter. If there is a local MDC copy, possibly because we are - in a logging server or running inside AsyncAppender, then we - search for the key in MDC copy, if a value is found it is - returned. Otherwise, if the search in MDC copy returns a null - result, then the current thread's <code>MDC</code> is used. - - <p>Note that <em>both</em> the local MDC copy and the current - thread's MDC are searched. - - */ - public Object getMDC(String key) { - Object r; - // Note the mdcCopy is used if it exists. Otherwise we use the MDC - // that is associated with the thread. - if (mdcCopy != null) { - r = mdcCopy.get(key); - if (r != null) { - return r; - } - } - return MDC.get(key); - } - - /** - Obtain a copy of this thread's MDC prior to serialization or - asynchronous logging. - */ - public void getMDCCopy() { - if (mdcCopyLookupRequired) { - mdcCopyLookupRequired = false; - // the clone call is required for asynchronous logging. - // See also bug #5932. - Hashtable t = (Hashtable) MDC.getContext(); - if (t != null) { - mdcCopy = (Hashtable) t.clone(); - } - } - } - - public String getRenderedMessage() { - if (renderedMessage == null && message != null) { - if (message instanceof String) - renderedMessage = (String) message; - else { - LoggerRepository repository = logger.getHierarchy(); - - if (repository instanceof RendererSupport) { - RendererSupport rs = (RendererSupport) repository; - renderedMessage = rs.getRendererMap().findAndRender(message); - } else { - renderedMessage = message.toString(); - } - } - } - return renderedMessage; - } - - /** - Returns the time when the application started, in milliseconds - elapsed since 01.01.1970. */ - public static long getStartTime() { - return startTime; - } - - public String getThreadName() { - if (threadName == null) - threadName = (Thread.currentThread()).getName(); - return threadName; - } - - /** - Returns the throwable information contained within this - event. May be <code>null</code> if there is no such information. - - <p>Note that the {@link Throwable} object contained within a - {@link ThrowableInformation} does not survive serialization. - - @since 1.1 */ - public ThrowableInformation getThrowableInformation() { - return throwableInfo; - } - - /** - Return this event's throwable's string[] representaion. - */ - public String[] getThrowableStrRep() { - - if (throwableInfo == null) - return null; - else - return throwableInfo.getThrowableStrRep(); - } - - private void readLevel(ObjectInputStream ois) - throws java.io.IOException, ClassNotFoundException { - - int p = ois.readInt(); - try { - String className = (String) ois.readObject(); - if (className == null) { - level = Level.toLevel(p); - } else { - Method m = (Method) methodCache.get(className); - if (m == null) { - Class clazz = Loader.loadClass(className); - // Note that we use Class.getDeclaredMethod instead of - // Class.getMethod. This assumes that the Level subclass - // implements the toLevel(int) method which is a - // requirement. Actually, it does not make sense for Level - // subclasses NOT to implement this method. Also note that - // only Level can be subclassed and not Priority. - m = clazz.getDeclaredMethod(TO_LEVEL, TO_LEVEL_PARAMS); - methodCache.put(className, m); - } - PARAM_ARRAY[0] = new Integer(p); - level = (Level) m.invoke(null, PARAM_ARRAY); - } - } catch (Exception e) { - LogLog.warn("Level deserialization failed, reverting to default.", e); - level = Level.toLevel(p); - } - } - - private void readObject(ObjectInputStream ois) - throws java.io.IOException, ClassNotFoundException { - ois.defaultReadObject(); - readLevel(ois); - - // Make sure that no location info is available to Layouts - if (locationInfo == null) - locationInfo = new LocationInfo(null, null); - } - - private void writeObject(ObjectOutputStream oos) throws java.io.IOException { - // Aside from returning the current thread name the wgetThreadName - // method sets the threadName variable. - this.getThreadName(); - - // This sets the renders the message in case it wasn't up to now. - this.getRenderedMessage(); - - // This call has a side effect of setting this.ndc and - // setting ndcLookupRequired to false if not already false. - this.getNDC(); - - // This call has a side effect of setting this.mdcCopy and - // setting mdcLookupRequired to false if not already false. - this.getMDCCopy(); - - // This sets the throwable sting representation of the event throwable. - this.getThrowableStrRep(); - - oos.defaultWriteObject(); - - // serialize this event's level - writeLevel(oos); - } - - private void writeLevel(ObjectOutputStream oos) throws java.io.IOException { - - oos.writeInt(level.toInt()); - - Class clazz = level.getClass(); - if (clazz == Level.class) { - oos.writeObject(null); - } else { - // writing directly the Class object would be nicer, except that - // serialized a Class object can not be read back by JDK - // 1.1.x. We have to resort to this hack instead. - oos.writeObject(clazz.getName()); - } - } + /** + * The category of the logging event. This field is not serialized + * for performance reasons. + * + * <p>It is set by the LoggingEvent constructor or set by a remote + * entity after deserialization. + * + * @deprecated This field will be marked as private or be completely + * removed in future releases. Please do not use it. + * */ + transient private Category logger; + + /** + * <p>The category (logger) name. + * + * @deprecated This field will be marked as private in future + * releases. Please do not access it directly. Use the {@link + * #getLoggerName} method instead. + + * */ + final public String categoryName; + + /** + * Level of logging event. Level cannot be serializable because it + * is a flyweight. Due to its special seralization it cannot be + * declared final either. + * + * <p> This field should not be accessed directly. You shoud use the + * {@link #getLevel} method instead. + * + * @deprecated This field will be marked as private in future + * releases. Please do not access it directly. Use the {@link + * #getLevel} method instead. + * */ + transient public Priority level; + + /** The nested diagnostic context (NDC) of logging event. */ + private String ndc; + + /** The mapped diagnostic context (MDC) of logging event. */ + private Hashtable mdcCopy; + + /** Have we tried to do an NDC lookup? If we did, there is no need + * to do it again. Note that its value is always false when + * serialized. Thus, a receiving SocketNode will never use it's own + * (incorrect) NDC. See also writeObject method. */ + private boolean ndcLookupRequired = true; + + /** Have we tried to do an MDC lookup? If we did, there is no need + * to do it again. Note that its value is always false when + * serialized. See also the getMDC and getMDCCopy methods. */ + private boolean mdcCopyLookupRequired = true; + + /** The application supplied message of logging event. */ + transient private Object message; + + /** The application supplied message rendered through the log4j + objet rendering mechanism.*/ + private String renderedMessage; + + /** The name of thread in which this logging event was generated. */ + private String threadName; + + /** This + variable contains information about this event's throwable + */ + private ThrowableInformation throwableInfo; + + /** The number of milliseconds elapsed from 1/1/1970 until logging event + was created. */ + public final long timeStamp; + /** Location information for the caller. */ + private LocationInfo locationInfo; + + // Serialization + static final long serialVersionUID = -868428216207166145L; + + static final Integer[] PARAM_ARRAY = new Integer[1]; + static final String TO_LEVEL = "toLevel"; + static final Class[] TO_LEVEL_PARAMS = new Class[] { int.class }; + static final Hashtable methodCache = new Hashtable(3); // use a tiny table + + /** + Instantiate a LoggingEvent from the supplied parameters. + + <p>Except {@link #timeStamp} all the other fields of + <code>LoggingEvent</code> are filled when actually needed. + <p> + @param category The category of this event. + @param level The level of this event. + @param message The message of this event. + @param throwable The throwable of this event. */ + public LoggingEvent( + String fqnOfCategoryClass, + Category logger, + Priority priority, + Object message, + Throwable throwable) { + this.fqnOfCategoryClass = fqnOfCategoryClass; + this.logger = logger; + this.categoryName = logger.getName(); + this.level = priority; + this.message = message; + if (throwable != null) { + this.throwableInfo = new ThrowableInformation(throwable); + } + timeStamp = System.currentTimeMillis(); + } + + /** + Instantiate a LoggingEvent from the supplied parameters. + + <p>Except {@link #timeStamp} all the other fields of + <code>LoggingEvent</code> are filled when actually needed. + <p> + @param category The category of this event. + @param timeStamp the timestamp of this logging event + @param level The level of this event. + @param message The message of this event. + @param throwable The throwable of this event. */ + public LoggingEvent( + String fqnOfCategoryClass, + Category logger, + long timeStamp, + Priority priority, + Object message, + Throwable throwable) { + this.fqnOfCategoryClass = fqnOfCategoryClass; + this.logger = logger; + this.categoryName = logger.getName(); + this.level = priority; + this.message = message; + if (throwable != null) { + this.throwableInfo = new ThrowableInformation(throwable); + } + + this.timeStamp = timeStamp; + } + + /** + Set the location information for this logging event. The collected + information is cached for future use. + */ + public LocationInfo getLocationInformation() { + if (locationInfo == null) { + locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass); + } + return locationInfo; + } + + /** + * Return the level of this event. Use this form instead of directly + * accessing the <code>level</code> field. */ + public Level getLevel() { + return (Level) level; + } + + /** + * Return the name of the logger. Use this form instead of directly + * accessing the <code>categoryName</code> field. + */ + public String getLoggerName() { + return categoryName; + } + + /** + Return the message for this logging event. + + <p>Before serialization, the returned object is the message + passed by the user to generate the logging event. After + serialization, the returned value equals the String form of the + message possibly after object rendering. + + @since 1.1 */ + public Object getMessage() { + if (message != null) { + return message; + } else { + return getRenderedMessage(); + } + } + + /** + * This method returns the NDC for this event. It will return the + * correct content even if the event was generated in a different + * thread or even on a different machine. The {@link NDC#get} method + * should <em>never</em> be called directly. */ + public String getNDC() { + if (ndcLookupRequired) { + ndcLookupRequired = false; + ndc = NDC.get(); + } + return ndc; + } + + /** + Returns the the context corresponding to the <code>key</code> + parameter. If there is a local MDC copy, possibly because we are + in a logging server or running inside AsyncAppender, then we + search for the key in MDC copy, if a value is found it is + returned. Otherwise, if the search in MDC copy returns a null + result, then the current thread's <code>MDC</code> is used. + + <p>Note that <em>both</em> the local MDC copy and the current + thread's MDC are searched. + + */ + public Object getMDC(String key) { + Object r; + // Note the mdcCopy is used if it exists. Otherwise we use the MDC + // that is associated with the thread. + if (mdcCopy != null) { + r = mdcCopy.get(key); + if (r != null) { + return r; + } + } + return MDC.get(key); + } + + /** + Obtain a copy of this thread's MDC prior to serialization or + asynchronous logging. + */ + public void getMDCCopy() { + if (mdcCopyLookupRequired) { + mdcCopyLookupRequired = false; + // the clone call is required for asynchronous logging. + // See also bug #5932. + Hashtable t = (Hashtable) MDC.getContext(); + if (t != null) { + mdcCopy = (Hashtable) t.clone(); + } + } + } + + public String getRenderedMessage() { + if (renderedMessage == null && message != null) { + if (message instanceof String) + renderedMessage = (String) message; + else { + LoggerRepository repository = logger.getHierarchy(); + + if (repository instanceof RendererSupport) { + RendererSupport rs = (RendererSupport) repository; + renderedMessage = rs.getRendererMap().findAndRender(message); + } else { + renderedMessage = message.toString(); + } + } + } + return renderedMessage; + } + + /** + Returns the time when the application started, in milliseconds + elapsed since 01.01.1970. */ + public static long getStartTime() { + return startTime; + } + + public String getThreadName() { + if (threadName == null) + threadName = (Thread.currentThread()).getName(); + return threadName; + } + + /** + Returns the throwable information contained within this + event. May be <code>null</code> if there is no such information. + + <p>Note that the {@link Throwable} object contained within a + {@link ThrowableInformation} does not survive serialization. + + @since 1.1 */ + public ThrowableInformation getThrowableInformation() { + return throwableInfo; + } + + /** + Return this event's throwable's string[] representaion. + */ + public String[] getThrowableStrRep() { + + if (throwableInfo == null) + return null; + else + return throwableInfo.getThrowableStrRep(); + } + + private void readLevel(ObjectInputStream ois) + throws java.io.IOException, ClassNotFoundException { + + int p = ois.readInt(); + try { + String className = (String) ois.readObject(); + if (className == null) { + level = Level.toLevel(p); + } else { + Method m = (Method) methodCache.get(className); + if (m == null) { + Class clazz = Loader.loadClass(className); + // Note that we use Class.getDeclaredMethod instead of + // Class.getMethod. This assumes that the Level subclass + // implements the toLevel(int) method which is a + // requirement. Actually, it does not make sense for Level + // subclasses NOT to implement this method. Also note that + // only Level can be subclassed and not Priority. + m = clazz.getDeclaredMethod(TO_LEVEL, TO_LEVEL_PARAMS); + methodCache.put(className, m); + } + PARAM_ARRAY[0] = new Integer(p); + level = (Level) m.invoke(null, PARAM_ARRAY); + } + } catch (Exception e) { + LogLog.warn("Level deserialization failed, reverting to default.", e); + level = Level.toLevel(p); + } + } + + private void readObject(ObjectInputStream ois) + throws java.io.IOException, ClassNotFoundException { + ois.defaultReadObject(); + readLevel(ois); + + // Make sure that no location info is available to Layouts + if (locationInfo == null) + locationInfo = new LocationInfo(null, null); + } + + private void writeObject(ObjectOutputStream oos) throws java.io.IOException { + // Aside from returning the current thread name the wgetThreadName + // method sets the threadName variable. + this.getThreadName(); + + // This sets the renders the message in case it wasn't up to now. + this.getRenderedMessage(); + + // This call has a side effect of setting this.ndc and + // setting ndcLookupRequired to false if not already false. + this.getNDC(); + + // This call has a side effect of setting this.mdcCopy and + // setting mdcLookupRequired to false if not already false. + this.getMDCCopy(); + + // This sets the throwable sting representation of the event throwable. + this.getThrowableStrRep(); + + oos.defaultWriteObject(); + + // serialize this event's level + writeLevel(oos); + } + + private void writeLevel(ObjectOutputStream oos) throws java.io.IOException { + + oos.writeInt(level.toInt()); + + Class clazz = level.getClass(); + if (clazz == Level.class) { + oos.writeObject(null); + } else { + // writing directly the Class object would be nicer, except that + // serialized a Class object can not be read back by JDK + // 1.1.x. We have to resort to this hack instead. + oos.writeObject(clazz.getName()); + } + } }
-- To unsubscribe, e-mail: <mailto:log4j-dev-unsubscribe@;jakarta.apache.org> For additional commands, e-mail: <mailto:log4j-dev-help@;jakarta.apache.org>