001/*
002 * Copyright 2015-2018 the original author or authors
003 *
004 * This software is licensed under the Apache License, Version 2.0,
005 * the GNU Lesser General Public License version 2 or later ("LGPL")
006 * and the WTFPL.
007 * You may choose either license to govern your use of this software only
008 * upon the condition that you accept all of the terms of either
009 * the Apache License 2.0, the LGPL 2.1+ or the WTFPL.
010 */
011package org.minidns.jul;
012
013import java.io.ByteArrayInputStream;
014import java.io.IOException;
015import java.io.InputStream;
016import java.io.PrintWriter;
017import java.io.StringWriter;
018import java.text.SimpleDateFormat;
019import java.util.Date;
020import java.util.logging.ConsoleHandler;
021import java.util.logging.Formatter;
022import java.util.logging.Handler;
023import java.util.logging.Level;
024import java.util.logging.LogManager;
025import java.util.logging.LogRecord;
026import java.util.logging.Logger;
027
028public class MiniDnsJul {
029
030    private static final Logger LOGGER = Logger.getLogger(MiniDnsJul.class.getName());
031
032    private static final InputStream LOG_MANAGER_CONFIG = new ByteArrayInputStream((
033// @formatter:off
034"org.minidns.level=FINEST" + '\n'
035).getBytes()
036);
037// @formatter:on
038
039    private static final SimpleDateFormat LONG_LOG_TIME_FORMAT = new SimpleDateFormat("hh:mm:ss.SSS");
040
041    private static final SimpleDateFormat SHORT_LOG_TIME_FORMAT = new SimpleDateFormat("mm:ss.SSS");
042
043    private static final Handler CONSOLE_HANDLER = new ConsoleHandler();
044
045    private static boolean shortLog = true;
046
047    static {
048        try {
049            LogManager.getLogManager().readConfiguration(LOG_MANAGER_CONFIG);
050        } catch (SecurityException | IOException e) {
051            LOGGER.log(Level.SEVERE, "Could not apply MiniDNS JUL configuration", e);
052        }
053
054        CONSOLE_HANDLER.setLevel(Level.OFF);
055        CONSOLE_HANDLER.setFormatter(new Formatter() {
056            @Override
057            public String format(LogRecord logRecord) {
058                StringBuilder sb = new StringBuilder(256);
059
060                Date date = new Date(logRecord.getMillis());
061                String dateString;
062                if (shortLog) {
063                    synchronized (SHORT_LOG_TIME_FORMAT) {
064                        dateString = SHORT_LOG_TIME_FORMAT.format(date);
065                    }
066                } else {
067                    synchronized (LONG_LOG_TIME_FORMAT) {
068                        dateString = LONG_LOG_TIME_FORMAT.format(date);
069                    }
070                }
071                sb.append(dateString).append(' ');
072
073                String level = logRecord.getLevel().toString();
074                if (shortLog) {
075                    level = level.substring(0, 1);
076                }
077                sb.append(level).append(' ');
078
079                String loggerName = logRecord.getLoggerName();
080                if (shortLog) {
081                    String[] parts = loggerName.split("\\.");
082                    loggerName = parts[parts.length > 1 ? parts.length - 1 : 0];
083                }
084                sb.append(loggerName);
085                sb.append(' ').append(logRecord.getSourceMethodName());
086
087                if (shortLog) {
088                    sb.append(' ');
089                } else {
090                    sb.append('\n');
091                }
092
093                sb.append(formatMessage(logRecord));
094                if (logRecord.getThrown() != null) {
095                    StringWriter sw = new StringWriter();
096                    PrintWriter pw = new PrintWriter(sw);
097                    // CHECKSTYLE:OFF
098                    pw.println();
099                    logRecord.getThrown().printStackTrace(pw);
100                    // CHECKSTYLE:ON
101                    pw.close();
102                    sb.append(sw);
103                }
104                sb.append('\n');
105                return sb.toString();
106            }
107        });
108        Logger.getLogger("org.minidns").addHandler(CONSOLE_HANDLER);
109    }
110
111    public static void enableMiniDnsTrace() {
112        enableMiniDnsTrace(true);
113    }
114
115    public static void enableMiniDnsTrace(boolean shortLog) {
116        MiniDnsJul.shortLog = shortLog;
117        CONSOLE_HANDLER.setLevel(Level.FINEST);
118    }
119
120    public static void disableMiniDnsTrace() {
121        CONSOLE_HANDLER.setLevel(Level.OFF);
122    }
123}