Cloudflare WorkerとPinoを組み合わせた時に発生するエラーを修正する
備考
- 文章は人間が一生懸命タイピングしてます。
- コードは一部Claude Sonnet 4.5が書いています
経緯
Cloudflare Wroker × Pino (× Next.JS)を使っていると毎回500エラーが発生してしまい、デプロイすると正しくページが表示されなくなる問題が発生しました。
Cloudflare上でObservabilityからログをみるとCloudflare Worker "Failed to publish diagnostics channel message" Errorと表示されていました。
結論としては、PinoなどでDiagnostic Channelsの処理に不整合が発生してるためで、console.logで出力する際にJSON.stringify()を使ってあげれば解決しました。
解決策
import type { LogFn } from "pino"; import pino from "pino"; const isDevelopment = process.env.NODE_ENV !== "production"; const pinoConfig = { level: isDevelopment ? "debug" : "info", browser: { asObject: false, write: (o: object) => { console.log(JSON.stringify(o)); }, }, hooks: { logMethod( this: unknown, args: Parameters<LogFn>, _method: LogFn, level: number, ) { const consoleFn = level >= 50 ? console.error : level >= 40 ? console.warn : level >= 20 ? console.log : console.debug; consoleFn(...args); }, }, }; export const logger = pino({ ...pinoConfig, });
短いですが、以上です。