Cloudflare Logpush Transformers: SQL でログを絞る・伏せる・形を変えてから送る
Logpush のジョブに SQL(Transformer)を付けると、ヘルスチェックの除外、IP の部分マスク、フィールドの改名・入れ子化を「送る前に」Cloudflare 側でやってくれる。
どんなときに使う?
- SIEM や分析基盤に送るログの量(=転送・取り込み・保存の料金)を減らしたい
/healthzや社内ホストなど、受け取った瞬間に捨てているレコードがある- 個人情報(クライアント IP など)を出力先に渡したくない
- 複数 CDN のログを共通スキーマにそろえたい(
provider列を足す等) - これまで間に置いていた「整形用の Worker / Lambda / Fluentd」をやめたい
Birthday Week 2026 で GA。Free / Pro / Business / Enterprise の全プランで使える(Logpush 自体もセルフサーブ全プランに開放)。
やり方
- ダッシュボードの Logpush ページから Transformer Studio を開く(API でも作成可)
- 対象データセットを選ぶ(
FROMに書くテーブル名=データセット。例:http_requests) - SQL を書き、サンプルレコードでプレビュー
- 保存して、同じデータセットの NDJSON ジョブに紐づける(保存のたびに新しいバージョンになる)
公式ブログの例を短くしたもの:
sql
SELECT
extract(epoch FROM to_timestamp(EdgeStartTimestamp)) AS unix_ts,
regexp_replace(ClientIP, '\.\d+\.\d+$', '.XXX.XXX') AS redacted_ip, -- IP を部分マスク
EdgeResponseStatus AS status,
RayID AS ray_id,
'cloudflare' AS provider, -- 固定値の列を追加
named_struct('host', ClientRequestHost, 'path', ClientRequestPath) AS request, -- 入れ子にする
EdgeResponseStatus >= 500 AS is_server_error
FROM http_requests
WHERE ClientRequestHost NOT IN ('internal.example.com', 'health.example.com')
AND ClientRequestPath NOT LIKE '/healthz%'
AND ClientRequestPath NOT LIKE '/metrics%'WHEREに合わないレコードは捨てられ、SELECTの結果がそのまま 1 レコードとして出力される- 出力は NDJSON(形式変換ではなく、NDJSON → NDJSON の整形)
注意点
- フェイルクローズ: 変換に失敗したバッチは「未変換のまま送る」ことはせず、リトライし続ける。直らないジョブは遅延が伸び、長く失敗し続けると自動で無効化される。SQL を変えたら Logpush の Health タブにある Transformer Health(成功・失敗数、変換前後のデータ量、所要時間)を確認する
- NDJSON 以外の出力形式のジョブには付けられない
- 内部では Apache DataFusion をプロセス内で動かしている(5,000 行のバッチで約 3ms という社内ベンチ)。高負荷ジョブでも別の処理層は要らないが、CPU 処理は増える
- 料金は Logpush の料金ページを確認すること