2015-02-10 6 views
3

Есть некоторые трудности с Logstash и многострочный работают вместеLogstash Multiline с Syslog

Я использую Logspout контейнер, который направляет все записи стандартного вывода в системном журнале для logstash.

Это конечный контент, который получает логсташ. Вот несколько строк, которые должны представлять два события.

<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: 2015-02-10 11:55:38.496 INFO 1 --- [tp1302304527-19] c.z.service.DefaultInvoiceService  : Creating with DefaultInvoiceService started... 
<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: 2015-02-10 11:55:48.596 WARN 1 --- [tp1302304527-19] o.eclipse.jetty.servlet.ServletHandler : 
<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: 
<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=mongo:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.UnknownHostException: mongo: unknown error}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=mongo:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.UnknownHostException: mongo: unknown error}}] 
<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 
<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) 
<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
<14>2015-02-09T14:25:01Z logspout dev_zservice_1[1]: at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 

Каждая строка журнала начинается с головы syslog.

Основываясь на приведенном выше содержании журнала, я создал файл конфигурации logstash.

input { 
    udp { 
    port => 5000 
    type => syslog 
    } 
} 

filter { 
    multiline { 
    pattern => "^<%{NUMBER}>%{TIMESTAMP_ISO8601} %{SYSLOGHOST:container_name} %{DATA}(?:\[%{POSINT}\])?:%{SPACE}%{TIMESTAMP_ISO8601}" 
    negate => true 
    what => "previous" 
    stream_identity => "%{container_name}" 
    } 

    grok { 
    match => [ "message", "(?m)^<%{NUMBER}>%{TIMESTAMP_ISO8601} %{SYSLOGHOST} %{DATA:container_name}(?:\[%{POSINT}\])?:%{SPACE}%{TIMESTAMP_ISO8601:timestamp}%{SPACE}%{LOGLEVEL:loglevel}%{SPACE}%{NUMBER}%{SPACE}---%{SPACE}(?:\[%{DATA:threadname}\])?%{SPACE}%{JAVACLASS:clas 
    } 

    date { 
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ] 
    remove_field => ["timestamp"] 
    } 
    if !("_grokparsefailure" in [tags]) { 
    mutate { 
     replace => [ "source_host", "%{container_name}" ] 
     replace => [ "raw_message", "%{message}" ] 
     replace => [ "message", "%{logmessage}" ] 
     remove_field => [ "logmessage", "host", "source_host" ] 
    } 
    } 
    mutate { 
    strip => [ "threadname" ] 
    } 
} 

output { 
    elasticsearch { } 
} 

Теперь, когда вышеуказанные события прибывает первое событие правильно обрабатываются и отображаются:

message = "Creating with DefaultInvoiceService started..." 

Второе событие содержит это сообщение, которое содержит три вопроса:

<14>2015-02-10T12:59:09Z logspout dev_zservice_1[1]: 

<14>2015-02-10T12:59:09Z logspout dev_zservice_1[1]: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=mongo:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.UnknownHostException: mongo: unknown error}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=mongo:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.UnknownHostException: mongo: unknown error}}] 

<14>2015-02-10T12:59:09Z logspout dev_zservice_1[1]: at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 

<14>2015-02-10T12:59:09Z logspout dev_zservice_1[1]: at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) 

<14>2015-02-10T12:59:09Z logspout dev_zservice_1[1]: at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 

<14>2015-02-10T12:59:09Z logspout dev_zservice_1[1]: at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 

<14>2015-02-10T12:59:09Z logspout dev_nginx_1[1]: 192.168.59.3 - - [10/Feb/2015:12:59:09 +0000] "POST /api/invoice/ HTTP/1.1" 500 1115 "http://192.168.59.103/"; "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36" "-" 
  1. The текст сообщения содержит строку с записью dev_nginx_1, которая делает n Здесь нет. Это следует рассматривать как отдельное событие.
  2. Каждая строка содержит префикс. <14>2015-02-10T12:59:09Z logspout dev_zservice_1[1]:

  3. Каждая линия имеет дополнительную новую линию

вопрос. Почему dev_nginx_1 запись не событие само по себе. Почему он считается принадлежащим предыдущему? Как я могу избавиться от префикса syslog в каждой строке сообщения. Как я могу избавиться от новой новой строки?

ответ

0

Что касается (1), то вы используете container_name в многострочном пространстве. Это поле после метки времени. В вашем примере они все «logspout». Кажется, я прав.

Что касается (2), каждая строка поставляется с префиксом и меткой времени, поэтому вы можете ожидать, что они будут там по умолчанию. Вы делаете mutate{}, чтобы заменить message на log_message, но я не вижу, что вы устанавливаете log_message. Итак, как вы считали, что префикс и временная метка удаляются?

0

Для (1) замените %{SYSLOGHOST:container_name} %{DATA} на ваш шаблон многострочной линии с помощью %{SYSLOGHOST} %{DATA:container_name} (как вы используете в своем grok).

Для (2) и (3), вы можете попробовать что-то вроде этого:

mutate { 
    gsub => [ "message", "<\d+>.*?:\s", "", "message", "\n(\n)", "\1" ] 
} 

Здесь параметр gsub выполняет две операции:

  1. Изучите "сообщение" поле, найдите подстроки из «< 14>» в двоеточие, за которым следует пробел, и замените эти подстроки пустыми строками.
  2. Изучите поле «сообщение», найдите подстроки, состоящие из двух последовательных символов новой строки, и замените их одним символом новой строки. Он выполняет замену с помощью \1 backrefernce в группу (\n), потому что если вы попытаетесь использовать \n, то Logstash на самом деле заменит его \\n, что не сработает.
Смежные вопросы