View Javadoc

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