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, и все будет в порядке.
Спасибо за ответ. Здесь есть помощник Fluentd. Я буду держать этот вопрос в виду, поскольку мы больше думаем о поддержке временной подписи (это известное решение проблемы/дизайна). –
Спасибо за внимание к этой проблеме Киёто Тамура. Обходной путь менее идеален, потому что временная метка создается из fluentd vs из файла журнала, который может уже иметь точность не менее миллисекунд. Было бы лучше сначала использовать формат миллисекунд с точностью до времени, а затем добавить текущее наносекундное значение с текущей секунды в fluentd во время разбора, чтобы поддерживать порядок в той же миллисекунде. Или секунда, если в анализируемом лог-сообщении было только 1-секундное разрешение, например, syslog. –
Привет @DavidWartell, как вы думаете, было бы лучше использовать переменную $ {time} из плагинов-плагинов-реформаторов? Поэтому вместо 'Time.now' мы можем получить время события вместо времени fluentd. – clarete