2015-01-13 5 views
5

Я использую fluentd для централизации сообщений журнала в поиске elastics и просмотра их с помощью kibana. При просмотре сообщений журнала, сообщения, произошедшие в ту же секунду вышли из строя и миллисекунды в @timestamp это все нулиfluentd теряет миллисекунды, и теперь сообщения журнала хранятся не в порядке в elasticsearch

2015-01-13T11:54:01.000-06:00 DEBUG my message 

Как получить fluentd хранить миллисекунды?

ответ

12

fluentd не поддерживает суб-второе разрешение: https://github.com/fluent/fluentd/issues/461

Я работал вокруг этого путем добавления нового поля для всех сообщений журнала с record_reformer для хранения наносекунд с начала эпохи

Например, если ваш fluentd имеет несколько входов, как так:

# 
# Syslog 
# 
<source> 
    type syslog 
    port 5140 
    bind localhost 
    tag syslog 
</source> 

# 
# Tomcat log4j json output 
# 
<source> 
    type tail 
    path /home/foo/logs/catalina-json.out 
    pos_file /home/foo/logs/fluentd.pos 
    tag tomcat 
    format json 
    time_key @timestamp 
    time_format "%Y-%m-%dT%H:%M:%S.%L%Z" 
</source> 

Затем измените их, чтобы посмотреть, как это и добавить record_reformer, который добавляет поле наносекунд

# 
# Syslog 
# 
<source> 
    type syslog 
    port 5140 
    bind localhost 
    tag cleanup.syslog 
</source> 

# 
# Tomcat log4j json output 
# 
<source> 
    type tail 
    path /home/foo/logs/catalina-json.out 
    pos_file /home/foo/logs/fluentd.pos 
    tag cleanup.tomcat 
    format json 
    time_key @timestamp 
    time_format "%Y-%m-%dT%H:%M:%S.%L%Z" 
</source> 

<match cleanup.**> 
    type record_reformer 
    time_nano ${t = Time.now; ((t.to_i * 1000000000) + t.nsec).to_s} 
    tag ${tag_suffix[1]} 
</match> 

Затем добавьте поле time_nano в панели управления kibana и используйте его для сортировки вместо @timestamp, и все будет в порядке.

+1

Спасибо за ответ. Здесь есть помощник Fluentd. Я буду держать этот вопрос в виду, поскольку мы больше думаем о поддержке временной подписи (это известное решение проблемы/дизайна). –

+0

Спасибо за внимание к этой проблеме Киёто Тамура. Обходной путь менее идеален, потому что временная метка создается из fluentd vs из файла журнала, который может уже иметь точность не менее миллисекунд. Было бы лучше сначала использовать формат миллисекунд с точностью до времени, а затем добавить текущее наносекундное значение с текущей секунды в fluentd во время разбора, чтобы поддерживать порядок в той же миллисекунде. Или секунда, если в анализируемом лог-сообщении было только 1-секундное разрешение, например, syslog. –

+1

Привет @DavidWartell, как вы думаете, было бы лучше использовать переменную $ {time} из плагинов-плагинов-реформаторов? Поэтому вместо 'Time.now' мы можем получить время события вместо времени fluentd. – clarete