/* * Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden * Distributed under the terms shown in the file COPYRIGHT * found in the root folder of this project or at * http://eng.tada.se/osprojects/COPYRIGHT.html */ package org.postgresql.pljava.internal; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Properties; import java.util.logging.Filter; import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.LogRecord; /** * Provides access to the loggin mechanism of the PostgreSQL server. * * @author Thomas Hallgren */ public class ELogHandler extends Handler { /** * Debugging messages, in categories of * decreasing detail. */ public static final int LOG_DEBUG5 = 10; public static final int LOG_DEBUG4 = 11; public static final int LOG_DEBUG3 = 12; public static final int LOG_DEBUG2 = 13; public static final int LOG_DEBUG1 = 14; /** * Server operational messages; sent only * to server log by default. */ public static final int LOG_LOG = 15; /** * Informative messages that are always * sent to client; is not affected by * client_min_messages */ public static final int LOG_INFO = 17; /** * Helpful messages to users about query * operation; sent to client and server * log by default. */ public static final int LOG_NOTICE = 18; /** * Warnings */ public static final int LOG_WARNING = 19; /** * user error - abort transaction; return * to known state */ public static final int LOG_ERROR = 20; /** * fatal error - abort process */ public static final int LOG_FATAL = 21; /** * take down the other backends with me */ public static final int LOG_PANIC = 22; /* (non-Javadoc) * @see java.util.logging.Handler#publish(java.util.logging.LogRecord) */ public void publish(LogRecord record) { Level level = record.getLevel(); int pgLevel; if(level == null) pgLevel = LOG_LOG; else if(level.equals(Level.SEVERE)) pgLevel = LOG_ERROR; else if(level.equals(Level.WARNING)) pgLevel = LOG_WARNING; else if(level.equals(Level.INFO)) pgLevel = LOG_INFO; else if(level.equals(Level.FINE)) pgLevel = LOG_DEBUG1; else if(level.equals(Level.FINER)) pgLevel = LOG_DEBUG2; else if(level.equals(Level.FINEST)) pgLevel = LOG_DEBUG3; else pgLevel = LOG_LOG; Backend.log(pgLevel, this.getFormatter().format(record)); } public ELogHandler() { this.configure(); } /** * This is a no-op. */ public void flush() { } /** * This is a no-op. */ public void close() throws SecurityException { } public static void init() { Properties props = new Properties(); props.setProperty("handlers", ELogHandler.class.getName()); props.setProperty(".level", getPgLevel().getName()); ByteArrayOutputStream po = new ByteArrayOutputStream(); try { props.store(po, null); LogManager.getLogManager().readConfiguration( new ByteArrayInputStream(po.toByteArray())); } catch(IOException e) { } } /** * Obtains the "log_min_messages" configuration variable and * translates it into a {@link Level} object. * @return The Level that corresponds to the configuration variable. */ public static Level getPgLevel() { // We use this little trick to provide the correct config option // without having to call back into the JNI code the first time // around since that call will be a bit premature (it will come // during JVM initialization and before the native method is // registered). // String pgLevel = Backend.getConfigOption("log_min_messages"); Level level = Level.ALL; if(pgLevel != null) { pgLevel = pgLevel.toLowerCase().trim(); if(pgLevel.equals("panic") || pgLevel.equals("fatal")) level = Level.OFF; else if(pgLevel.equals("error")) level = Level.SEVERE; else if(pgLevel.equals("warning")) level = Level.WARNING; else if(pgLevel.equals("notice")) level = Level.CONFIG; else if(pgLevel.equals("info")) level = Level.INFO; else if(pgLevel.equals("debug1")) level = Level.FINE; else if(pgLevel.equals("debug2")) level = Level.FINER; else if(pgLevel.equals("debug3") || pgLevel.equals("debug4") || pgLevel.equals("debug5")) level = Level.FINEST; } return level; } // Private method to configure an ELogHandler // private void configure() { LogManager mgr = LogManager.getLogManager(); String cname = ELogHandler.class.getName(); String val = mgr.getProperty(cname + ".filter"); if(val != null) { try { this.setFilter((Filter)Class.forName(val.trim()).newInstance()); } catch (Exception e) { val = null; } } if(val == null) this.setFilter(null); val = mgr.getProperty(cname + ".formatter"); if(val != null) { try { this.setFormatter((Formatter)Class.forName(val.trim()).newInstance()); } catch (Exception e) { val = null; } } if(val == null) this.setFormatter(new ELogFormatter()); val = mgr.getProperty(cname + ".encoding"); if(val != null) { try { setEncoding(val.trim()); } catch(Exception e) { val = null; } } if(val == null) try { setEncoding(null); } catch (Exception e) { /* ignore */ } } }