如何在fluentd中将time\u格式从time\u iso8601更改为发送到clickhouse?

35g0bw71  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(828)

有nginx.conf

....
http {
....
    log_format  main  '"$remote_addr" "$time_iso8601"';
    access_log  /var/log/nginx/access.log  main;
.....
}

日志访问.log

"127.0.0.1" "2019-12-28T10:53:20+00:00"
"127.0.0.1" "2019-12-28T10:53:20+00:00"

有流利的(td代理)

td-agent.conf
<source>
  @type tail
  path /var/log/nginx/access.log
  pos_file /tmp/nginx-access-log.pos
  tag nginx
  format /"(?<remote_addr>[0-9,\.]*)" "(?<time_iso8601>[^ ]*)"/
  time_format %Y-%m-%dT%H:%M:%S.%NZ
</source>

<filter foo.bar>
  @type record_transformer
  enable_ruby
  <record>
    time_iso8601 ${Time.strptime(record['time_iso8601'], '%Y-%m-%d %H:%M:%S').iso8601}
  </record>
</filter>

<match nginx>
    @type clickhousejson
    host 127.0.0.1
    port 8123
    database fluent
    table fluent
    datetime_name time_iso8601
</match>

在clickhouse中,我创建了一个数据库和一个表。

create database fluent;

CREATE TABLE fluent.fluent (
  Date Date MATERIALIZED toDate(DateTime), 
  remoteip String, 
  DateTime DateTime) 
ENGINE = MergeTree(Date, DateTime, 8192);

日志被发送到clickhouse。

│          │ 0000-00-00 00:00:00 │

如何在fluentd(td代理)中将time\u格式从time\u iso8601更改为%y-%m-%d%h:%m:%s并发送到clickhouse?

r6vfmomb

r6vfmomb1#

当存在未知或不直接支持的日期格式需要插入到clickhouse表中时,您可以尝试在clickhouse中对其进行解析,而不必更改源中的日期,无论其格式如何。
您可以使用parsedatetimebesteffort函数来尝试。
对于您的情况,可以创建如下表:

CREATE TABLE fluent.fluent (
  DateTime String,
  remoteip String,
  Date Date MATERIALIZED toDate(parseDateTimeBestEffort(DateTime)),  
  ParsedDateTime DateTime MATERIALIZED parseDateTimeBestEffort(DateTime) 
ENGINE = MergeTree(Date, ParsedDateTime, 8192);

它存储 DateTime 列,因为它在 String 列,然后使用 parseDateTimeBestEffort .
如果这不起作用,您可以在 DateTime 列,并尝试使用todatetime函数和substring的组合手动解析原始值。

相关问题