https://github.com/tagomoris/fluent-plugin-mysqlを使って、fluentd-3.xでmysql 5.7にログを入れる方法のメモ
同時にbigqueryに対してもログを入れているので、@type copyを使う。
<match xxx.yyyy.accesslog>
@type copy
# bigquery用
<store>
@type bigquery
auth_method json_key
json_key PATH/TO/FILE
project GCP PROJECT
dataset ${tag[0]}
table ${tag[1]}_${tag[2]}_%Y%m%d
auto_create_table true
schema_path /etc/td-agent/schema.json
<buffer tag,time>
@type file
path /var/log/td-agent/buffer/papillon_accesslog
timekey 1d
chunk_limit_size 1000000
queue_limit_length 128
flush_interval 1
retry_max_times 17
retry_wait 1s
</buffer>
<inject>
time_key time
time_format %Y-%m-%d %H:%M:%S
</inject>
</store>
# MySQL用にTimeをISO8061からDATETIMEに変換する。
<store>
@type record_reformer
output_tag mysql.${tag_suffix[0]} # tag名に「mysql」を追加
enable_ruby true # ruby有効化
auto_typecast true
<record>
time ${require 'time'; Time.parse(record["time"]).strftime("%Y/%m/%d %H:%M:%S")} # TimeをISO8061からDATETIME
</record>
</store>
</match>
<match mysql.xxx.yyyy.accesslog>
@type mysql_bulk
host 10.254.0.xx
database TABLE
username USER
password PASSWORD
column_names time,user_id,uri,referer,remote_ip
key_names time,user_id,uri,referer,remote_ip
table log
transaction_isolation_level read_committed # 2018/5から、デフォルト値がnulになったので、指定しないとトランザクション貼れない。
flush_interval 1s
</match>
ハマったのは、
transaction_isolation_level read_committed
の記述の部分。
ここ以外の記述で、td-agentはちゃんと動くが、
2018-06-01 20:30:30 +0900 [warn]: #0 failed to flush the buffer. retry_time=4 next_retry_seconds=2018-06-01 20:30:30 +0900 chunk="56d92e8467c4fab0440db16ee36f0d34" error_class=Mysql2::Error error="You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1"
こんなエラーが出る。
mysql側でgeneral_logを有効にするも、
2018-06-01T20:30:46.022528+09:00 14 Connect logger@fluentd01 on accesslog using TCP/IP
2018-06-01T20:30:46.023467+09:00 14 Query SHOW COLUMNS FROM log
2018-06-01T20:30:46.024207+09:00 14 Quit
と、全然有用なログじゃないし。
結局、tcpdumpを取得して見たら、分離レベルを指定せずに 「SET SESSION TRANSACTION ISOLATION LEVEL」を投げている事が原因だった。
解決してよかったー