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}