Example #1
0
  @Converter
  public static String toString(SyslogMessage message) {

    boolean isRfc5424 = message instanceof Rfc5424SyslogMessage;

    StringBuilder sbr = new StringBuilder();
    sbr.append("<");
    if (message.getFacility() == null) {
      message.setFacility(SyslogFacility.USER);
    }
    if (message.getSeverity() == null) {
      message.setSeverity(SyslogSeverity.INFO);
    }
    if (message.getHostname() == null) {
      // This is massively ugly..
      try {
        message.setHostname(InetAddress.getLocalHost().toString());
      } catch (UnknownHostException e) {
        message.setHostname("UNKNOWN_HOST");
      }
    }
    sbr.append(message.getFacility().ordinal() * 8 + message.getSeverity().ordinal());
    sbr.append(">");

    // version number
    if (isRfc5424) {
      sbr.append("1");
      sbr.append(" ");
    }

    if (message.getTimestamp() == null) {
      message.setTimestamp(Calendar.getInstance());
    }

    if (isRfc5424) {
      sbr.append(DatatypeConverter.printDateTime(message.getTimestamp()));
    } else {
      addRfc3164TimeStamp(sbr, message);
    }
    sbr.append(" ");

    sbr.append(message.getHostname());
    sbr.append(" ");

    if (isRfc5424) {
      Rfc5424SyslogMessage rfc5424SyslogMessage = (Rfc5424SyslogMessage) message;

      sbr.append(rfc5424SyslogMessage.getAppName());
      sbr.append(" ");

      sbr.append(rfc5424SyslogMessage.getProcId());
      sbr.append(" ");

      sbr.append(rfc5424SyslogMessage.getMsgId());
      sbr.append(" ");

      sbr.append(rfc5424SyslogMessage.getStructuredData());
      sbr.append(" ");
    }

    sbr.append(message.getLogMessage());

    return sbr.toString();
  }
Example #2
0
  public static SyslogMessage parseMessage(byte[] bytes) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(bytes.length);
    byteBuffer.put(bytes);
    byteBuffer.rewind();

    Character charFound = (char) byteBuffer.get();

    SyslogFacility foundFacility = null;
    SyslogSeverity foundSeverity = null;

    while (charFound != '<') {
      // Ignore noise in beginning of message.
      charFound = (char) byteBuffer.get();
    }
    char priChar = 0;
    if (charFound == '<') {
      int facility = 0;

      while (Character.isDigit(priChar = (char) (byteBuffer.get() & 0xff))) {
        facility *= 10;
        facility += Character.digit(priChar, 10);
      }
      foundFacility = SyslogFacility.values()[facility >> 3];
      foundSeverity = SyslogSeverity.values()[facility & 0x07];
    }

    if (priChar != '>') {
      // Invalid character - this is not a well defined syslog message.
      LOG.error("Invalid syslog message, missing a > in the Facility/Priority part");
    }

    SyslogMessage syslogMessage = new SyslogMessage();
    boolean isRfc5424 = false;
    // Read next character
    charFound = (char) byteBuffer.get();
    // If next character is a 1, we have probably found an rfc 5424 message
    // message
    if (charFound == '1') {
      syslogMessage = new Rfc5424SyslogMessage();
      isRfc5424 = true;
    } else {
      // go back one to parse the rfc3164 date
      byteBuffer.position(byteBuffer.position() - 1);
    }

    syslogMessage.setFacility(foundFacility);
    syslogMessage.setSeverity(foundSeverity);

    if (!isRfc5424) {
      // Parse rfc 3164 date
      syslogMessage.setTimestamp(parseRfc3164Date(byteBuffer));
    } else {

      charFound = (char) byteBuffer.get();
      if (charFound != ' ') {
        LOG.error("Invalid syslog message, missing a mandatory space after version");
      }

      // This should be the timestamp
      StringBuilder date = new StringBuilder();
      while ((charFound = (char) (byteBuffer.get() & 0xff)) != ' ') {
        date.append(charFound);
      }

      syslogMessage.setTimestamp(DatatypeConverter.parseDateTime(date.toString()));
    }

    // The host is the char sequence until the next ' '

    StringBuilder host = new StringBuilder();
    while ((charFound = (char) (byteBuffer.get() & 0xff)) != ' ') {
      host.append(charFound);
    }

    syslogMessage.setHostname(host.toString());

    if (isRfc5424) {
      Rfc5424SyslogMessage rfc5424SyslogMessage = (Rfc5424SyslogMessage) syslogMessage;
      StringBuilder appName = new StringBuilder();
      while ((charFound = (char) (byteBuffer.get() & 0xff)) != ' ') {
        appName.append(charFound);
      }
      rfc5424SyslogMessage.setAppName(appName.toString());

      StringBuilder procId = new StringBuilder();
      while ((charFound = (char) (byteBuffer.get() & 0xff)) != ' ') {
        procId.append(charFound);
      }
      rfc5424SyslogMessage.setProcId(procId.toString());

      StringBuilder msgId = new StringBuilder();
      while ((charFound = (char) (byteBuffer.get() & 0xff)) != ' ') {
        msgId.append(charFound);
      }
      rfc5424SyslogMessage.setMsgId(msgId.toString());

      StringBuilder structuredData = new StringBuilder();
      boolean inblock = false;
      while (((charFound = (char) (byteBuffer.get() & 0xff)) != ' ') || inblock) {
        if (charFound == '[') {
          inblock = true;
        }
        if (charFound == ']') {
          inblock = false;
        }
        structuredData.append(charFound);
      }
      rfc5424SyslogMessage.setStructuredData(structuredData.toString());
    }

    StringBuilder msg = new StringBuilder();
    while (byteBuffer.hasRemaining()) {
      charFound = (char) (byteBuffer.get() & 0xff);
      msg.append(charFound);
    }

    syslogMessage.setLogMessage(msg.toString());
    LOG.trace("Syslog message : {}", syslogMessage.toString());

    return syslogMessage;
  }