テック技報最新号へ →
インフラ

Cloudflare Logpush Transformers: SQL でログを絞る・伏せる・形を変えてから送る

Logpush のジョブに SQL(Transformer)を付けると、ヘルスチェックの除外、IP の部分マスク、フィールドの改名・入れ子化を「送る前に」Cloudflare 側でやってくれる。

@Cloudflare · 2026-10-13
#infra#cloudflare#logpush#observability#logging#sql#privacy

どんなときに使う?

  • SIEM や分析基盤に送るログの量(=転送・取り込み・保存の料金)を減らしたい
  • /healthz や社内ホストなど、受け取った瞬間に捨てているレコードがある
  • 個人情報(クライアント IP など)を出力先に渡したくない
  • 複数 CDN のログを共通スキーマにそろえたい(provider 列を足す等)
  • これまで間に置いていた「整形用の Worker / Lambda / Fluentd」をやめたい

Birthday Week 2026 で GA。Free / Pro / Business / Enterprise の全プランで使える(Logpush 自体もセルフサーブ全プランに開放)。

やり方

  1. ダッシュボードの Logpush ページから Transformer Studio を開く(API でも作成可)
  2. 対象データセットを選ぶ(FROM に書くテーブル名=データセット。例: http_requests)
  3. SQL を書き、サンプルレコードでプレビュー
  4. 保存して、同じデータセットの 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 の料金ページを確認すること

出典

X の元の投稿を開く