blob: b8ab25a19913b1c64cbc38f73b4d413a58491482 [file] [log] [blame]
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software
* License version 1.1, a copy of which has been included with this
* distribution in the LICENSE.txt file.
*/
package org.apache.log4j.lf5;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* LogRecord. A LogRecord encapsulates the details of your desired log
* request.
*
* @author Michael J. Sikorsky
* @author Robert Shaw
*/
// Contributed by ThoughtWorks Inc.
public abstract class LogRecord implements java.io.Serializable {
//--------------------------------------------------------------------------
// Constants:
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// Protected Variables:
//--------------------------------------------------------------------------
protected static long _seqCount = 0;
protected LogLevel _level;
protected String _message;
protected long _sequenceNumber;
protected long _millis;
protected String _category;
protected String _thread;
protected String _thrownStackTrace;
protected Throwable _thrown;
protected String _ndc;
protected String _location;
//--------------------------------------------------------------------------
// Private Variables:
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// Constructors:
//--------------------------------------------------------------------------
public LogRecord() {
super();
_millis = System.currentTimeMillis();
_category = "Debug";
_message = "";
_level = LogLevel.INFO;
_sequenceNumber = getNextId();
_thread = Thread.currentThread().toString();
_ndc = "";
_location = "";
}
//--------------------------------------------------------------------------
// Public Methods:
//--------------------------------------------------------------------------
/**
* Get the level of this LogRecord.
*
* @return The LogLevel of this record.
* @see #setLevel(LogLevel)
* @see LogLevel
*/
public LogLevel getLevel() {
return (_level);
}
/**
* Set the level of this LogRecord.
*
* @param level The LogLevel for this record.
* @see #getLevel()
* @see LogLevel
*/
public void setLevel(LogLevel level) {
_level = level;
}
/**
* Abstract method. Must be overridden to indicate what log level
* to show in red.
*/
public abstract boolean isSevereLevel();
/**
* @return true if getThrown().toString() is a non-empty string.
*/
public boolean hasThrown() {
Throwable thrown = getThrown();
if (thrown == null) {
return false;
}
String thrownString = thrown.toString();
return thrownString != null && thrownString.trim().length() != 0;
}
/**
* @return true if isSevereLevel() or hasThrown() returns true.
*/
public boolean isFatal() {
return isSevereLevel() || hasThrown();
}
/**
* Get the category asscociated with this LogRecord. For a more detailed
* description of what a category is see setCategory().
*
* @return The category of this record.
* @see #setCategory(String)
*/
public String getCategory() {
return (_category);
}
/**
* Set the category associated with this LogRecord. A category represents
* a hierarchical dot (".") separated namespace for messages.
* The definition of a category is application specific, but a common convention
* is as follows:
*
* <p>
* When logging messages
* for a particluar class you can use its class name:
* com.thoughtworks.framework.servlet.ServletServiceBroker.<br><br>
* Futhermore, to log a message for a particular method in a class
* add the method name:
* com.thoughtworks.framework.servlet.ServletServiceBroker.init().
* </p>
*
* @param category The category for this record.
* @see #getCategory()
*/
public void setCategory(String category) {
_category = category;
}
/**
* Get the message asscociated with this LogRecord.
*
* @return The message of this record.
* @see #setMessage(String)
*/
public String getMessage() {
return (_message);
}
/**
* Set the message associated with this LogRecord.
*
* @param message The message for this record.
* @see #getMessage()
*/
public void setMessage(String message) {
_message = message;
}
/**
* Get the sequence number associated with this LogRecord. Sequence numbers
* are generally assigned when a LogRecord is constructed. Sequence numbers
* start at 0 and increase with each newly constructed LogRocord.
*
* @return The sequence number of this record.
* @see #setSequenceNumber(long)
*/
public long getSequenceNumber() {
return (_sequenceNumber);
}
/**
* Set the sequence number assocsiated with this LogRecord. A sequence number
* will automatically be assigned to evey newly constructed LogRecord, however,
* this method can override the value.
*
* @param number The sequence number.
* @see #getSequenceNumber()
*/
public void setSequenceNumber(long number) {
_sequenceNumber = number;
}
/**
* Get the event time of this record in milliseconds from 1970.
* When a LogRecord is constructed the event time is set but may be
* overridden by calling setMillis();
*
* @return The event time of this record in milliseconds from 1970.
* @see #setMillis(long)
*/
public long getMillis() {
return _millis;
}
/**
* Set the event time of this record. When a LogRecord is constructed
* the event time is set but may be overridden by calling this method.
*
* @param millis The time in milliseconds from 1970.
* @see #getMillis()
*/
public void setMillis(long millis) {
_millis = millis;
}
/**
* Get the thread description asscociated with this LogRecord. When a
* LogRecord is constructed, the thread description is set by calling:
* Thread.currentThread().toString(). You may supply a thread description
* of your own by calling the setThreadDescription(String) method.
*
* @return The thread description of this record.
* @see #setThreadDescription(String)
*/
public String getThreadDescription() {
return (_thread);
}
/**
* Set the thread description associated with this LogRecord. When a
* LogRecord is constructed, the thread description is set by calling:
* Thread.currentThread().toString(). You may supply a thread description
* of your own by calling this method.
*
* @param threadDescription The description of the thread for this record.
* @see #getThreadDescription()
*/
public void setThreadDescription(String threadDescription) {
_thread = threadDescription;
}
/**
* Get the stack trace in a String-based format for the associated Throwable
* of this LogRecord. The stack trace in a String-based format is set
* when the setThrown(Throwable) method is called.
*
* <p>
* Why do we need this method considering that we
* have the getThrown() and setThrown() methods?
* A Throwable object may not be serializable, however, a String representation
* of it is. Users of LogRecords should generally call this method over
* getThrown() for the reasons of serialization.
* </p>
*
* @return The Stack Trace for the asscoiated Throwable of this LogRecord.
* @see #setThrown(Throwable)
* @see #getThrown()
*/
public String getThrownStackTrace() {
return (_thrownStackTrace);
}
/**
* Set the ThrownStackTrace for the log record.
*
* @param trace A String to associate with this LogRecord
* @see #getThrownStackTrace()
*/
public void setThrownStackTrace(String trace) {
_thrownStackTrace = trace;
}
/**
* Get the Throwable associated with this LogRecord.
*
* @return The LogLevel of this record.
* @see #setThrown(Throwable)
* @see #getThrownStackTrace()
*/
public Throwable getThrown() {
return (_thrown);
}
/**
* Set the Throwable associated with this LogRecord. When this method
* is called, the stack trace in a String-based format is made
* available via the getThrownStackTrace() method.
*
* @param thrown A Throwable to associate with this LogRecord.
* @see #getThrown()
* @see #getThrownStackTrace()
*/
public void setThrown(Throwable thrown) {
if (thrown == null) {
return;
}
_thrown = thrown;
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
thrown.printStackTrace(out);
out.flush();
_thrownStackTrace = sw.toString();
try {
out.close();
sw.close();
} catch (IOException e) {
// Do nothing, this should not happen as it is StringWriter.
}
out = null;
sw = null;
}
/**
* Return a String representation of this LogRecord.
*/
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("LogRecord: [" + _level + ", " + _message + "]");
return (buf.toString());
}
/**
* Get the NDC (nested diagnostic context) for this record.
*
* @return The string representing the NDC.
*/
public String getNDC() {
return _ndc;
}
/**
* Set the NDC (nested diagnostic context) for this record.
*
* @param ndc A string representing the NDC.
*/
public void setNDC(String ndc) {
_ndc = ndc;
}
/**
* Get the location in code where this LogRecord originated.
*
* @return The string containing the location information.
*/
public String getLocation() {
return _location;
}
/**
* Set the location in code where this LogRecord originated.
*
* @param location A string containing location information.
*/
public void setLocation(String location) {
_location = location;
}
/**
* Resets that sequence number to 0.
*
*/
public static synchronized void resetSequenceNumber() {
_seqCount = 0;
}
//--------------------------------------------------------------------------
// Protected Methods:
//--------------------------------------------------------------------------
protected static synchronized long getNextId() {
_seqCount++;
return _seqCount;
}
//--------------------------------------------------------------------------
// Private Methods:
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// Nested Top-Level Classes or Interfaces:
//--------------------------------------------------------------------------
}