/******************************************************************************* | |
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved. | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* Oracle - initial API and implementation from Oracle TopLink | |
******************************************************************************/ | |
package org.eclipse.persistence.logging; | |
import java.util.logging.SimpleFormatter; | |
import java.util.logging.LogRecord; | |
import java.util.logging.Level; | |
import java.io.*; | |
import java.text.*; | |
import java.util.Date; | |
import org.eclipse.persistence.internal.security.*; | |
/** | |
* <p> | |
* Print a brief summary of a TopLink LogRecord in a human readable | |
* format. The summary will typically be 1 or 2 lines. | |
* </p> | |
*/ | |
public class LogFormatter extends SimpleFormatter { | |
Date dat = new Date(); | |
private final static String format = "{0,date} {0,time}"; | |
private MessageFormat formatter; | |
private Object[] args = new Object[1]; | |
// Line separator string. This is the value of the line.separator | |
// property at the moment that the SimpleFormatter was created. | |
private String lineSeparator = PrivilegedAccessHelper.getLineSeparator(); | |
/** | |
* Format the given LogRecord. | |
* @param record the log record to be formatted. | |
* @return a formatted log record | |
*/ | |
public synchronized String format(LogRecord record0) { | |
if (!(record0 instanceof EclipseLinkLogRecord)) { | |
return super.format(record0); | |
} else { | |
EclipseLinkLogRecord record = (EclipseLinkLogRecord)record0; | |
StringBuffer sb = new StringBuffer(); | |
if (record.shouldPrintDate()) { | |
// Minimize memory allocations here. | |
dat.setTime(record.getMillis()); | |
args[0] = dat; | |
StringBuffer text = new StringBuffer(); | |
if (formatter == null) { | |
formatter = new MessageFormat(format); | |
} | |
formatter.format(args, text, null); | |
sb.append(text); | |
sb.append(" "); | |
} | |
if (record.getSourceClassName() != null) { | |
sb.append(record.getSourceClassName()); | |
} else { | |
sb.append(record.getLoggerName()); | |
} | |
if (record.getSourceMethodName() != null) { | |
sb.append(" "); | |
sb.append(record.getSourceMethodName()); | |
} | |
if (record.getSessionString() != null) { | |
sb.append(" "); | |
sb.append(record.getSessionString()); | |
} | |
if (record.getConnection() != null) { | |
sb.append(" "); | |
sb.append(AbstractSessionLog.CONNECTION_STRING + "(" + String.valueOf(System.identityHashCode(record.getConnection())) + ")"); | |
} | |
if (record.shouldPrintThread()) { | |
sb.append(" "); | |
sb.append(AbstractSessionLog.THREAD_STRING + "(" + String.valueOf(record.getThreadID()) + ")"); | |
} | |
sb.append(lineSeparator); | |
String message = formatMessage(record); | |
sb.append(record.getLevel().getLocalizedName()); | |
sb.append(": "); | |
sb.append(message); | |
sb.append(lineSeparator); | |
if (record.getThrown() != null) { | |
try { | |
StringWriter sw = new StringWriter(); | |
PrintWriter pw = new PrintWriter(sw); | |
if (record.getLevel().intValue() == Level.SEVERE.intValue()) { | |
record.getThrown().printStackTrace(pw); | |
} else if (record.getLevel().intValue() <= Level.WARNING.intValue()) { | |
if (record.shouldLogExceptionStackTrace()) { | |
record.getThrown().printStackTrace(pw); | |
} else { | |
pw.write(record.getThrown().toString()); | |
pw.write(lineSeparator); | |
} | |
} | |
pw.close(); | |
sb.append(sw.toString()); | |
} catch (Exception ex) { | |
} | |
} | |
return sb.toString(); | |
} | |
} | |
} |