/*
* Copyright (C) 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.common.client.logging.formatters;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;
import org.jboss.errai.common.client.logging.util.StringFormat;
/**
* Emulates the behaviour of {@link SimpleFormatter}, but the format string is
* stored as a JSNI value.
*
* @see ErraiSimpleFormatter#setSimpleFormatString(String)
* @author Max Barkley <mbarkley@redhat.com>
*/
public class ErraiSimpleFormatter extends Formatter {
public static final String defaultFormat = "%1$tH:%1$tM:%1$tS %4$s [%3$s] %5$s";
private Date date;
private String customFormat;
public ErraiSimpleFormatter() {
date = new Date();
}
public ErraiSimpleFormatter(String customFormat) {
this();
this.customFormat = customFormat;
}
@Override
public synchronized String format(LogRecord record) {
date.setTime(record.getMillis());
// Get simple class name of logger
String name = record.getLoggerName().substring(Math.max(record.getLoggerName().lastIndexOf(".") + 1, 0));
Object thrown = (record.getThrown() != null) ? record.getThrown() : "";
return StringFormat.format(getSimpleFormatString(customFormat), date, record.getLoggerName(), name, record
.getLevel().getName(), record.getMessage(), thrown);
}
/**
* Set the value for the format string used by all
* {@link ErraiSimpleFormatter} instances. The provided format string is
* called with {@link StringFormat} like so:
*
* <pre>
* {@code StringFormat.format(formatString, date, fullLoggerName, simpleLoggerName, level, throwable)}
* </pre>
*
* The parameters are as follows:
* <ul>
* <li>{@code formatString}: the format string (see
* {@link StringFormat#format(String, Object...)} for details).</li>
* <li>{@code date}: the log date, either a {@link Long} or {@code Date}.</li>
* <li>{@code fullLoggerName}: the full name of the logger.</li>
* <li>{@code simpleLoggerName}: a substring of the full logger name, starting
* after the last '.', or the full name if no '.' occurs (i.e. "a.b.c" -->
* "c", "abc" --> "abc").</li>
* <li>{@code level}: the level of the this log entry (i.e. TRACE, DEBUG,
* INFO, WARN, ERROR).</li>
* <li>{@code throwable}: the {@code throwable} accompanying this log entry,
* or {@code null} if none provided.</li>
* </ul>
* The call to {@link StringFormat#format(String, Object...)} is designed to
* mimic the call to {@link String#format(String, Object...)} in
* {@link SimpleFormatter}, however there are some differences. Please see
* {@link StringFormat#format(String, Object...)} for details.
*
* @param format
* The format string for used by all {@link ErraiSimpleFormatter} instances.
*/
public static native void setSimpleFormatString(String format) /*-{
if (format == null) {
$wnd.erraiSimpleFormatString = null;
}
else {
$wnd.erraiSimpleFormatString = format;
}
}-*/;
/**
* @return The global format string.
* @see ErraiSimpleFormatter#setSimpleFormatString(String)
*/
public static native String getSimpleFormatString() /*-{
if ($wnd.erraiSimpleFormatString === null || $wnd.erraiSimpleFormatString === undefined
|| $wnd.erraiSimpleFormatString.length === 0) {
return "";
}
else {
return $wnd.erraiSimpleFormatString;
}
}-*/;
/**
* @param customFormat
* the custom format provided when creating this formatter (see
* {@link ErraiSimpleFormatter#ErraiSimpleFormatter(String)})
* @return The custom format string, if provided, otherwise the global format
* string, or default format if no global format has been set.
*/
public String getSimpleFormatString(String customFormat) {
if (customFormat != null) {
return customFormat;
}
String retVal = getSimpleFormatString();
return (!retVal.equals("")) ? retVal : defaultFormat;
}
}