
Author: ceki Date: Tue Aug 8 23:13:05 2006 New Revision: 419 Added: logback/classic/trunk/src/main/java/ch/qos/logback/classic/net/ logback/classic/trunk/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java logback/classic/trunk/src/main/java/ch/qos/logback/classic/pattern/SyslogStartConverter.java logback/classic/trunk/src/main/java/ch/qos/logback/classic/util/LevelToSyslogSeverity.java Log: - on going work on SyslogAppender - added support for instance converter map in PatternLayout - various copyright related changes (minor) Added: logback/classic/trunk/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java ============================================================================== --- (empty file) +++ logback/classic/trunk/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java Tue Aug 8 23:13:05 2006 @@ -0,0 +1,64 @@ +/** + * Logback: the reliable, generic, fast and flexible logging framework. + * + * Copyright (C) 1999-2006, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.classic.net; + +import ch.qos.logback.classic.PatternLayout; +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.util.LevelToSyslogSeverity; +import ch.qos.logback.core.Layout; +import ch.qos.logback.core.net.SyslogAppenderBase; + +/** + * + * @author Ceki Gülcü + */ +public class SyslogAppender extends SyslogAppenderBase { + + Layout layout; + + public Layout makeDefaultLayout(int facility) { + PatternLayout pl = new PatternLayout(); + pl.getInstanceConverterMap().put("syslogStart", "sfsdf"); + pl.setPattern("%syslogStart{"+facility+"} "); + pl.setContext(getContext()); + pl.start(); + return pl; + } + + /* + * Convert a level to equivalent syslog severity. Only levels for printing methods + * i.e DEBUG, WARN, INFO and ERROR are converted. + * + * @see ch.qos.logback.core.net.SyslogAppenderBase#getSeverityForEvent(java.lang.Object) + */ + @Override + public int getSeverityForEvent(Object eventObject) { + LoggingEvent event = (LoggingEvent) eventObject; + return LevelToSyslogSeverity.convert(event); + } + + /* + * Set the layout. + * + * @see ch.qos.logback.core.Appender#setLayout(ch.qos.logback.core.Layout) + */ + public void setLayout(Layout layout) { + this.layout = layout; + } + + /* + * + * @see ch.qos.logback.core.Appender#getLayout() + */ + public Layout getLayout() { + return layout; + } + +} Added: logback/classic/trunk/src/main/java/ch/qos/logback/classic/pattern/SyslogStartConverter.java ============================================================================== --- (empty file) +++ logback/classic/trunk/src/main/java/ch/qos/logback/classic/pattern/SyslogStartConverter.java Tue Aug 8 23:13:05 2006 @@ -0,0 +1,102 @@ +/** + * LOGBack: the reliable, fast and flexible logging library for Java. + * + * Copyright (C) 1999-2006, QOS.ch + * + * This library is free software, you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation. + */ +package ch.qos.logback.classic.pattern; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.util.LevelToSyslogSeverity; +import ch.qos.logback.core.CoreGlobal; + +public class SyslogStartConverter extends ClassicConverter { + + long lastTimestamp = -1; + String timesmapStr = null; + SimpleDateFormat simpleFormat = null; + String localHostName; + int facility; + + public void start() { + + String datePattern = getFirstOption(); + if (datePattern == null) { + datePattern = CoreGlobal.ISO8601_PATTERN; + } + + localHostName = getLocalHostname(); + try { + simpleFormat = new SimpleDateFormat(datePattern); + // maximumCacheValidity = + // CachedDateFormat.getMaximumCacheValidity(pattern); + } catch (IllegalArgumentException e) { + getLogger().warn( + "Could not instantiate SimpleDateFormat with pattern " + datePattern, + e); + // default to the ISO8601 format + simpleFormat = new SimpleDateFormat(CoreGlobal.ISO8601_PATTERN); + } + + List optionList = getOptionList(); + + // if the option list contains a TZ option, then set it. + if (optionList != null && optionList.size() > 1) { + TimeZone tz = TimeZone.getTimeZone((String) optionList.get(1)); + simpleFormat.setTimeZone(tz); + } + } + + public String convert(Object event) { + LoggingEvent le = (LoggingEvent) event; + StringBuilder sb = new StringBuilder(); + + int pri = facility + LevelToSyslogSeverity.convert(le); + System.out.println("" + pri); + sb.append("<"); + sb.append(pri); + sb.append(">"); + fillInTimestamp(sb, le.getTimeStamp()); + sb.append(' '); + sb.append(localHostName); + sb.append(' '); + + return sb.toString(); + } + + /** + * This method gets the network name of the machine we are running on. + * Returns "UNKNOWN_LOCALHOST" in the unlikely case where the host name + * cannot be found. + * @return String the name of the local host + */ + public String getLocalHostname() { + try { + InetAddress addr = InetAddress.getLocalHost(); + return addr.getHostName(); + } catch (UnknownHostException uhe) { + addError("Could not determine local host name", uhe); + return "UNKNOWN_LOCALHOST"; + } + } + + void fillInTimestamp(StringBuilder sb, long timestamp) { + // if called multiple times within the same millisecond + // use last value + if (timestamp != lastTimestamp) { + lastTimestamp = timestamp; + timesmapStr = simpleFormat.format(new Date(timestamp)); + } + sb.append(timesmapStr); + } +} Added: logback/classic/trunk/src/main/java/ch/qos/logback/classic/util/LevelToSyslogSeverity.java ============================================================================== --- (empty file) +++ logback/classic/trunk/src/main/java/ch/qos/logback/classic/util/LevelToSyslogSeverity.java Tue Aug 8 23:13:05 2006 @@ -0,0 +1,42 @@ +/** + * Logback: the reliable, generic, fast and flexible logging framework. + * + * Copyright (C) 1999-2006, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ + +package ch.qos.logback.classic.util; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.net.SyslogConstants; + +public class LevelToSyslogSeverity { + + /* + * Convert a level to equivalent syslog severity. Only levels for printing methods + * i.e DEBUG, WARN, INFO and ERROR are converted. + * + */ + static public int convert(LoggingEvent event) { + + Level level = event.getLevel(); + + switch (level.levelInt) { + case Level.ERROR_INT: + return SyslogConstants.ERROR_SEVERITY; + case Level.WARN_INT: + return SyslogConstants.WARNING_SEVERITY; + case Level.INFO_INT: + return SyslogConstants.INFO_SEVERITY; + case Level.DEBUG_INT: + return SyslogConstants.LOG_ALERT; + default: + throw new IllegalArgumentException("Level " + level + + " is not a valid level for a printing method"); + } + } +}