From 2a9b1fd2b528b740056f334fd4be6f61848ac803 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 20 Mar 2026 13:56:52 +0000 Subject: [PATCH] refactor: replace @axiomhq/pino with @axiomhq/js --- apps/web/Dockerfile | 8 ------ apps/web/next.config.js | 2 +- packages/logger/package.json | 2 +- packages/logger/src/index.ts | 48 ++++++++++++++++----------------- pnpm-lock.yaml | 51 +----------------------------------- 5 files changed, 25 insertions(+), 86 deletions(-) diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index 46de735b..c9246517 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -114,14 +114,6 @@ COPY --from=builder /app/apps/web/.next/standalone/ ./ COPY --from=builder /app/apps/web/.next/static/ ./apps/web/.next/static/ COPY --from=builder /app/apps/web/public/ ./apps/web/public/ -# Copy pino transport packages not detected by static analysis (loaded via worker threads) -COPY --from=builder /app/node_modules/@axiomhq/pino/ ./node_modules/@axiomhq/pino/ -COPY --from=builder /app/node_modules/@axiomhq/js/ ./node_modules/@axiomhq/js/ -COPY --from=builder /app/node_modules/pino-abstract-transport/ ./node_modules/pino-abstract-transport/ -COPY --from=builder /app/node_modules/thread-stream/ ./node_modules/thread-stream/ -COPY --from=builder /app/node_modules/real-require/ ./node_modules/real-require/ -COPY --from=builder /app/node_modules/split2/ ./node_modules/split2/ - # Copy bootstrap script for runtime env var injection COPY apps/web/bootstrap.cjs ./bootstrap.cjs diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 7553c07a..034a01aa 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -66,7 +66,7 @@ const config = { }, }, }, - serverExternalPackages: ["pino", "@axiomhq/pino", "pino-abstract-transport", "thread-stream"], + serverExternalPackages: ["pino"], experimental: { // instrumentationHook: true, diff --git a/packages/logger/package.json b/packages/logger/package.json index 24fc7536..b2f2c32e 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -19,7 +19,7 @@ "typecheck": "tsc --noEmit --emitDeclarationOnly false" }, "dependencies": { - "@axiomhq/pino": "^1.4.0", + "@axiomhq/js": "^1.4.0", "pino": "^9.14.0", "pino-pretty": "^13.1.3" }, diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts index 00c8530b..ec995364 100644 --- a/packages/logger/src/index.ts +++ b/packages/logger/src/index.ts @@ -1,3 +1,4 @@ +import { Axiom } from "@axiomhq/js"; import pino from "pino"; const isDev = process.env.NODE_ENV !== "production"; @@ -8,34 +9,29 @@ const axiomToken = process.env.AXIOM_TOKEN; const axiomDataset = process.env.AXIOM_DATASET; const useAxiom = isCloud && !!axiomToken && !!axiomDataset; -const targets: pino.TransportTargetOptions[] = []; - -if (isDev) { - targets.push({ - target: "pino-pretty", - options: { - colorize: true, - ignore: "pid,hostname", - translateTime: "HH:MM:ss", +function createAxiomStream(token: string, dataset: string): pino.DestinationStream { + const client = new Axiom({ token }); + return { + write(msg: string) { + try { + client.ingest(dataset, [JSON.parse(msg) as Record]); + } catch { + // ignore malformed log lines + } }, - }); + }; } -if (useAxiom) { - targets.push({ - target: "@axiomhq/pino", - options: { - dataset: axiomDataset, - token: axiomToken, - }, - }); -} - -export const logger = pino({ - level, - ...(targets.length > 0 && { - transport: { targets }, - }), -}); +export const logger = useAxiom + ? pino({ level }, pino.multistream([{ stream: createAxiomStream(axiomToken, axiomDataset), level }])) + : pino({ + level, + ...(isDev && { + transport: { + target: "pino-pretty", + options: { colorize: true, ignore: "pid,hostname", translateTime: "HH:MM:ss" }, + }, + }), + }); export const createLogger = (module: string) => logger.child({ module }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e11a60d..6a5dc9e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -504,7 +504,7 @@ importers: packages/logger: dependencies: - '@axiomhq/pino': + '@axiomhq/js': specifier: ^1.4.0 version: 1.4.0 pino: @@ -898,10 +898,6 @@ packages: resolution: {integrity: sha512-wC5x1ud/QJMstrjpicATkyY8+ZVWEl4WlXMtA5EZf7hkj0+b191yv4yynLxLEfr/MveXora9m6CWdJq4DsbcAg==} engines: {node: '>=20'} - '@axiomhq/pino@1.4.0': - resolution: {integrity: sha512-7ujZM1kqbA98BWl8ltWdTLSDE7+67nOvR30/hm8P6omISjaQV0xgtdtZtDGe/BH2VmZeQWPGfAI1FnUNYC3CtQ==} - engines: {node: '>=20'} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -4349,10 +4345,6 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -5572,10 +5564,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -7228,9 +7216,6 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pino-abstract-transport@1.2.0: - resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} - pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -7422,10 +7407,6 @@ packages: process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -7629,10 +7610,6 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.5.0: resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==} engines: {node: '>=8.10.0'} @@ -9421,11 +9398,6 @@ snapshots: dependencies: fetch-retry: 6.0.0 - '@axiomhq/pino@1.4.0': - dependencies: - '@axiomhq/js': 1.4.0 - pino-abstract-transport: 1.2.0 - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -12952,10 +12924,6 @@ snapshots: '@xtuc/long@4.2.2': {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -14377,8 +14345,6 @@ snapshots: esutils@2.0.3: {} - event-target-shim@5.0.1: {} - events@3.3.0: {} execa@5.1.1: @@ -16495,11 +16461,6 @@ snapshots: pify@2.3.0: {} - pino-abstract-transport@1.2.0: - dependencies: - readable-stream: 4.7.0 - split2: 4.2.0 - pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -16649,8 +16610,6 @@ snapshots: process-warning@5.0.0: {} - process@0.11.10: {} - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -16946,14 +16905,6 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - readdirp@3.5.0: dependencies: picomatch: 2.3.1