@degel_lc/logger 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -110,11 +110,6 @@ interface LoggerConfig {
110
110
  */
111
111
  declare function createClientLogger(config?: LoggerConfig): Logger;
112
112
 
113
- /**
114
- * サーバーサイド用ロガーを作成
115
- */
116
- declare function createServerLogger(config?: LoggerConfig): Promise<Logger>;
117
-
118
113
  /**
119
114
  * Sentry連携ヘルパー
120
115
  */
@@ -128,6 +123,12 @@ declare function setSentryModule(sentry: SentryModule): void;
128
123
  */
129
124
  declare function isSentryEnabled(): boolean;
130
125
 
126
+ /**
127
+ * サーバーサイド用ロガー作成関数(動的import)
128
+ * Next.jsなどのバンドラーでクライアント用にバンドルされる際に
129
+ * fsモジュールの解決エラーを防ぐため、動的importで提供
130
+ */
131
+ declare function createServerLogger(config?: LoggerConfig): Promise<Logger>;
131
132
  /**
132
133
  * グローバルシングルトン用の型定義
133
134
  * Next.js開発モードでのモジュール分離問題を解決するため、
package/dist/index.js CHANGED
@@ -1,7 +1,16 @@
1
1
  import pino from 'pino';
2
2
 
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __esm = (fn, res) => function __init() {
6
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ };
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+
3
13
  // src/utils.ts
4
- var DEFAULT_TIMEZONE_OFFSET = 540;
5
14
  function getCurrentDate(timezoneOffset = DEFAULT_TIMEZONE_OFFSET) {
6
15
  const now = /* @__PURE__ */ new Date();
7
16
  now.setTime(now.getTime() + timezoneOffset * 60 * 1e3);
@@ -62,69 +71,14 @@ ${error.stack}`;
62
71
  const contextPart = contextInfo ? ` ${contextInfo}` : "";
63
72
  return `${formattedDate}\uFF1A${errorType}\uFF1A${message}${contextPart}${errorInfo}`;
64
73
  }
65
-
66
- // src/client.ts
67
- var LOG_LEVEL_PRIORITY = {
68
- debug: 0,
69
- info: 1,
70
- warn: 2,
71
- error: 3,
72
- fatal: 4
73
- };
74
- function shouldLog(logLevel, minLevel) {
75
- return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];
76
- }
77
- function createClientLogger(config = {}) {
78
- const { timezoneOffset = 540, enableConsole = true, level = "debug" } = config;
79
- const validLevels = ["debug", "info", "warn", "error", "fatal"];
80
- const minLevel = validLevels.includes(level) ? level : "debug";
81
- const logToConsole = (logLevel, displayLevel, consoleMethod, ctxOrMessage, messageOrLocation, errorOrOriginal) => {
82
- if (!enableConsole) return;
83
- if (!shouldLog(logLevel, minLevel)) return;
84
- let formattedMessage;
85
- if (isLogContext(ctxOrMessage)) {
86
- formattedMessage = formatLogMessageWithContext(
87
- displayLevel,
88
- messageOrLocation ?? "",
89
- ctxOrMessage,
90
- errorOrOriginal,
91
- timezoneOffset
92
- );
93
- } else {
94
- formattedMessage = formatLogMessage(
95
- displayLevel,
96
- ctxOrMessage,
97
- messageOrLocation ?? null,
98
- errorOrOriginal ?? null,
99
- timezoneOffset
100
- );
101
- }
102
- consoleMethod(formattedMessage);
103
- };
104
- return {
105
- debug: (ctxOrMessage, messageOrLocation, originalError) => {
106
- logToConsole("debug", "debug", console.debug, ctxOrMessage, messageOrLocation, originalError);
107
- },
108
- info: (ctxOrMessage, messageOrLocation, originalError) => {
109
- logToConsole("info", "info", console.info, ctxOrMessage, messageOrLocation, originalError);
110
- },
111
- warn: (ctxOrMessage, messageOrLocation, originalError) => {
112
- logToConsole("warn", "warn", console.warn, ctxOrMessage, messageOrLocation, originalError);
113
- },
114
- error: (ctxOrMessage, messageOrLocation, originalError) => {
115
- logToConsole("error", "error", console.error, ctxOrMessage, messageOrLocation, originalError);
116
- },
117
- fatal: (ctxOrMessage, messageOrLocation, originalError) => {
118
- logToConsole("fatal", "fatal", console.error, ctxOrMessage, messageOrLocation, originalError);
119
- },
120
- sqlError: (message, location, originalError) => {
121
- logToConsole("error", "sql_error", console.error, message, location, originalError);
122
- }
123
- };
124
- }
74
+ var DEFAULT_TIMEZONE_OFFSET;
75
+ var init_utils = __esm({
76
+ "src/utils.ts"() {
77
+ DEFAULT_TIMEZONE_OFFSET = 540;
78
+ }
79
+ });
125
80
 
126
81
  // src/sentry.ts
127
- var sentryModule = null;
128
82
  function setSentryModule(sentry) {
129
83
  sentryModule = sentry;
130
84
  }
@@ -152,15 +106,18 @@ function captureError(ctx, message, error) {
152
106
  });
153
107
  }
154
108
  }
109
+ var sentryModule;
110
+ var init_sentry = __esm({
111
+ "src/sentry.ts"() {
112
+ sentryModule = null;
113
+ }
114
+ });
155
115
 
156
116
  // src/server.ts
157
- var LOG_LEVEL_PRIORITY2 = {
158
- debug: 0,
159
- info: 1,
160
- warn: 2,
161
- error: 3,
162
- fatal: 4
163
- };
117
+ var server_exports = {};
118
+ __export(server_exports, {
119
+ createServerLogger: () => createServerLogger
120
+ });
164
121
  function shouldLog2(logLevel, minLevel) {
165
122
  return LOG_LEVEL_PRIORITY2[logLevel] >= LOG_LEVEL_PRIORITY2[minLevel];
166
123
  }
@@ -306,8 +263,88 @@ async function createServerLogger(config = {}) {
306
263
  }
307
264
  };
308
265
  }
266
+ var LOG_LEVEL_PRIORITY2;
267
+ var init_server = __esm({
268
+ "src/server.ts"() {
269
+ init_sentry();
270
+ init_utils();
271
+ LOG_LEVEL_PRIORITY2 = {
272
+ debug: 0,
273
+ info: 1,
274
+ warn: 2,
275
+ error: 3,
276
+ fatal: 4
277
+ };
278
+ }
279
+ });
280
+
281
+ // src/client.ts
282
+ init_utils();
283
+ var LOG_LEVEL_PRIORITY = {
284
+ debug: 0,
285
+ info: 1,
286
+ warn: 2,
287
+ error: 3,
288
+ fatal: 4
289
+ };
290
+ function shouldLog(logLevel, minLevel) {
291
+ return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];
292
+ }
293
+ function createClientLogger(config = {}) {
294
+ const { timezoneOffset = 540, enableConsole = true, level = "debug" } = config;
295
+ const validLevels = ["debug", "info", "warn", "error", "fatal"];
296
+ const minLevel = validLevels.includes(level) ? level : "debug";
297
+ const logToConsole = (logLevel, displayLevel, consoleMethod, ctxOrMessage, messageOrLocation, errorOrOriginal) => {
298
+ if (!enableConsole) return;
299
+ if (!shouldLog(logLevel, minLevel)) return;
300
+ let formattedMessage;
301
+ if (isLogContext(ctxOrMessage)) {
302
+ formattedMessage = formatLogMessageWithContext(
303
+ displayLevel,
304
+ messageOrLocation ?? "",
305
+ ctxOrMessage,
306
+ errorOrOriginal,
307
+ timezoneOffset
308
+ );
309
+ } else {
310
+ formattedMessage = formatLogMessage(
311
+ displayLevel,
312
+ ctxOrMessage,
313
+ messageOrLocation ?? null,
314
+ errorOrOriginal ?? null,
315
+ timezoneOffset
316
+ );
317
+ }
318
+ consoleMethod(formattedMessage);
319
+ };
320
+ return {
321
+ debug: (ctxOrMessage, messageOrLocation, originalError) => {
322
+ logToConsole("debug", "debug", console.debug, ctxOrMessage, messageOrLocation, originalError);
323
+ },
324
+ info: (ctxOrMessage, messageOrLocation, originalError) => {
325
+ logToConsole("info", "info", console.info, ctxOrMessage, messageOrLocation, originalError);
326
+ },
327
+ warn: (ctxOrMessage, messageOrLocation, originalError) => {
328
+ logToConsole("warn", "warn", console.warn, ctxOrMessage, messageOrLocation, originalError);
329
+ },
330
+ error: (ctxOrMessage, messageOrLocation, originalError) => {
331
+ logToConsole("error", "error", console.error, ctxOrMessage, messageOrLocation, originalError);
332
+ },
333
+ fatal: (ctxOrMessage, messageOrLocation, originalError) => {
334
+ logToConsole("fatal", "fatal", console.error, ctxOrMessage, messageOrLocation, originalError);
335
+ },
336
+ sqlError: (message, location, originalError) => {
337
+ logToConsole("error", "sql_error", console.error, message, location, originalError);
338
+ }
339
+ };
340
+ }
309
341
 
310
342
  // src/index.ts
343
+ init_sentry();
344
+ async function createServerLogger2(config) {
345
+ const { createServerLogger: create } = await Promise.resolve().then(() => (init_server(), server_exports));
346
+ return create(config);
347
+ }
311
348
  function getLogger() {
312
349
  if (globalThis.__DEGEL_LOGGER__) {
313
350
  return globalThis.__DEGEL_LOGGER__;
@@ -328,7 +365,7 @@ async function initializeLogger(config) {
328
365
  if (typeof window !== "undefined") {
329
366
  globalThis.__DEGEL_LOGGER__ = createClientLogger(config);
330
367
  } else {
331
- globalThis.__DEGEL_LOGGER__ = await createServerLogger(config);
368
+ globalThis.__DEGEL_LOGGER__ = await createServerLogger2(config);
332
369
  }
333
370
  globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;
334
371
  return globalThis.__DEGEL_LOGGER__;
@@ -351,6 +388,6 @@ var logger = {
351
388
  };
352
389
  var index_default = logger;
353
390
 
354
- export { createClientLogger, createServerLogger, index_default as default, getLogger, initializeLogger, isSentryEnabled, logger, setSentryModule };
391
+ export { createClientLogger, createServerLogger2 as createServerLogger, index_default as default, getLogger, initializeLogger, isSentryEnabled, logger, setSentryModule };
355
392
  //# sourceMappingURL=index.js.map
356
393
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/client.ts","../src/sentry.ts","../src/server.ts","../src/index.ts"],"names":["LOG_LEVEL_PRIORITY","shouldLog","logger"],"mappings":"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","file":"index.js","sourcesContent":["import type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = 540; // JST = UTC+9 (in minutes)\n\n/**\n * 現在の日付を YYYY_MM_DD 形式で取得\n */\nexport function getCurrentDate(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n\n return `${year}_${month}_${day}`;\n}\n\n/**\n * 現在の日時をフォーマットする(タイムゾーン調整付き)\n */\nexport function getFormattedDateTime(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n const hours = String(now.getUTCHours()).padStart(2, '0');\n const minutes = String(now.getUTCMinutes()).padStart(2, '0');\n const seconds = String(now.getUTCSeconds()).padStart(2, '0');\n\n return `${year}_${month}_${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * ログメッセージをフォーマットする\n */\nexport function formatLogMessage(\n level: string,\n message: string,\n location: string | null,\n originalError: Error | string | null,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const locationInfo = location ?? 'Unknown';\n const original = originalError\n ? originalError.toString()\n : originalError === null\n ? message\n : 'なし';\n\n return `${formattedDate}:${errorType}:${message}:${locationInfo}:${original}`;\n}\n\n/**\n * 引数がLogContextかどうかを判定\n */\nexport function isLogContext(arg: unknown): arg is LogContext {\n return typeof arg === 'object' && arg !== null && !Array.isArray(arg) && typeof arg !== 'string';\n}\n\n/**\n * コンテキスト情報をフォーマットする\n */\nfunction formatContext(ctx: LogContext): string {\n const parts: string[] = [];\n\n if (ctx.path) parts.push(`path=${ctx.path}`);\n if (ctx.method) parts.push(`method=${ctx.method}`);\n if (ctx.userId) parts.push(`userId=${ctx.userId}`);\n if (ctx.tenantId) parts.push(`tenantId=${ctx.tenantId}`);\n if (ctx.location) parts.push(`location=${ctx.location}`);\n\n // その他のカスタムフィールド\n for (const [key, value] of Object.entries(ctx)) {\n if (\n !['path', 'method', 'userId', 'tenantId', 'location'].includes(key) &&\n value !== undefined\n ) {\n parts.push(`${key}=${String(value)}`);\n }\n }\n\n return parts.length > 0 ? `[${parts.join(', ')}]` : '';\n}\n\n/**\n * 構造化コンテキスト対応のログメッセージをフォーマットする\n */\nexport function formatLogMessageWithContext(\n level: string,\n message: string,\n ctx: LogContext,\n error: unknown,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const contextInfo = formatContext(ctx);\n\n let errorInfo = '';\n if (error instanceof Error) {\n errorInfo = ` | Error: ${error.message}`;\n if (error.stack) {\n errorInfo += `\\n${error.stack}`;\n }\n } else if (error !== undefined && error !== null) {\n errorInfo = ` | Error: ${String(error)}`;\n }\n\n const contextPart = contextInfo ? ` ${contextInfo}` : '';\n return `${formattedDate}:${errorType}:${message}${contextPart}${errorInfo}`;\n}\n","import type { LogContext, LogLevel, Logger, LoggerConfig } from './types.js';\nimport { formatLogMessage, formatLogMessageWithContext, isLogContext } from './utils.js';\n\n// ログレベルの優先度マップ\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * 指定されたログレベルが最小レベル以上かどうかを判定\n */\nfunction shouldLog(logLevel: LogLevel, minLevel: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];\n}\n\n/**\n * クライアントサイド用ロガーを作成\n */\nexport function createClientLogger(config: LoggerConfig = {}): Logger {\n const { timezoneOffset = 540, enableConsole = true, level = 'debug' } = config;\n\n // 有効なログレベルかどうかを検証\n const validLevels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'];\n const minLevel: LogLevel = validLevels.includes(level) ? level : 'debug';\n\n const logToConsole = (\n logLevel: LogLevel,\n displayLevel: string,\n consoleMethod: (...args: unknown[]) => void,\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n errorOrOriginal?: unknown\n ): void => {\n if (!enableConsole) return;\n if (!shouldLog(logLevel, minLevel)) return;\n\n let formattedMessage: string;\n\n if (isLogContext(ctxOrMessage)) {\n // 構造化コンテキスト形式: (ctx, message, error?)\n formattedMessage = formatLogMessageWithContext(\n displayLevel,\n messageOrLocation ?? '',\n ctxOrMessage,\n errorOrOriginal,\n timezoneOffset\n );\n } else {\n // レガシー形式: (message, location?, originalError?)\n formattedMessage = formatLogMessage(\n displayLevel,\n ctxOrMessage,\n (messageOrLocation as string) ?? null,\n (errorOrOriginal as Error | string) ?? null,\n timezoneOffset\n );\n }\n\n consoleMethod(formattedMessage);\n };\n\n return {\n debug: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('debug', 'debug', console.debug, ctxOrMessage, messageOrLocation, originalError);\n },\n info: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('info', 'info', console.info, ctxOrMessage, messageOrLocation, originalError);\n },\n warn: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('warn', 'warn', console.warn, ctxOrMessage, messageOrLocation, originalError);\n },\n error: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('error', 'error', console.error, ctxOrMessage, messageOrLocation, originalError);\n },\n fatal: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('fatal', 'fatal', console.error, ctxOrMessage, messageOrLocation, originalError);\n },\n sqlError: (\n message: string,\n location?: string | null,\n originalError?: Error | string | null\n ) => {\n // sqlErrorはerrorレベルとしてフィルタリング、表示はsql_error\n logToConsole('error', 'sql_error', console.error, message, location, originalError);\n },\n } as Logger;\n}\n","/**\n * Sentry連携ヘルパー\n */\n\nimport type { LogContext, SentryModule } from './types.js';\n\nlet sentryModule: SentryModule | null = null;\n\n/**\n * Sentryモジュールを設定\n */\nexport function setSentryModule(sentry: SentryModule): void {\n sentryModule = sentry;\n}\n\n/**\n * Sentryが有効かどうか\n */\nexport function isSentryEnabled(): boolean {\n return sentryModule !== null;\n}\n\n/**\n * Sentryモジュールをクリア(テスト用)\n */\nexport function clearSentryModule(): void {\n sentryModule = null;\n}\n\n/**\n * エラーをSentryに送信\n */\nexport function captureError(ctx: LogContext, message: string, error?: unknown): void {\n if (!sentryModule) return;\n\n if (error instanceof Error) {\n sentryModule.captureException(error, {\n extra: {\n ...ctx,\n message,\n },\n });\n } else if (error) {\n sentryModule.captureMessage(`${message}: ${String(error)}`, {\n level: 'error',\n extra: ctx,\n });\n } else {\n sentryModule.captureMessage(message, {\n level: 'error',\n extra: ctx,\n });\n }\n}\n","import pino from 'pino';\nimport { captureError, isSentryEnabled } from './sentry.js';\nimport type {\n LogContext,\n LogLevel,\n LogRotationFunction,\n LogTypeConfig,\n Logger,\n LoggerConfig,\n} from './types.js';\nimport {\n formatLogMessage,\n formatLogMessageWithContext,\n getCurrentDate,\n isLogContext,\n} from './utils.js';\n\n// ログレベルの優先度マップ\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * 指定されたログレベルが最小レベル以上かどうかを判定\n */\nfunction shouldLog(logLevel: LogLevel, minLevel: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];\n}\n\ninterface LoggerState {\n loggers: Record<string, pino.Logger>;\n rotationFunction: LogRotationFunction;\n intervalId: ReturnType<typeof setInterval> | undefined;\n}\n\n/**\n * サーバーサイド用ロガーを作成\n */\nexport async function createServerLogger(config: LoggerConfig = {}): Promise<Logger> {\n const {\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n logDir = process.env['LOG_DIR'] ?? `${process.cwd()}/logs`,\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n level = (process.env['LOG_LEVEL'] as LogLevel) ?? 'debug',\n timezoneOffset = 540,\n rotationCheckInterval = 60 * 60 * 1000, // 1時間\n enableSentry = false,\n } = config;\n\n // 有効なログレベルかどうかを検証\n const validLevels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'];\n const minLevel: LogLevel = validLevels.includes(level) ? level : 'debug';\n\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n // ログフォルダが存在しない場合は作成\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n\n // 各ログレベル用の設定\n const logTypes: Record<string, LogTypeConfig> = {\n debug: { fileNamePrefix: 'debug_log', level: 'debug' },\n info: { fileNamePrefix: 'info_log', level: 'info' },\n error: { fileNamePrefix: 'error_log', level: 'error' },\n fatal: { fileNamePrefix: 'fatal_log', level: 'fatal' },\n sqlError: { fileNamePrefix: 'sql_error_log', level: 'error' },\n };\n\n // ログストリームの作成関数\n function createLogStream(fileNamePrefix: string): ReturnType<typeof fs.createWriteStream> {\n const dateStr = getCurrentDate(timezoneOffset);\n const logFilePath = path.join(logDir, `${fileNamePrefix}_${dateStr}.log`);\n return fs.createWriteStream(logFilePath, { flags: 'a' });\n }\n\n // ロガーを作成する関数\n function createPinoLogger(fileNamePrefix: string): pino.Logger {\n return pino(\n {\n base: null,\n timestamp: false,\n messageKey: 'message',\n formatters: {\n level: () => ({}),\n bindings: () => ({}),\n },\n },\n createLogStream(fileNamePrefix)\n );\n }\n\n // 各ロガーの作成\n const state: LoggerState = {\n loggers: {},\n rotationFunction: (() => {}) as LogRotationFunction,\n intervalId: undefined,\n };\n\n for (const [type, logConfig] of Object.entries(logTypes)) {\n state.loggers[type] = createPinoLogger(logConfig.fileNamePrefix);\n }\n\n // ログファイルを日付変更時に切り替えるための関数\n const checkAndRotateLogFiles: LogRotationFunction = () => {\n const currentDate = getCurrentDate(timezoneOffset);\n\n if (checkAndRotateLogFiles.lastDate !== currentDate) {\n checkAndRotateLogFiles.lastDate = currentDate;\n\n for (const [type, logConfig] of Object.entries(logTypes)) {\n state.loggers[type] = createPinoLogger(logConfig.fileNamePrefix);\n }\n }\n };\n\n // 初期日付設定\n checkAndRotateLogFiles.lastDate = getCurrentDate(timezoneOffset);\n state.rotationFunction = checkAndRotateLogFiles;\n\n // ログローテーションのインターバル設定(テスト環境以外)\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n if (process.env['NODE_ENV'] !== 'test') {\n state.intervalId = setInterval(checkAndRotateLogFiles, rotationCheckInterval);\n }\n\n // 起動時に一度チェック\n checkAndRotateLogFiles();\n\n // カスタムフォーマットでログを出力する関数(レガシー形式)\n function formatAndLog(\n loggerType: string,\n logLevel: pino.Level,\n message: string,\n location: string | null,\n originalError: Error | string | null\n ): void {\n // ログレベルが最小レベル未満の場合はスキップ\n if (!shouldLog(logLevel as LogLevel, minLevel)) {\n return;\n }\n\n checkAndRotateLogFiles();\n\n const formattedMessage = formatLogMessage(\n logLevel,\n message,\n location,\n originalError,\n timezoneOffset\n );\n const logger = state.loggers[loggerType];\n\n if (logger) {\n logger[logLevel](formattedMessage);\n }\n }\n\n // 構造化コンテキスト対応のログ出力関数\n function formatAndLogWithContext(\n loggerType: string,\n logLevel: pino.Level,\n ctx: LogContext,\n message: string,\n error?: unknown,\n sendToSentry = false\n ): void {\n // ログレベルが最小レベル未満の場合はスキップ\n if (!shouldLog(logLevel as LogLevel, minLevel)) {\n return;\n }\n\n checkAndRotateLogFiles();\n\n const formattedMessage = formatLogMessageWithContext(\n logLevel,\n message,\n ctx,\n error,\n timezoneOffset\n );\n const logger = state.loggers[loggerType];\n\n if (logger) {\n logger[logLevel](formattedMessage);\n }\n\n // Sentry連携\n if (sendToSentry && enableSentry && isSentryEnabled()) {\n captureError(ctx, message, error);\n }\n }\n\n // オーバーロード対応のログ関数\n function createLogMethod(loggerType: string, logLevel: pino.Level, sendToSentry = false) {\n return (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n errorOrOriginal?: unknown\n ) => {\n if (isLogContext(ctxOrMessage)) {\n // 構造化コンテキスト形式\n formatAndLogWithContext(\n loggerType,\n logLevel,\n ctxOrMessage,\n messageOrLocation ?? '',\n errorOrOriginal,\n sendToSentry\n );\n } else {\n // レガシー形式\n formatAndLog(\n loggerType,\n logLevel,\n ctxOrMessage,\n (messageOrLocation as string) ?? null,\n (errorOrOriginal as Error | string) ?? null\n );\n\n // レガシー形式でもSentry送信(error/fatalの場合)\n if (sendToSentry && enableSentry && isSentryEnabled()) {\n const ctx: LogContext = messageOrLocation ? { location: messageOrLocation } : {};\n captureError(ctx, ctxOrMessage, errorOrOriginal);\n }\n }\n };\n }\n\n return {\n debug: createLogMethod('debug', 'debug'),\n info: createLogMethod('info', 'info'),\n warn: createLogMethod('info', 'warn'),\n error: createLogMethod('error', 'error', true),\n fatal: createLogMethod('fatal', 'fatal', true),\n sqlError: (\n message: string,\n location?: string | null,\n originalError?: Error | string | null\n ) => {\n formatAndLog('sqlError', 'error', message, location ?? null, originalError ?? null);\n },\n } as Logger;\n}\n","import { createClientLogger } from './client.js';\nimport { createServerLogger } from './server.js';\nimport type {\n LogContext,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n Logger,\n LoggerConfig,\n SentryModule,\n} from './types.js';\n\nexport type {\n LogContext,\n Logger,\n LoggerConfig,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n SentryModule,\n};\n\nexport { createClientLogger, createServerLogger };\nexport { isSentryEnabled, setSentryModule } from './sentry.js';\n\n/**\n * グローバルシングルトン用の型定義\n * Next.js開発モードでのモジュール分離問題を解決するため、\n * globalThisを使用してロガーインスタンスを共有する\n */\ndeclare global {\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER__: Logger | undefined;\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER_INITIALIZED__: boolean | undefined;\n}\n\n/**\n * 環境を判定してデフォルトのロガーを取得\n * サーバーサイドでは非同期初期化が必要なため、初回呼び出し時はクライアントロガーを返す\n */\nexport function getLogger(): Logger {\n // グローバルに初期化済みのロガーがあれば返す\n if (globalThis.__DEGEL_LOGGER__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n\n // クライアントサイドの場合\n if (typeof window !== 'undefined') {\n globalThis.__DEGEL_LOGGER__ = createClientLogger();\n return globalThis.__DEGEL_LOGGER__;\n }\n\n // サーバーサイドだが未初期化の場合は一時的にクライアントロガーを返す\n // initializeLogger()を呼び出すことで正しく初期化される\n if (!globalThis.__DEGEL_LOGGER_INITIALIZED__) {\n return createClientLogger();\n }\n\n return globalThis.__DEGEL_LOGGER__ ?? createClientLogger();\n}\n\n/**\n * サーバーサイド用の非同期初期化\n * Next.js等で使用する場合、アプリケーション起動時に呼び出す\n */\nexport async function initializeLogger(config?: LoggerConfig): Promise<Logger> {\n // 既に初期化済みの場合は既存のロガーを返す\n if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n\n if (typeof window !== 'undefined') {\n globalThis.__DEGEL_LOGGER__ = createClientLogger(config);\n } else {\n globalThis.__DEGEL_LOGGER__ = await createServerLogger(config);\n }\n globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;\n return globalThis.__DEGEL_LOGGER__;\n}\n\n/**\n * 共通ロガーオブジェクト(後方互換性のため)\n * サーバー/クライアントで自動的に適切なロガーを選択\n */\nexport const logger: Logger = {\n debug: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().debug(ctxOrMessage as string, messageOrLocation, originalError),\n info: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().info(ctxOrMessage as string, messageOrLocation, originalError),\n warn: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().warn(ctxOrMessage as string, messageOrLocation, originalError),\n error: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().error(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n fatal: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().fatal(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n sqlError: (message, location, originalError) =>\n getLogger().sqlError(message, location, originalError),\n} as Logger;\n\nexport default logger;\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/sentry.ts","../src/server.ts","../src/client.ts","../src/index.ts"],"names":["shouldLog","LOG_LEVEL_PRIORITY","logger","createServerLogger"],"mappings":"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","file":"index.js","sourcesContent":["import type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = 540; // JST = UTC+9 (in minutes)\n\n/**\n * 現在の日付を YYYY_MM_DD 形式で取得\n */\nexport function getCurrentDate(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n\n return `${year}_${month}_${day}`;\n}\n\n/**\n * 現在の日時をフォーマットする(タイムゾーン調整付き)\n */\nexport function getFormattedDateTime(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n const hours = String(now.getUTCHours()).padStart(2, '0');\n const minutes = String(now.getUTCMinutes()).padStart(2, '0');\n const seconds = String(now.getUTCSeconds()).padStart(2, '0');\n\n return `${year}_${month}_${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * ログメッセージをフォーマットする\n */\nexport function formatLogMessage(\n level: string,\n message: string,\n location: string | null,\n originalError: Error | string | null,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const locationInfo = location ?? 'Unknown';\n const original = originalError\n ? originalError.toString()\n : originalError === null\n ? message\n : 'なし';\n\n return `${formattedDate}:${errorType}:${message}:${locationInfo}:${original}`;\n}\n\n/**\n * 引数がLogContextかどうかを判定\n */\nexport function isLogContext(arg: unknown): arg is LogContext {\n return typeof arg === 'object' && arg !== null && !Array.isArray(arg) && typeof arg !== 'string';\n}\n\n/**\n * コンテキスト情報をフォーマットする\n */\nfunction formatContext(ctx: LogContext): string {\n const parts: string[] = [];\n\n if (ctx.path) parts.push(`path=${ctx.path}`);\n if (ctx.method) parts.push(`method=${ctx.method}`);\n if (ctx.userId) parts.push(`userId=${ctx.userId}`);\n if (ctx.tenantId) parts.push(`tenantId=${ctx.tenantId}`);\n if (ctx.location) parts.push(`location=${ctx.location}`);\n\n // その他のカスタムフィールド\n for (const [key, value] of Object.entries(ctx)) {\n if (\n !['path', 'method', 'userId', 'tenantId', 'location'].includes(key) &&\n value !== undefined\n ) {\n parts.push(`${key}=${String(value)}`);\n }\n }\n\n return parts.length > 0 ? `[${parts.join(', ')}]` : '';\n}\n\n/**\n * 構造化コンテキスト対応のログメッセージをフォーマットする\n */\nexport function formatLogMessageWithContext(\n level: string,\n message: string,\n ctx: LogContext,\n error: unknown,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const contextInfo = formatContext(ctx);\n\n let errorInfo = '';\n if (error instanceof Error) {\n errorInfo = ` | Error: ${error.message}`;\n if (error.stack) {\n errorInfo += `\\n${error.stack}`;\n }\n } else if (error !== undefined && error !== null) {\n errorInfo = ` | Error: ${String(error)}`;\n }\n\n const contextPart = contextInfo ? ` ${contextInfo}` : '';\n return `${formattedDate}:${errorType}:${message}${contextPart}${errorInfo}`;\n}\n","/**\n * Sentry連携ヘルパー\n */\n\nimport type { LogContext, SentryModule } from './types.js';\n\nlet sentryModule: SentryModule | null = null;\n\n/**\n * Sentryモジュールを設定\n */\nexport function setSentryModule(sentry: SentryModule): void {\n sentryModule = sentry;\n}\n\n/**\n * Sentryが有効かどうか\n */\nexport function isSentryEnabled(): boolean {\n return sentryModule !== null;\n}\n\n/**\n * Sentryモジュールをクリア(テスト用)\n */\nexport function clearSentryModule(): void {\n sentryModule = null;\n}\n\n/**\n * エラーをSentryに送信\n */\nexport function captureError(ctx: LogContext, message: string, error?: unknown): void {\n if (!sentryModule) return;\n\n if (error instanceof Error) {\n sentryModule.captureException(error, {\n extra: {\n ...ctx,\n message,\n },\n });\n } else if (error) {\n sentryModule.captureMessage(`${message}: ${String(error)}`, {\n level: 'error',\n extra: ctx,\n });\n } else {\n sentryModule.captureMessage(message, {\n level: 'error',\n extra: ctx,\n });\n }\n}\n","import pino from 'pino';\nimport { captureError, isSentryEnabled } from './sentry.js';\nimport type {\n LogContext,\n LogLevel,\n LogRotationFunction,\n LogTypeConfig,\n Logger,\n LoggerConfig,\n} from './types.js';\nimport {\n formatLogMessage,\n formatLogMessageWithContext,\n getCurrentDate,\n isLogContext,\n} from './utils.js';\n\n// ログレベルの優先度マップ\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * 指定されたログレベルが最小レベル以上かどうかを判定\n */\nfunction shouldLog(logLevel: LogLevel, minLevel: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];\n}\n\ninterface LoggerState {\n loggers: Record<string, pino.Logger>;\n rotationFunction: LogRotationFunction;\n intervalId: ReturnType<typeof setInterval> | undefined;\n}\n\n/**\n * サーバーサイド用ロガーを作成\n */\nexport async function createServerLogger(config: LoggerConfig = {}): Promise<Logger> {\n const {\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n logDir = process.env['LOG_DIR'] ?? `${process.cwd()}/logs`,\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n level = (process.env['LOG_LEVEL'] as LogLevel) ?? 'debug',\n timezoneOffset = 540,\n rotationCheckInterval = 60 * 60 * 1000, // 1時間\n enableSentry = false,\n } = config;\n\n // 有効なログレベルかどうかを検証\n const validLevels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'];\n const minLevel: LogLevel = validLevels.includes(level) ? level : 'debug';\n\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n // ログフォルダが存在しない場合は作成\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n\n // 各ログレベル用の設定\n const logTypes: Record<string, LogTypeConfig> = {\n debug: { fileNamePrefix: 'debug_log', level: 'debug' },\n info: { fileNamePrefix: 'info_log', level: 'info' },\n error: { fileNamePrefix: 'error_log', level: 'error' },\n fatal: { fileNamePrefix: 'fatal_log', level: 'fatal' },\n sqlError: { fileNamePrefix: 'sql_error_log', level: 'error' },\n };\n\n // ログストリームの作成関数\n function createLogStream(fileNamePrefix: string): ReturnType<typeof fs.createWriteStream> {\n const dateStr = getCurrentDate(timezoneOffset);\n const logFilePath = path.join(logDir, `${fileNamePrefix}_${dateStr}.log`);\n return fs.createWriteStream(logFilePath, { flags: 'a' });\n }\n\n // ロガーを作成する関数\n function createPinoLogger(fileNamePrefix: string): pino.Logger {\n return pino(\n {\n base: null,\n timestamp: false,\n messageKey: 'message',\n formatters: {\n level: () => ({}),\n bindings: () => ({}),\n },\n },\n createLogStream(fileNamePrefix)\n );\n }\n\n // 各ロガーの作成\n const state: LoggerState = {\n loggers: {},\n rotationFunction: (() => {}) as LogRotationFunction,\n intervalId: undefined,\n };\n\n for (const [type, logConfig] of Object.entries(logTypes)) {\n state.loggers[type] = createPinoLogger(logConfig.fileNamePrefix);\n }\n\n // ログファイルを日付変更時に切り替えるための関数\n const checkAndRotateLogFiles: LogRotationFunction = () => {\n const currentDate = getCurrentDate(timezoneOffset);\n\n if (checkAndRotateLogFiles.lastDate !== currentDate) {\n checkAndRotateLogFiles.lastDate = currentDate;\n\n for (const [type, logConfig] of Object.entries(logTypes)) {\n state.loggers[type] = createPinoLogger(logConfig.fileNamePrefix);\n }\n }\n };\n\n // 初期日付設定\n checkAndRotateLogFiles.lastDate = getCurrentDate(timezoneOffset);\n state.rotationFunction = checkAndRotateLogFiles;\n\n // ログローテーションのインターバル設定(テスト環境以外)\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n if (process.env['NODE_ENV'] !== 'test') {\n state.intervalId = setInterval(checkAndRotateLogFiles, rotationCheckInterval);\n }\n\n // 起動時に一度チェック\n checkAndRotateLogFiles();\n\n // カスタムフォーマットでログを出力する関数(レガシー形式)\n function formatAndLog(\n loggerType: string,\n logLevel: pino.Level,\n message: string,\n location: string | null,\n originalError: Error | string | null\n ): void {\n // ログレベルが最小レベル未満の場合はスキップ\n if (!shouldLog(logLevel as LogLevel, minLevel)) {\n return;\n }\n\n checkAndRotateLogFiles();\n\n const formattedMessage = formatLogMessage(\n logLevel,\n message,\n location,\n originalError,\n timezoneOffset\n );\n const logger = state.loggers[loggerType];\n\n if (logger) {\n logger[logLevel](formattedMessage);\n }\n }\n\n // 構造化コンテキスト対応のログ出力関数\n function formatAndLogWithContext(\n loggerType: string,\n logLevel: pino.Level,\n ctx: LogContext,\n message: string,\n error?: unknown,\n sendToSentry = false\n ): void {\n // ログレベルが最小レベル未満の場合はスキップ\n if (!shouldLog(logLevel as LogLevel, minLevel)) {\n return;\n }\n\n checkAndRotateLogFiles();\n\n const formattedMessage = formatLogMessageWithContext(\n logLevel,\n message,\n ctx,\n error,\n timezoneOffset\n );\n const logger = state.loggers[loggerType];\n\n if (logger) {\n logger[logLevel](formattedMessage);\n }\n\n // Sentry連携\n if (sendToSentry && enableSentry && isSentryEnabled()) {\n captureError(ctx, message, error);\n }\n }\n\n // オーバーロード対応のログ関数\n function createLogMethod(loggerType: string, logLevel: pino.Level, sendToSentry = false) {\n return (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n errorOrOriginal?: unknown\n ) => {\n if (isLogContext(ctxOrMessage)) {\n // 構造化コンテキスト形式\n formatAndLogWithContext(\n loggerType,\n logLevel,\n ctxOrMessage,\n messageOrLocation ?? '',\n errorOrOriginal,\n sendToSentry\n );\n } else {\n // レガシー形式\n formatAndLog(\n loggerType,\n logLevel,\n ctxOrMessage,\n (messageOrLocation as string) ?? null,\n (errorOrOriginal as Error | string) ?? null\n );\n\n // レガシー形式でもSentry送信(error/fatalの場合)\n if (sendToSentry && enableSentry && isSentryEnabled()) {\n const ctx: LogContext = messageOrLocation ? { location: messageOrLocation } : {};\n captureError(ctx, ctxOrMessage, errorOrOriginal);\n }\n }\n };\n }\n\n return {\n debug: createLogMethod('debug', 'debug'),\n info: createLogMethod('info', 'info'),\n warn: createLogMethod('info', 'warn'),\n error: createLogMethod('error', 'error', true),\n fatal: createLogMethod('fatal', 'fatal', true),\n sqlError: (\n message: string,\n location?: string | null,\n originalError?: Error | string | null\n ) => {\n formatAndLog('sqlError', 'error', message, location ?? null, originalError ?? null);\n },\n } as Logger;\n}\n","import type { LogContext, LogLevel, Logger, LoggerConfig } from './types.js';\nimport { formatLogMessage, formatLogMessageWithContext, isLogContext } from './utils.js';\n\n// ログレベルの優先度マップ\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * 指定されたログレベルが最小レベル以上かどうかを判定\n */\nfunction shouldLog(logLevel: LogLevel, minLevel: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];\n}\n\n/**\n * クライアントサイド用ロガーを作成\n */\nexport function createClientLogger(config: LoggerConfig = {}): Logger {\n const { timezoneOffset = 540, enableConsole = true, level = 'debug' } = config;\n\n // 有効なログレベルかどうかを検証\n const validLevels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'];\n const minLevel: LogLevel = validLevels.includes(level) ? level : 'debug';\n\n const logToConsole = (\n logLevel: LogLevel,\n displayLevel: string,\n consoleMethod: (...args: unknown[]) => void,\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n errorOrOriginal?: unknown\n ): void => {\n if (!enableConsole) return;\n if (!shouldLog(logLevel, minLevel)) return;\n\n let formattedMessage: string;\n\n if (isLogContext(ctxOrMessage)) {\n // 構造化コンテキスト形式: (ctx, message, error?)\n formattedMessage = formatLogMessageWithContext(\n displayLevel,\n messageOrLocation ?? '',\n ctxOrMessage,\n errorOrOriginal,\n timezoneOffset\n );\n } else {\n // レガシー形式: (message, location?, originalError?)\n formattedMessage = formatLogMessage(\n displayLevel,\n ctxOrMessage,\n (messageOrLocation as string) ?? null,\n (errorOrOriginal as Error | string) ?? null,\n timezoneOffset\n );\n }\n\n consoleMethod(formattedMessage);\n };\n\n return {\n debug: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('debug', 'debug', console.debug, ctxOrMessage, messageOrLocation, originalError);\n },\n info: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('info', 'info', console.info, ctxOrMessage, messageOrLocation, originalError);\n },\n warn: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('warn', 'warn', console.warn, ctxOrMessage, messageOrLocation, originalError);\n },\n error: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('error', 'error', console.error, ctxOrMessage, messageOrLocation, originalError);\n },\n fatal: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('fatal', 'fatal', console.error, ctxOrMessage, messageOrLocation, originalError);\n },\n sqlError: (\n message: string,\n location?: string | null,\n originalError?: Error | string | null\n ) => {\n // sqlErrorはerrorレベルとしてフィルタリング、表示はsql_error\n logToConsole('error', 'sql_error', console.error, message, location, originalError);\n },\n } as Logger;\n}\n","import { createClientLogger } from './client.js';\nimport type {\n LogContext,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n Logger,\n LoggerConfig,\n SentryModule,\n} from './types.js';\n\nexport type {\n LogContext,\n Logger,\n LoggerConfig,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n SentryModule,\n};\n\nexport { createClientLogger };\nexport { isSentryEnabled, setSentryModule } from './sentry.js';\n\n/**\n * サーバーサイド用ロガー作成関数(動的import)\n * Next.jsなどのバンドラーでクライアント用にバンドルされる際に\n * fsモジュールの解決エラーを防ぐため、動的importで提供\n */\nexport async function createServerLogger(\n config?: LoggerConfig\n): Promise<Logger> {\n const { createServerLogger: create } = await import('./server.js');\n return create(config);\n}\n\n/**\n * グローバルシングルトン用の型定義\n * Next.js開発モードでのモジュール分離問題を解決するため、\n * globalThisを使用してロガーインスタンスを共有する\n */\ndeclare global {\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER__: Logger | undefined;\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER_INITIALIZED__: boolean | undefined;\n}\n\n/**\n * 環境を判定してデフォルトのロガーを取得\n * サーバーサイドでは非同期初期化が必要なため、初回呼び出し時はクライアントロガーを返す\n */\nexport function getLogger(): Logger {\n // グローバルに初期化済みのロガーがあれば返す\n if (globalThis.__DEGEL_LOGGER__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n\n // クライアントサイドの場合\n if (typeof window !== 'undefined') {\n globalThis.__DEGEL_LOGGER__ = createClientLogger();\n return globalThis.__DEGEL_LOGGER__;\n }\n\n // サーバーサイドだが未初期化の場合は一時的にクライアントロガーを返す\n // initializeLogger()を呼び出すことで正しく初期化される\n if (!globalThis.__DEGEL_LOGGER_INITIALIZED__) {\n return createClientLogger();\n }\n\n return globalThis.__DEGEL_LOGGER__ ?? createClientLogger();\n}\n\n/**\n * サーバーサイド用の非同期初期化\n * Next.js等で使用する場合、アプリケーション起動時に呼び出す\n */\nexport async function initializeLogger(config?: LoggerConfig): Promise<Logger> {\n // 既に初期化済みの場合は既存のロガーを返す\n if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n\n if (typeof window !== 'undefined') {\n globalThis.__DEGEL_LOGGER__ = createClientLogger(config);\n } else {\n globalThis.__DEGEL_LOGGER__ = await createServerLogger(config);\n }\n globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;\n return globalThis.__DEGEL_LOGGER__;\n}\n\n/**\n * 共通ロガーオブジェクト(後方互換性のため)\n * サーバー/クライアントで自動的に適切なロガーを選択\n */\nexport const logger: Logger = {\n debug: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().debug(ctxOrMessage as string, messageOrLocation, originalError),\n info: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().info(ctxOrMessage as string, messageOrLocation, originalError),\n warn: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().warn(ctxOrMessage as string, messageOrLocation, originalError),\n error: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().error(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n fatal: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().fatal(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n sqlError: (message, location, originalError) =>\n getLogger().sqlError(message, location, originalError),\n} as Logger;\n\nexport default logger;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@degel_lc/logger",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "phsk関連プロジェクト共通のpino-basedロギングライブラリ",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",