View Javadoc

1   /**
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.classic.net;
15  
16  import java.io.IOException;
17  
18  import ch.qos.logback.classic.PatternLayout;
19  import ch.qos.logback.classic.pattern.SyslogStartConverter;
20  import ch.qos.logback.classic.spi.ILoggingEvent;
21  import ch.qos.logback.classic.spi.IThrowableProxy;
22  import ch.qos.logback.classic.spi.StackTraceElementProxy;
23  import ch.qos.logback.classic.util.LevelToSyslogSeverity;
24  import ch.qos.logback.core.CoreConstants;
25  import ch.qos.logback.core.Layout;
26  import ch.qos.logback.core.net.SyslogAppenderBase;
27  import ch.qos.logback.core.net.SyslogWriter;
28  
29  /**
30   * This appender can be used to send messages to a remote syslog daemon. <p> For
31   * more information about this appender, please refer to the online manual at
32   * http://logback.qos.ch/manual/appenders.html#SyslogAppender
33   * 
34   * @author Ceki G&uumllc&uuml;
35   */
36  public class SyslogAppender extends SyslogAppenderBase<ILoggingEvent> {
37  
38    static final public String DEFAULT_SUFFIX_PATTERN = "[%thread] %logger %msg";
39  
40    PatternLayout prefixLayout = new PatternLayout();
41  
42    public Layout<ILoggingEvent> buildLayout(String facilityStr) {
43      String prefixPattern = "%syslogStart{" + facilityStr + "}%nopex";
44  
45      prefixLayout.getInstanceConverterMap().put("syslogStart",
46          SyslogStartConverter.class.getName());
47      prefixLayout.setPattern(prefixPattern);
48      prefixLayout.setContext(getContext());
49      prefixLayout.start();
50  
51      PatternLayout fullLayout = new PatternLayout();
52      fullLayout.getInstanceConverterMap().put("syslogStart",
53          SyslogStartConverter.class.getName());
54  
55      if (suffixPattern == null) {
56        suffixPattern = DEFAULT_SUFFIX_PATTERN;
57      }
58  
59      fullLayout.setPattern(prefixPattern + suffixPattern);
60      fullLayout.setContext(getContext());
61      fullLayout.start();
62      return fullLayout;
63    }
64  
65    /*
66     * Convert a level to equivalent syslog severity. Only levels for printing
67     * methods i.e DEBUG, WARN, INFO and ERROR are converted.
68     * 
69     * @see ch.qos.logback.core.net.SyslogAppenderBase#getSeverityForEvent(java.lang.Object)
70     */
71    @Override
72    public int getSeverityForEvent(Object eventObject) {
73      ILoggingEvent event = (ILoggingEvent) eventObject;
74      return LevelToSyslogSeverity.convert(event);
75    }
76  
77    @Override
78    protected void postProcess(Object eventObject, SyslogWriter sw) {
79      ILoggingEvent event = (ILoggingEvent) eventObject;
80  
81      String prefix = prefixLayout.doLayout(event);
82  
83      IThrowableProxy tp = event.getThrowableProxy();
84      while (tp != null) {
85        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
86        try {
87          for (StackTraceElementProxy step : stepArray) {
88            sw.write(prefix);
89            sw.write(CoreConstants.TAB);
90            sw.write(step.toString());
91            sw.flush();
92          }
93        } catch (IOException e) {
94          break;
95        }
96        tp = tp.getCause();
97      }
98    }
99  }