PostgreSQL的Logstash多行过滤器

时间:2015-02-04 16:57:19

标签: postgresql logstash grok

我正在尝试为postgresql日志创建过滤器。 日志记录可以是单行的,例如

2014-01-14 17:23:08 EST DETAIL:  Remote detail: Key (id)=(913072088342860500) already exists.

或多线:

2014-02-04 19:26:08 EST CONTEXT:  Remote context: SQL statement "INSERT INTO     images.images_contents_part_2014_01_05 SELECT $1.*"
        PL/pgSQL function insert_find_part() line 25 at EXECUTE statement
        SQL statement "INSERT INTO images.images_contents_master SELECT NEW.*"
        PL/pgSQL function images_contents_insert_trigger() line 6 at SQL statement
        SQL statement "INSERT INTO images.images_contents (id,content_id, image, created)
              VALUES (images.images_make_id_from_created(created_at),content_id, image_path, created_at)
            RETURNING id"
        PL/pgSQL function insert_news_image(character varying,bigint,timestamp without time zone) line 11 at     SQL statement
        SQL statement "SELECT
                media_id AS id
              FROM contents.insert_news_image(i, id) AS media_id"
        PL/pgSQL function insert_news_media(bigint,character varying[],character varying[]) line 21 at SQL     statement

我需要提取有关时间,消息类型(上下文,详细信息,调试等)和消息文本的信息。 我想需要使用多行编解码器,但我不知道如何实现它。

谢谢!

1 个答案:

答案 0 :(得分:0)

有(可能)两种可行的方法:

  • 如果一行以空格开头,则将其与前一行合并,或
  • 如果一行没有以时间戳开头,则将该行与前一行合并。

我不知道PostgreSQL的日志格式是否承诺所有延续行都以空格开头,但可能。如果没有,第一个选项显然是出局。以下是如何完成前者的一个例子:

filter {
  multiline {
    pattern => "^\s+"
    what => "previous"
  }
}

如果您愿意,我确定您可以使用multiline codec

请注意,Logstash< 1.5有一个错误(LOGSTASH-2067),可以阻止它从多行输入中获取最后一行。另请参阅logstash multiline filter:last part of message flush