package org.ovirt.engine.core.logutils; import java.io.CharArrayWriter; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; import java.util.logging.Formatter; import java.util.logging.LogManager; import java.util.logging.LogRecord; /** * Provides ability to log records with different time zone than the default. */ public class TimeZoneBasedFormatter extends Formatter { /** * Log record format specified as string according to {@code java.util.Formatter}. The only exception * is date/time which is defined as string (format of this string is defined in * {@code org.ovirt.engine.core.logutils.TimeZoneBasedFormatter#dateTimeFormat}). * Log record format can be specified using property * {@code org.ovirt.engine.core.logutils.TimeZoneBasedFormatter.recordFormat}. If this property is empty, we use * default format {@code %1$s %4$-7s %5$s%6$s%n} */ private static final String recordFormat = getLoggingProperty( "org.ovirt.engine.core.logutils.TimeZoneBasedFormatter.recordFormat", "%1$s %4$-7s %5$s%6$s%n"); /** * Date/time part format of log record specified as string according to {@code java.text.SimpleDateFormat}. * It can be specified using property * {@code org.ovirt.engine.core.logutils.TimeZoneBasedFormatter.dateTimeFormat}. If this property is empty, we use * default format {@code yyyy-MM-dd HH:mm:ss,SSSX} */ private static final SimpleDateFormat dateTimeFormat = new SimpleDateFormat( getLoggingProperty( "org.ovirt.engine.core.logutils.TimeZoneBasedFormatter.dateTimeFormat", "yyyy-MM-dd HH:mm:ss,SSSX")); /** * Time zone used to format date/time part of the log record. * It can be specified using property * {@code org.ovirt.engine.core.logutils.TimeZoneBasedFormatter.timeZone}. If this property is empty, we use * time zone set in the underlying OS. */ private static final TimeZone timeZone = TimeZone.getTimeZone( getLoggingProperty( "org.ovirt.engine.core.logutils.TimeZoneBasedFormatter.timeZone", TimeZone.getDefault().getID())); public TimeZoneBasedFormatter() { super(); } @Override public synchronized String format(LogRecord record) { final Calendar cal = Calendar.getInstance(); cal.setTimeZone(timeZone); dateTimeFormat.setTimeZone(timeZone); cal.setTimeInMillis(record.getMillis()); String source; if (record.getSourceClassName() != null) { source = record.getSourceClassName(); if (record.getSourceMethodName() != null) { source += " " + record.getSourceMethodName(); } } else { source = record.getLoggerName(); } String message = formatMessage(record); String throwable = ""; if (record.getThrown() != null) { try (CharArrayWriter wr = new CharArrayWriter(1024); PrintWriter pw = new PrintWriter(wr)) { pw.println(); record.getThrown().printStackTrace(pw); throwable = wr.toString(); } } return String.format(recordFormat, dateTimeFormat.format(cal.getTime()), source, record.getLoggerName(), record.getLevel().getName(), message, throwable); } private static String getLoggingProperty(String key, String defaultValue) { String value = LogManager.getLogManager().getProperty(key); return value == null || value.isEmpty() ? defaultValue : value; } }