diff --git a/.changeset/healthy-pianos-marry.md b/.changeset/healthy-pianos-marry.md new file mode 100644 index 0000000000..f176f1b4bf --- /dev/null +++ b/.changeset/healthy-pianos-marry.md @@ -0,0 +1,10 @@ +--- +"products-feed": patch +"klaviyo": patch +"app-avatax": patch +"cms-v2": patch +"search": patch +"smtp": patch +--- + +Use new way of creating logger from `@saleor/apps-logger` diff --git a/.changeset/violet-candles-hide.md b/.changeset/violet-candles-hide.md new file mode 100644 index 0000000000..7b2beb01c0 --- /dev/null +++ b/.changeset/violet-candles-hide.md @@ -0,0 +1,5 @@ +--- +"@saleor/apps-logger": minor +--- + +Renamed exported `logger` to `rootLogger` so we avoid collision of names when using `logger` in monorepo. Also `createLogger` function has been removed in favour of app defining it in their codebase. diff --git a/apps/avatax/scripts/migration-logger.ts b/apps/avatax/scripts/migration-logger.ts index a5295fbb22..2f6e15cbc4 100644 --- a/apps/avatax/scripts/migration-logger.ts +++ b/apps/avatax/scripts/migration-logger.ts @@ -1,16 +1,22 @@ // eslint-disable-next-line no-restricted-imports -import { attachLoggerConsoleTransport, createLogger, logger } from "@saleor/apps-logger"; +import { attachLoggerConsoleTransport, rootLogger } from "@saleor/apps-logger"; import { attachLoggerOtelTransport } from "@saleor/apps-logger/node"; import packageJson from "../package.json"; import { loggerContext } from "../src/logger-context"; -logger.settings.maskValuesOfKeys = ["username", "password", "token"]; +rootLogger.settings.maskValuesOfKeys = ["username", "password", "token"]; if (process.env.ENABLE_MIGRATION_CONSOLE_LOGGER === "true") { - attachLoggerConsoleTransport(logger); + attachLoggerConsoleTransport(rootLogger); } -attachLoggerOtelTransport(logger, packageJson.version, loggerContext); +attachLoggerOtelTransport(rootLogger, packageJson.version, loggerContext); -export { createLogger, logger }; +export const createMigrationScriptLogger = (name: string, params?: Record) => + rootLogger.getSubLogger( + { + name: name, + }, + params, + ); diff --git a/apps/avatax/scripts/run-webhooks-migration.ts b/apps/avatax/scripts/run-webhooks-migration.ts index 2002e28f25..a3e5ffc0f0 100644 --- a/apps/avatax/scripts/run-webhooks-migration.ts +++ b/apps/avatax/scripts/run-webhooks-migration.ts @@ -6,7 +6,7 @@ import { WebhookMigrationRunner } from "@saleor/webhook-utils"; import { createInstrumentedGraphqlClient } from "../src/lib/create-instrumented-graphql-client"; import { loggerContext } from "../src/logger-context"; import { appWebhooks } from "../webhooks"; -import { createLogger } from "./migration-logger"; +import { createMigrationScriptLogger } from "./migration-logger"; const requiredEnvs = ["REST_APL_TOKEN", "REST_APL_ENDPOINT"]; @@ -17,7 +17,7 @@ if (process.env.OTEL_ENABLED === "true" && process.env.OTEL_SERVICE_NAME) { otelSdk.start(); } -const logger = createLogger("RunWebhooksMigration"); +const logger = createMigrationScriptLogger("RunWebhooksMigration"); const runMigrations = async () => { if (!requiredEnvs.every((env) => process.env[env])) { diff --git a/apps/avatax/src/lib/app-configuration-logger.ts b/apps/avatax/src/lib/app-configuration-logger.ts index 4f590750b7..1ce7687e08 100644 --- a/apps/avatax/src/lib/app-configuration-logger.ts +++ b/apps/avatax/src/lib/app-configuration-logger.ts @@ -1,10 +1,10 @@ import { ObservabilityAttributes } from "@saleor/apps-otel/src/lib/observability-attributes"; -import { logger } from "../logger"; +import { createLogger } from "../logger"; import { AppConfig } from "./app-config"; export class AppConfigurationLogger { - constructor(private injectedLogger: Pick) {} + constructor(private injectedLogger: Pick, "info" | "warn">) {} logConfiguration(configuration: AppConfig, channelSlug: string) { const config = configuration.getConfigForChannelSlug(channelSlug); diff --git a/apps/avatax/src/lib/error-utils.ts b/apps/avatax/src/lib/error-utils.ts index 5148a7c90a..fead76d09b 100644 --- a/apps/avatax/src/lib/error-utils.ts +++ b/apps/avatax/src/lib/error-utils.ts @@ -1,8 +1,9 @@ import { TRPCClientError } from "@trpc/client"; import { GraphQLError } from "graphql"; +import { createLogger } from "@/logger"; + import { BaseError } from "../error"; -import { logger } from "../logger"; import { CalculateTaxesPayload } from "../modules/webhooks/payloads/calculate-taxes-payload"; import { OrderCancelledPayload } from "../modules/webhooks/payloads/order-cancelled-payload"; import { OrderConfirmedPayload } from "../modules/webhooks/payloads/order-confirmed-payload"; @@ -21,7 +22,7 @@ export class SubscriptionPayloadErrorChecker { private handledErrorPath = ["event", "taxBase", "sourceObject", "user"]; constructor( - private injectedLogger: Pick, + private injectedLogger: Pick, "error" | "info">, private injectedErrorCapture: ( exception: InstanceType, ) => void, diff --git a/apps/avatax/src/logger.ts b/apps/avatax/src/logger.ts index 7066353093..98e56b3043 100644 --- a/apps/avatax/src/logger.ts +++ b/apps/avatax/src/logger.ts @@ -1,11 +1,11 @@ -import { attachLoggerConsoleTransport, createLogger, logger } from "@saleor/apps-logger"; +import { attachLoggerConsoleTransport, rootLogger } from "@saleor/apps-logger"; import packageJson from "../package.json"; -logger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; +rootLogger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; if (process.env.NODE_ENV !== "production") { - attachLoggerConsoleTransport(logger); + attachLoggerConsoleTransport(rootLogger); } if (typeof window === "undefined") { @@ -15,15 +15,21 @@ if (typeof window === "undefined") { attachLoggerVercelTransport, } = require("@saleor/apps-logger/node"); - attachLoggerSentryTransport(logger); + attachLoggerSentryTransport(rootLogger); if (process.env.NODE_ENV === "production") { attachLoggerVercelTransport( - logger, + rootLogger, packageJson.version, require("./logger-context").loggerContext, ); } } -export { createLogger, logger }; +export const createLogger = (name: string, params?: Record) => + rootLogger.getSubLogger( + { + name: name, + }, + params, + ); diff --git a/apps/cms-v2/src/logger.ts b/apps/cms-v2/src/logger.ts index 9e15c779bd..7fff881509 100644 --- a/apps/cms-v2/src/logger.ts +++ b/apps/cms-v2/src/logger.ts @@ -1,10 +1,11 @@ -import { attachLoggerConsoleTransport, createLogger, logger } from "@saleor/apps-logger"; +import { attachLoggerConsoleTransport, rootLogger } from "@saleor/apps-logger"; + import packageJson from "../package.json"; -logger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; +rootLogger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; if (process.env.NODE_ENV !== "production") { - attachLoggerConsoleTransport(logger); + attachLoggerConsoleTransport(rootLogger); } if (typeof window === "undefined") { @@ -12,10 +13,16 @@ if (typeof window === "undefined") { async ({ attachLoggerOtelTransport, attachLoggerSentryTransport, LoggerContext }) => { const loggerContext = await import("./logger-context").then((m) => m.loggerContext); - attachLoggerSentryTransport(logger); - attachLoggerOtelTransport(logger, packageJson.version, loggerContext); + attachLoggerSentryTransport(rootLogger); + attachLoggerOtelTransport(rootLogger, packageJson.version, loggerContext); }, ); } -export { createLogger, logger }; +export const createLogger = (name: string, params?: Record) => + rootLogger.getSubLogger( + { + name: name, + }, + params, + ); diff --git a/apps/cms-v2/src/modules/providers/contentful/contentful-client.ts b/apps/cms-v2/src/modules/providers/contentful/contentful-client.ts index 0be30272e8..5f245ac4b5 100644 --- a/apps/cms-v2/src/modules/providers/contentful/contentful-client.ts +++ b/apps/cms-v2/src/modules/providers/contentful/contentful-client.ts @@ -1,9 +1,10 @@ +import * as Sentry from "@sentry/nextjs"; import { ClientAPI, createClient, Environment } from "contentful-management"; -import { WebhookProductVariantFragment } from "../../../../generated/graphql"; + +import { createLogger } from "@/logger"; import { ContentfulProviderConfig } from "@/modules/configuration"; -import * as Sentry from "@sentry/nextjs"; -import { createLogger, logger } from "@/logger"; +import { WebhookProductVariantFragment } from "../../../../generated/graphql"; type ConstructorOptions = { space: string; @@ -30,7 +31,7 @@ export class ContentfulClient { private client: ContentfulApiClientChunk; private space: string; - private logger: typeof logger; + private logger: ReturnType; constructor(opts: ConstructorOptions, clientFactory: SdkClientFactory = defaultSdkClientFactory) { this.space = opts.space; @@ -276,7 +277,7 @@ export class ContentfulClient { return this.uploadProductVariant({ configuration, variant }); } } catch (err) { - logger.error("Error during the upsert", { error: err }); + this.logger.error("Error during the upsert", { error: err }); Sentry.captureException(err); throw err; diff --git a/apps/cms-v2/src/modules/providers/payloadcms/payloadcms-bulk-sync-processor.ts b/apps/cms-v2/src/modules/providers/payloadcms/payloadcms-bulk-sync-processor.ts index f8faefa085..5d780c0390 100644 --- a/apps/cms-v2/src/modules/providers/payloadcms/payloadcms-bulk-sync-processor.ts +++ b/apps/cms-v2/src/modules/providers/payloadcms/payloadcms-bulk-sync-processor.ts @@ -1,9 +1,9 @@ +import { createLogger } from "@/logger"; +import { PayloadCmsProviderConfig } from "@/modules/configuration/schemas/payloadcms-provider.schema"; + import { BulkImportProductFragment } from "../../../../generated/graphql"; import { BulkSyncProcessor, BulkSyncProcessorHooks } from "../../bulk-sync/bulk-sync-processor"; - -import { PayloadCmsProviderConfig } from "@/modules/configuration/schemas/payloadcms-provider.schema"; import { PayloadCMSClient } from "./payloadcms-client"; -import { createLogger, logger } from "@/logger"; // todo CORS or proxy export class PayloadCmsBulkSyncProcessor implements BulkSyncProcessor { diff --git a/apps/cms-v2/src/modules/trpc/protected-client-procedure.ts b/apps/cms-v2/src/modules/trpc/protected-client-procedure.ts index 11a108d002..b4d77c08b3 100644 --- a/apps/cms-v2/src/modules/trpc/protected-client-procedure.ts +++ b/apps/cms-v2/src/modules/trpc/protected-client-procedure.ts @@ -1,11 +1,13 @@ +import { ProtectedHandlerError } from "@saleor/app-sdk/handlers/next"; import { verifyJWT } from "@saleor/app-sdk/verify-jwt"; -import { middleware, procedure } from "./trpc-server"; +import { REQUIRED_SALEOR_PERMISSIONS } from "@saleor/apps-shared"; import { TRPCError } from "@trpc/server"; -import { ProtectedHandlerError } from "@saleor/app-sdk/handlers/next"; + +import { createLogger } from "@/logger"; + import { saleorApp } from "../../saleor-app"; -import { createLogger, logger as appLogger } from "@/logger"; import { createInstrumentedGraphqlClient } from "./create-instrumented-graphql-client"; -import { REQUIRED_SALEOR_PERMISSIONS } from "@saleor/apps-shared"; +import { middleware, procedure } from "./trpc-server"; const logger = createLogger("protectedClientProcedure"); diff --git a/apps/klaviyo/src/logger.ts b/apps/klaviyo/src/logger.ts index 5f9ea20e99..edd114c535 100644 --- a/apps/klaviyo/src/logger.ts +++ b/apps/klaviyo/src/logger.ts @@ -1,10 +1,11 @@ -import { attachLoggerConsoleTransport, createLogger, logger } from "@saleor/apps-logger"; +import { attachLoggerConsoleTransport, rootLogger } from "@saleor/apps-logger"; + import packageJson from "../package.json"; -logger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; +rootLogger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; if (process.env.NODE_ENV !== "production") { - attachLoggerConsoleTransport(logger); + attachLoggerConsoleTransport(rootLogger); } if (typeof window === "undefined") { @@ -12,10 +13,16 @@ if (typeof window === "undefined") { async ({ attachLoggerOtelTransport, attachLoggerSentryTransport }) => { const loggerContext = await import("./logger-context").then((m) => m.loggerContext); - attachLoggerSentryTransport(logger); - attachLoggerOtelTransport(logger, packageJson.version, loggerContext); + attachLoggerSentryTransport(rootLogger); + attachLoggerOtelTransport(rootLogger, packageJson.version, loggerContext); }, ); } -export { createLogger, logger }; +export const createLogger = (name: string, params?: Record) => + rootLogger.getSubLogger( + { + name: name, + }, + params, + ); diff --git a/apps/products-feed/src/logger.ts b/apps/products-feed/src/logger.ts index 9e15c779bd..edd114c535 100644 --- a/apps/products-feed/src/logger.ts +++ b/apps/products-feed/src/logger.ts @@ -1,21 +1,28 @@ -import { attachLoggerConsoleTransport, createLogger, logger } from "@saleor/apps-logger"; +import { attachLoggerConsoleTransport, rootLogger } from "@saleor/apps-logger"; + import packageJson from "../package.json"; -logger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; +rootLogger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; if (process.env.NODE_ENV !== "production") { - attachLoggerConsoleTransport(logger); + attachLoggerConsoleTransport(rootLogger); } if (typeof window === "undefined") { import("@saleor/apps-logger/node").then( - async ({ attachLoggerOtelTransport, attachLoggerSentryTransport, LoggerContext }) => { + async ({ attachLoggerOtelTransport, attachLoggerSentryTransport }) => { const loggerContext = await import("./logger-context").then((m) => m.loggerContext); - attachLoggerSentryTransport(logger); - attachLoggerOtelTransport(logger, packageJson.version, loggerContext); + attachLoggerSentryTransport(rootLogger); + attachLoggerOtelTransport(rootLogger, packageJson.version, loggerContext); }, ); } -export { createLogger, logger }; +export const createLogger = (name: string, params?: Record) => + rootLogger.getSubLogger( + { + name: name, + }, + params, + ); diff --git a/apps/search/src/lib/logger.ts b/apps/search/src/lib/logger.ts index dcb48cb90a..25f3ebefe6 100644 --- a/apps/search/src/lib/logger.ts +++ b/apps/search/src/lib/logger.ts @@ -1,20 +1,27 @@ // eslint-disable-next-line no-restricted-imports -import { attachLoggerConsoleTransport, createLogger, logger } from "@saleor/apps-logger"; +import { attachLoggerConsoleTransport, rootLogger } from "@saleor/apps-logger"; + import packageJson from "../../package.json"; -logger.settings.maskValuesOfKeys = ["token", "secretKey"]; +rootLogger.settings.maskValuesOfKeys = ["token", "secretKey"]; if (process.env.NODE_ENV !== "production") { - attachLoggerConsoleTransport(logger); + attachLoggerConsoleTransport(rootLogger); } if (typeof window === "undefined") { import("@saleor/apps-logger/node").then( ({ attachLoggerOtelTransport, attachLoggerSentryTransport }) => { - attachLoggerSentryTransport(logger); - attachLoggerOtelTransport(logger, packageJson.version); + attachLoggerSentryTransport(rootLogger); + attachLoggerOtelTransport(rootLogger, packageJson.version); }, ); } -export { createLogger, logger }; +export const createLogger = (name: string, params?: Record) => + rootLogger.getSubLogger( + { + name: name, + }, + params, + ); diff --git a/apps/smtp/src/logger.ts b/apps/smtp/src/logger.ts index 5f9ea20e99..edd114c535 100644 --- a/apps/smtp/src/logger.ts +++ b/apps/smtp/src/logger.ts @@ -1,10 +1,11 @@ -import { attachLoggerConsoleTransport, createLogger, logger } from "@saleor/apps-logger"; +import { attachLoggerConsoleTransport, rootLogger } from "@saleor/apps-logger"; + import packageJson from "../package.json"; -logger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; +rootLogger.settings.maskValuesOfKeys = ["metadata", "username", "password", "apiKey"]; if (process.env.NODE_ENV !== "production") { - attachLoggerConsoleTransport(logger); + attachLoggerConsoleTransport(rootLogger); } if (typeof window === "undefined") { @@ -12,10 +13,16 @@ if (typeof window === "undefined") { async ({ attachLoggerOtelTransport, attachLoggerSentryTransport }) => { const loggerContext = await import("./logger-context").then((m) => m.loggerContext); - attachLoggerSentryTransport(logger); - attachLoggerOtelTransport(logger, packageJson.version, loggerContext); + attachLoggerSentryTransport(rootLogger); + attachLoggerOtelTransport(rootLogger, packageJson.version, loggerContext); }, ); } -export { createLogger, logger }; +export const createLogger = (name: string, params?: Record) => + rootLogger.getSubLogger( + { + name: name, + }, + params, + ); diff --git a/packages/logger/index.ts b/packages/logger/index.ts index 5d46d7a678..fd1dbecf01 100644 --- a/packages/logger/index.ts +++ b/packages/logger/index.ts @@ -1,2 +1,2 @@ -export { createLogger, logger } from "./src/logger"; export { attachLoggerConsoleTransport } from "./src/logger-console-transport"; +export { rootLogger } from "./src/root-logger"; diff --git a/packages/logger/src/logger.test.ts b/packages/logger/src/root-logger.test.ts similarity index 85% rename from packages/logger/src/logger.test.ts rename to packages/logger/src/root-logger.test.ts index a5cfc4e48e..7ae5e51904 100644 --- a/packages/logger/src/logger.test.ts +++ b/packages/logger/src/root-logger.test.ts @@ -2,9 +2,9 @@ import { logs } from "@opentelemetry/api-logs"; import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions"; import { describe, expect, it, vi } from "vitest"; -import { createLogger } from "./logger"; import { attachLoggerConsoleTransport } from "./logger-console-transport"; import { attachLoggerOtelTransport } from "./logger-otel-transport"; +import { rootLogger } from "./root-logger"; vi.spyOn(console, "log"); vi.setSystemTime(new Date(2024, 1, 1, 5, 15)); @@ -12,12 +12,15 @@ vi.setSystemTime(new Date(2024, 1, 1, 5, 15)); describe("Logger", () => { describe("Console Transport", () => { it("Prints message and nested object to the console, including attributes passed from the parent scope", () => { - const logger = createLogger("Test Logger", { - rootScopePrimitiveArg: 1, - rootScopeObjectArg: { - objectKey: "objectValue", + const logger = rootLogger.getSubLogger( + { name: "Test Logger" }, + { + rootScopePrimitiveArg: 1, + rootScopeObjectArg: { + objectKey: "objectValue", + }, }, - }); + ); attachLoggerConsoleTransport(logger); @@ -46,12 +49,15 @@ describe("Logger", () => { describe("Otel Transport", () => { it("Calls Open Telemetry logger emit() function, passing there required attributes", () => { - const logger = createLogger("Test Logger", { - rootScopePrimitiveArg: 1, - rootScopeObjectArg: { - objectKey: "objectValue", + const logger = rootLogger.getSubLogger( + { name: "Test Logger" }, + { + rootScopePrimitiveArg: 1, + rootScopeObjectArg: { + objectKey: "objectValue", + }, }, - }); + ); const mockOtelEmit = vi.fn(); @@ -96,15 +102,18 @@ describe("Logger", () => { }); it("Calls Open Telemetry logger emit() function, passing there error attribute", () => { - expect.assertions(3); - - const logger = createLogger("Test Logger", { - rootScopePrimitiveArg: 1, - rootScopeObjectArg: { - objectKey: "objectValue", + const logger = rootLogger.getSubLogger( + { name: "Test Logger" }, + { + rootScopePrimitiveArg: 1, + rootScopeObjectArg: { + objectKey: "objectValue", + }, + error: new Error("Error Message"), }, - error: new Error("Error Message"), - }); + ); + + expect.assertions(3); const mockOtelEmit = vi.fn().mockImplementation((log) => { const error = log.attributes.error; diff --git a/packages/logger/src/logger.ts b/packages/logger/src/root-logger.ts similarity index 84% rename from packages/logger/src/logger.ts rename to packages/logger/src/root-logger.ts index 6495458e6d..7549b4c511 100644 --- a/packages/logger/src/logger.ts +++ b/packages/logger/src/root-logger.ts @@ -25,10 +25,7 @@ function getMinLevel() { } } -/* - * TODO: Add test - */ -export const logger = new Logger({ +export const rootLogger = new Logger({ minLevel: getMinLevel(), hideLogPositionForProduction: true, /** @@ -55,11 +52,3 @@ export const logger = new Logger({ }, }, }); - -export const createLogger = (name: string, params?: Record) => - logger.getSubLogger( - { - name: name, - }, - params, - );