るちtechブログ

とあるサイトを作っています

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,
});

短いですが、以上です。

参考

github.com