@degel_lc/logger 0.1.8 → 0.2.0

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/browser.cjs CHANGED
@@ -2,26 +2,26 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkUDIZDVDO_cjs = require('./chunk-UDIZDVDO.cjs');
6
- var chunk3QE5XQOJ_cjs = require('./chunk-3QE5XQOJ.cjs');
5
+ var chunkASPXOLET_cjs = require('./chunk-ASPXOLET.cjs');
6
+ var chunkLR6LZRSG_cjs = require('./chunk-LR6LZRSG.cjs');
7
7
 
8
8
  // src/browser.ts
9
9
  async function createServerLogger(_config) {
10
10
  console.warn("[logger] createServerLogger is not available in browser/edge environment");
11
- return chunkUDIZDVDO_cjs.createClientLogger(_config);
11
+ return chunkASPXOLET_cjs.createClientLogger(_config);
12
12
  }
13
13
  function getLogger() {
14
14
  if (globalThis.__DEGEL_LOGGER__) {
15
15
  return globalThis.__DEGEL_LOGGER__;
16
16
  }
17
- globalThis.__DEGEL_LOGGER__ = chunkUDIZDVDO_cjs.createClientLogger();
17
+ globalThis.__DEGEL_LOGGER__ = chunkASPXOLET_cjs.createClientLogger();
18
18
  return globalThis.__DEGEL_LOGGER__;
19
19
  }
20
20
  async function initializeLogger(config) {
21
21
  if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {
22
22
  return globalThis.__DEGEL_LOGGER__;
23
23
  }
24
- globalThis.__DEGEL_LOGGER__ = chunkUDIZDVDO_cjs.createClientLogger(config);
24
+ globalThis.__DEGEL_LOGGER__ = chunkASPXOLET_cjs.createClientLogger(config);
25
25
  globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;
26
26
  return globalThis.__DEGEL_LOGGER__;
27
27
  }
@@ -45,35 +45,35 @@ var browser_default = logger;
45
45
 
46
46
  Object.defineProperty(exports, "createClientLogger", {
47
47
  enumerable: true,
48
- get: function () { return chunkUDIZDVDO_cjs.createClientLogger; }
48
+ get: function () { return chunkASPXOLET_cjs.createClientLogger; }
49
49
  });
50
50
  Object.defineProperty(exports, "LOG_FILE_PREFIX", {
51
51
  enumerable: true,
52
- get: function () { return chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX; }
52
+ get: function () { return chunkLR6LZRSG_cjs.LOG_FILE_PREFIX; }
53
53
  });
54
54
  Object.defineProperty(exports, "LOG_LEVEL_PRIORITY", {
55
55
  enumerable: true,
56
- get: function () { return chunk3QE5XQOJ_cjs.LOG_LEVEL_PRIORITY; }
56
+ get: function () { return chunkLR6LZRSG_cjs.LOG_LEVEL_PRIORITY; }
57
57
  });
58
58
  Object.defineProperty(exports, "LOG_ROTATION", {
59
59
  enumerable: true,
60
- get: function () { return chunk3QE5XQOJ_cjs.LOG_ROTATION; }
60
+ get: function () { return chunkLR6LZRSG_cjs.LOG_ROTATION; }
61
61
  });
62
62
  Object.defineProperty(exports, "TIMEZONE", {
63
63
  enumerable: true,
64
- get: function () { return chunk3QE5XQOJ_cjs.TIMEZONE; }
64
+ get: function () { return chunkLR6LZRSG_cjs.TIMEZONE; }
65
65
  });
66
66
  Object.defineProperty(exports, "VALID_LOG_LEVELS", {
67
67
  enumerable: true,
68
- get: function () { return chunk3QE5XQOJ_cjs.VALID_LOG_LEVELS; }
68
+ get: function () { return chunkLR6LZRSG_cjs.VALID_LOG_LEVELS; }
69
69
  });
70
70
  Object.defineProperty(exports, "isSentryEnabled", {
71
71
  enumerable: true,
72
- get: function () { return chunk3QE5XQOJ_cjs.isSentryEnabled; }
72
+ get: function () { return chunkLR6LZRSG_cjs.isSentryEnabled; }
73
73
  });
74
74
  Object.defineProperty(exports, "setSentryModule", {
75
75
  enumerable: true,
76
- get: function () { return chunk3QE5XQOJ_cjs.setSentryModule; }
76
+ get: function () { return chunkLR6LZRSG_cjs.setSentryModule; }
77
77
  });
78
78
  exports.createServerLogger = createServerLogger;
79
79
  exports.default = browser_default;
@@ -1,5 +1,5 @@
1
- import { L as Logger, a as LoggerConfig } from './constants-Dw2vmgrv.cjs';
2
- export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-Dw2vmgrv.cjs';
1
+ import { L as Logger, a as LoggerConfig } from './constants-AnC0HL88.cjs';
2
+ export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-AnC0HL88.cjs';
3
3
  import 'pino';
4
4
 
5
5
  /**
package/dist/browser.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { L as Logger, a as LoggerConfig } from './constants-Dw2vmgrv.js';
2
- export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-Dw2vmgrv.js';
1
+ import { L as Logger, a as LoggerConfig } from './constants-AnC0HL88.js';
2
+ export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-AnC0HL88.js';
3
3
  import 'pino';
4
4
 
5
5
  /**
package/dist/browser.js CHANGED
@@ -1,6 +1,6 @@
1
- import { createClientLogger } from './chunk-4NWY6SZL.js';
2
- export { createClientLogger } from './chunk-4NWY6SZL.js';
3
- export { LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, isSentryEnabled, setSentryModule } from './chunk-B7IDJBGL.js';
1
+ import { createClientLogger } from './chunk-YW5AQEU4.js';
2
+ export { createClientLogger } from './chunk-YW5AQEU4.js';
3
+ export { LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, isSentryEnabled, setSentryModule } from './chunk-XZN52OK2.js';
4
4
 
5
5
  // src/browser.ts
6
6
  async function createServerLogger(_config) {
@@ -1,20 +1,20 @@
1
1
  'use strict';
2
2
 
3
- var chunk3QE5XQOJ_cjs = require('./chunk-3QE5XQOJ.cjs');
3
+ var chunkLR6LZRSG_cjs = require('./chunk-LR6LZRSG.cjs');
4
4
 
5
5
  // src/client.ts
6
6
  function shouldLog(logLevel, minLevel) {
7
- return chunk3QE5XQOJ_cjs.LOG_LEVEL_PRIORITY[logLevel] >= chunk3QE5XQOJ_cjs.LOG_LEVEL_PRIORITY[minLevel];
7
+ return chunkLR6LZRSG_cjs.LOG_LEVEL_PRIORITY[logLevel] >= chunkLR6LZRSG_cjs.LOG_LEVEL_PRIORITY[minLevel];
8
8
  }
9
9
  function createClientLogger(config = {}) {
10
10
  const { timezoneOffset = 540, enableConsole = true, level = "debug" } = config;
11
- const minLevel = chunk3QE5XQOJ_cjs.VALID_LOG_LEVELS.includes(level) ? level : "debug";
11
+ const minLevel = chunkLR6LZRSG_cjs.VALID_LOG_LEVELS.includes(level) ? level : "debug";
12
12
  const logToConsole = (logLevel, displayLevel, consoleMethod, ctxOrMessage, messageOrLocation, errorOrOriginal) => {
13
13
  if (!enableConsole) return;
14
14
  if (!shouldLog(logLevel, minLevel)) return;
15
15
  let formattedMessage;
16
- if (chunk3QE5XQOJ_cjs.isLogContext(ctxOrMessage)) {
17
- formattedMessage = chunk3QE5XQOJ_cjs.formatLogMessageWithContext(
16
+ if (chunkLR6LZRSG_cjs.isLogContext(ctxOrMessage)) {
17
+ formattedMessage = chunkLR6LZRSG_cjs.formatLogMessageWithContext(
18
18
  displayLevel,
19
19
  messageOrLocation ?? "",
20
20
  ctxOrMessage,
@@ -22,7 +22,7 @@ function createClientLogger(config = {}) {
22
22
  timezoneOffset
23
23
  );
24
24
  } else {
25
- formattedMessage = chunk3QE5XQOJ_cjs.formatLogMessage(
25
+ formattedMessage = chunkLR6LZRSG_cjs.formatLogMessage(
26
26
  displayLevel,
27
27
  ctxOrMessage,
28
28
  messageOrLocation ?? null,
@@ -55,5 +55,5 @@ function createClientLogger(config = {}) {
55
55
  }
56
56
 
57
57
  exports.createClientLogger = createClientLogger;
58
- //# sourceMappingURL=chunk-UDIZDVDO.cjs.map
59
- //# sourceMappingURL=chunk-UDIZDVDO.cjs.map
58
+ //# sourceMappingURL=chunk-ASPXOLET.cjs.map
59
+ //# sourceMappingURL=chunk-ASPXOLET.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"names":["LOG_LEVEL_PRIORITY","VALID_LOG_LEVELS","isLogContext","formatLogMessageWithContext","formatLogMessage"],"mappings":";;;;;AAOA,SAAS,SAAA,CAAU,UAAoB,QAAA,EAA6B;AAClE,EAAA,OAAOA,oCAAA,CAAmB,QAAQ,CAAA,IAAKA,oCAAA,CAAmB,QAAQ,CAAA;AACpE;AAKO,SAAS,kBAAA,CAAmB,MAAA,GAAuB,EAAC,EAAW;AACpE,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAK,gBAAgB,IAAA,EAAM,KAAA,GAAQ,SAAQ,GAAI,MAAA;AAGxE,EAAA,MAAM,QAAA,GAAqBC,kCAAA,CAAiB,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,OAAA;AAEtE,EAAA,MAAM,eAAe,CACnB,QAAA,EACA,cACA,aAAA,EACA,YAAA,EACA,mBACA,eAAA,KACS;AACT,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA,EAAG;AAEpC,IAAA,IAAI,gBAAA;AAEJ,IAAA,IAAIC,8BAAA,CAAa,YAAY,CAAA,EAAG;AAE9B,MAAA,gBAAA,GAAmBC,6CAAA;AAAA,QACjB,YAAA;AAAA,QACA,iBAAA,IAAqB,EAAA;AAAA,QACrB,YAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,gBAAA,GAAmBC,kCAAA;AAAA,QACjB,YAAA;AAAA,QACA,YAAA;AAAA,QACC,iBAAA,IAAgC,IAAA;AAAA,QAChC,eAAA,IAAsC,IAAA;AAAA,QACvC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,QAAA,EAAU,CACR,OAAA,EACA,QAAA,EACA,aAAA,KACG;AAEH,MAAA,YAAA,CAAa,SAAS,WAAA,EAAa,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,aAAa,CAAA;AAAA,IACpF;AAAA,GACF;AACF","file":"chunk-UDIZDVDO.cjs","sourcesContent":["import { LOG_LEVEL_PRIORITY, VALID_LOG_LEVELS } from './constants.js';\nimport type { LogContext, LogLevel, Logger, LoggerConfig } from './types.js';\nimport { formatLogMessage, formatLogMessageWithContext, isLogContext } from './utils.js';\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 minLevel: LogLevel = VALID_LOG_LEVELS.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"]}
1
+ {"version":3,"sources":["../src/client.ts"],"names":["LOG_LEVEL_PRIORITY","VALID_LOG_LEVELS","isLogContext","formatLogMessageWithContext","formatLogMessage"],"mappings":";;;;;AAOA,SAAS,SAAA,CAAU,UAAoB,QAAA,EAA6B;AAClE,EAAA,OAAOA,oCAAA,CAAmB,QAAQ,CAAA,IAAKA,oCAAA,CAAmB,QAAQ,CAAA;AACpE;AAKO,SAAS,kBAAA,CAAmB,MAAA,GAAuB,EAAC,EAAW;AACpE,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAK,gBAAgB,IAAA,EAAM,KAAA,GAAQ,SAAQ,GAAI,MAAA;AAGxE,EAAA,MAAM,QAAA,GAAqBC,kCAAA,CAAiB,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,OAAA;AAEtE,EAAA,MAAM,eAAe,CACnB,QAAA,EACA,cACA,aAAA,EACA,YAAA,EACA,mBACA,eAAA,KACS;AACT,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA,EAAG;AAEpC,IAAA,IAAI,gBAAA;AAEJ,IAAA,IAAIC,8BAAA,CAAa,YAAY,CAAA,EAAG;AAE9B,MAAA,gBAAA,GAAmBC,6CAAA;AAAA,QACjB,YAAA;AAAA,QACA,iBAAA,IAAqB,EAAA;AAAA,QACrB,YAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,gBAAA,GAAmBC,kCAAA;AAAA,QACjB,YAAA;AAAA,QACA,YAAA;AAAA,QACC,iBAAA,IAAgC,IAAA;AAAA,QAChC,eAAA,IAAsC,IAAA;AAAA,QACvC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,QAAA,EAAU,CACR,OAAA,EACA,QAAA,EACA,aAAA,KACG;AAEH,MAAA,YAAA,CAAa,SAAS,WAAA,EAAa,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,aAAa,CAAA;AAAA,IACpF;AAAA,GACF;AACF","file":"chunk-ASPXOLET.cjs","sourcesContent":["import { LOG_LEVEL_PRIORITY, VALID_LOG_LEVELS } from './constants.js';\nimport type { LogContext, LogLevel, Logger, LoggerConfig } from './types.js';\nimport { formatLogMessage, formatLogMessageWithContext, isLogContext } from './utils.js';\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 minLevel: LogLevel = VALID_LOG_LEVELS.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"]}
@@ -23,6 +23,14 @@ var LOG_ROTATION = {
23
23
  /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */
24
24
  DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1e3
25
25
  };
26
+ var LOG_RETENTION = {
27
+ /** デフォルトのログ保持日数 */
28
+ DEFAULT_DAYS: 7
29
+ };
30
+ var LOG_DIR = {
31
+ /** デフォルトのログ出力ディレクトリ(/tmp は Vercel 等のサーバーレス環境で書き込み可能) */
32
+ DEFAULT: "/tmp/logs"
33
+ };
26
34
  var LOG_FILE_PREFIX = {
27
35
  DEBUG: "debug_log",
28
36
  INFO: "info_log",
@@ -128,8 +136,10 @@ function captureError(ctx, message, error) {
128
136
  }
129
137
  }
130
138
 
139
+ exports.LOG_DIR = LOG_DIR;
131
140
  exports.LOG_FILE_PREFIX = LOG_FILE_PREFIX;
132
141
  exports.LOG_LEVEL_PRIORITY = LOG_LEVEL_PRIORITY;
142
+ exports.LOG_RETENTION = LOG_RETENTION;
133
143
  exports.LOG_ROTATION = LOG_ROTATION;
134
144
  exports.TIMEZONE = TIMEZONE;
135
145
  exports.VALID_LOG_LEVELS = VALID_LOG_LEVELS;
@@ -140,5 +150,5 @@ exports.getCurrentDate = getCurrentDate;
140
150
  exports.isLogContext = isLogContext;
141
151
  exports.isSentryEnabled = isSentryEnabled;
142
152
  exports.setSentryModule = setSentryModule;
143
- //# sourceMappingURL=chunk-3QE5XQOJ.cjs.map
144
- //# sourceMappingURL=chunk-3QE5XQOJ.cjs.map
153
+ //# sourceMappingURL=chunk-LR6LZRSG.cjs.map
154
+ //# sourceMappingURL=chunk-LR6LZRSG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/sentry.ts"],"names":[],"mappings":"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","file":"chunk-LR6LZRSG.cjs","sourcesContent":["/**\n * ログレベル関連の定数\n */\n\nimport type { LogLevel } from './types.js';\n\n/**\n * 有効なログレベル一覧\n * LogLevel型と同期した配列\n */\nexport const VALID_LOG_LEVELS: readonly LogLevel[] = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'fatal',\n] as const;\n\n/**\n * ログレベルの優先度マップ\n * 数値が大きいほど優先度が高い\n */\nexport const 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 */\nexport const TIMEZONE = {\n /** 日本標準時(JST)のUTCオフセット(分) */\n JST_OFFSET_MINUTES: 540 as number,\n};\n\n/**\n * ログローテーション関連\n */\nexport const LOG_ROTATION = {\n /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */\n DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1000,\n} as const;\n\n/**\n * ログリテンション(保持期間)関連\n */\nexport const LOG_RETENTION = {\n /** デフォルトのログ保持日数 */\n DEFAULT_DAYS: 7,\n} as const;\n\n/**\n * ログディレクトリ関連\n */\nexport const LOG_DIR = {\n /** デフォルトのログ出力ディレクトリ(/tmp は Vercel 等のサーバーレス環境で書き込み可能) */\n DEFAULT: '/tmp/logs',\n} as const;\n\n/**\n * ログファイル名プレフィックス\n */\nexport const LOG_FILE_PREFIX = {\n DEBUG: 'debug_log',\n INFO: 'info_log',\n ERROR: 'error_log',\n FATAL: 'fatal_log',\n SQL_ERROR: 'sql_error_log',\n} as const;\n\n/**\n * ログメッセージ関連の定数\n */\nexport const LOG_MESSAGES = {\n /** エラー情報がない場合のデフォルト表示 */\n NO_ERROR: 'なし',\n} as const;\n","import { LOG_MESSAGES, TIMEZONE } from './constants.js';\nimport type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_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 : LOG_MESSAGES.NO_ERROR;\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"]}
@@ -21,6 +21,14 @@ var LOG_ROTATION = {
21
21
  /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */
22
22
  DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1e3
23
23
  };
24
+ var LOG_RETENTION = {
25
+ /** デフォルトのログ保持日数 */
26
+ DEFAULT_DAYS: 7
27
+ };
28
+ var LOG_DIR = {
29
+ /** デフォルトのログ出力ディレクトリ(/tmp は Vercel 等のサーバーレス環境で書き込み可能) */
30
+ DEFAULT: "/tmp/logs"
31
+ };
24
32
  var LOG_FILE_PREFIX = {
25
33
  DEBUG: "debug_log",
26
34
  INFO: "info_log",
@@ -126,6 +134,6 @@ function captureError(ctx, message, error) {
126
134
  }
127
135
  }
128
136
 
129
- export { LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, captureError, formatLogMessage, formatLogMessageWithContext, getCurrentDate, isLogContext, isSentryEnabled, setSentryModule };
130
- //# sourceMappingURL=chunk-B7IDJBGL.js.map
131
- //# sourceMappingURL=chunk-B7IDJBGL.js.map
137
+ export { LOG_DIR, LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_RETENTION, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, captureError, formatLogMessage, formatLogMessageWithContext, getCurrentDate, isLogContext, isSentryEnabled, setSentryModule };
138
+ //# sourceMappingURL=chunk-XZN52OK2.js.map
139
+ //# sourceMappingURL=chunk-XZN52OK2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/sentry.ts"],"names":[],"mappings":"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","file":"chunk-XZN52OK2.js","sourcesContent":["/**\n * ログレベル関連の定数\n */\n\nimport type { LogLevel } from './types.js';\n\n/**\n * 有効なログレベル一覧\n * LogLevel型と同期した配列\n */\nexport const VALID_LOG_LEVELS: readonly LogLevel[] = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'fatal',\n] as const;\n\n/**\n * ログレベルの優先度マップ\n * 数値が大きいほど優先度が高い\n */\nexport const 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 */\nexport const TIMEZONE = {\n /** 日本標準時(JST)のUTCオフセット(分) */\n JST_OFFSET_MINUTES: 540 as number,\n};\n\n/**\n * ログローテーション関連\n */\nexport const LOG_ROTATION = {\n /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */\n DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1000,\n} as const;\n\n/**\n * ログリテンション(保持期間)関連\n */\nexport const LOG_RETENTION = {\n /** デフォルトのログ保持日数 */\n DEFAULT_DAYS: 7,\n} as const;\n\n/**\n * ログディレクトリ関連\n */\nexport const LOG_DIR = {\n /** デフォルトのログ出力ディレクトリ(/tmp は Vercel 等のサーバーレス環境で書き込み可能) */\n DEFAULT: '/tmp/logs',\n} as const;\n\n/**\n * ログファイル名プレフィックス\n */\nexport const LOG_FILE_PREFIX = {\n DEBUG: 'debug_log',\n INFO: 'info_log',\n ERROR: 'error_log',\n FATAL: 'fatal_log',\n SQL_ERROR: 'sql_error_log',\n} as const;\n\n/**\n * ログメッセージ関連の定数\n */\nexport const LOG_MESSAGES = {\n /** エラー情報がない場合のデフォルト表示 */\n NO_ERROR: 'なし',\n} as const;\n","import { LOG_MESSAGES, TIMEZONE } from './constants.js';\nimport type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_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 : LOG_MESSAGES.NO_ERROR;\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"]}
@@ -1,4 +1,4 @@
1
- import { VALID_LOG_LEVELS, isLogContext, formatLogMessageWithContext, formatLogMessage, LOG_LEVEL_PRIORITY } from './chunk-B7IDJBGL.js';
1
+ import { VALID_LOG_LEVELS, isLogContext, formatLogMessageWithContext, formatLogMessage, LOG_LEVEL_PRIORITY } from './chunk-XZN52OK2.js';
2
2
 
3
3
  // src/client.ts
4
4
  function shouldLog(logLevel, minLevel) {
@@ -53,5 +53,5 @@ function createClientLogger(config = {}) {
53
53
  }
54
54
 
55
55
  export { createClientLogger };
56
- //# sourceMappingURL=chunk-4NWY6SZL.js.map
57
- //# sourceMappingURL=chunk-4NWY6SZL.js.map
56
+ //# sourceMappingURL=chunk-YW5AQEU4.js.map
57
+ //# sourceMappingURL=chunk-YW5AQEU4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;AAOA,SAAS,SAAA,CAAU,UAAoB,QAAA,EAA6B;AAClE,EAAA,OAAO,kBAAA,CAAmB,QAAQ,CAAA,IAAK,kBAAA,CAAmB,QAAQ,CAAA;AACpE;AAKO,SAAS,kBAAA,CAAmB,MAAA,GAAuB,EAAC,EAAW;AACpE,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAK,gBAAgB,IAAA,EAAM,KAAA,GAAQ,SAAQ,GAAI,MAAA;AAGxE,EAAA,MAAM,QAAA,GAAqB,gBAAA,CAAiB,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,OAAA;AAEtE,EAAA,MAAM,eAAe,CACnB,QAAA,EACA,cACA,aAAA,EACA,YAAA,EACA,mBACA,eAAA,KACS;AACT,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA,EAAG;AAEpC,IAAA,IAAI,gBAAA;AAEJ,IAAA,IAAI,YAAA,CAAa,YAAY,CAAA,EAAG;AAE9B,MAAA,gBAAA,GAAmB,2BAAA;AAAA,QACjB,YAAA;AAAA,QACA,iBAAA,IAAqB,EAAA;AAAA,QACrB,YAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,gBAAA,GAAmB,gBAAA;AAAA,QACjB,YAAA;AAAA,QACA,YAAA;AAAA,QACC,iBAAA,IAAgC,IAAA;AAAA,QAChC,eAAA,IAAsC,IAAA;AAAA,QACvC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,QAAA,EAAU,CACR,OAAA,EACA,QAAA,EACA,aAAA,KACG;AAEH,MAAA,YAAA,CAAa,SAAS,WAAA,EAAa,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,aAAa,CAAA;AAAA,IACpF;AAAA,GACF;AACF","file":"chunk-4NWY6SZL.js","sourcesContent":["import { LOG_LEVEL_PRIORITY, VALID_LOG_LEVELS } from './constants.js';\nimport type { LogContext, LogLevel, Logger, LoggerConfig } from './types.js';\nimport { formatLogMessage, formatLogMessageWithContext, isLogContext } from './utils.js';\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 minLevel: LogLevel = VALID_LOG_LEVELS.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"]}
1
+ {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;AAOA,SAAS,SAAA,CAAU,UAAoB,QAAA,EAA6B;AAClE,EAAA,OAAO,kBAAA,CAAmB,QAAQ,CAAA,IAAK,kBAAA,CAAmB,QAAQ,CAAA;AACpE;AAKO,SAAS,kBAAA,CAAmB,MAAA,GAAuB,EAAC,EAAW;AACpE,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAK,gBAAgB,IAAA,EAAM,KAAA,GAAQ,SAAQ,GAAI,MAAA;AAGxE,EAAA,MAAM,QAAA,GAAqB,gBAAA,CAAiB,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,OAAA;AAEtE,EAAA,MAAM,eAAe,CACnB,QAAA,EACA,cACA,aAAA,EACA,YAAA,EACA,mBACA,eAAA,KACS;AACT,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA,EAAG;AAEpC,IAAA,IAAI,gBAAA;AAEJ,IAAA,IAAI,YAAA,CAAa,YAAY,CAAA,EAAG;AAE9B,MAAA,gBAAA,GAAmB,2BAAA;AAAA,QACjB,YAAA;AAAA,QACA,iBAAA,IAAqB,EAAA;AAAA,QACrB,YAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,gBAAA,GAAmB,gBAAA;AAAA,QACjB,YAAA;AAAA,QACA,YAAA;AAAA,QACC,iBAAA,IAAgC,IAAA;AAAA,QAChC,eAAA,IAAsC,IAAA;AAAA,QACvC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,QAAA,EAAU,CACR,OAAA,EACA,QAAA,EACA,aAAA,KACG;AAEH,MAAA,YAAA,CAAa,SAAS,WAAA,EAAa,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,aAAa,CAAA;AAAA,IACpF;AAAA,GACF;AACF","file":"chunk-YW5AQEU4.js","sourcesContent":["import { LOG_LEVEL_PRIORITY, VALID_LOG_LEVELS } from './constants.js';\nimport type { LogContext, LogLevel, Logger, LoggerConfig } from './types.js';\nimport { formatLogMessage, formatLogMessageWithContext, isLogContext } from './utils.js';\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 minLevel: LogLevel = VALID_LOG_LEVELS.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"]}
@@ -103,6 +103,12 @@ interface LoggerConfig {
103
103
  * @default false
104
104
  */
105
105
  enableSentry?: boolean;
106
+ /**
107
+ * ログファイルの保持日数
108
+ * 起動時に古いログファイルを自動削除する
109
+ * @default 7
110
+ */
111
+ retentionDays?: number;
106
112
  }
107
113
 
108
114
  /**
@@ -151,6 +157,20 @@ declare const LOG_ROTATION: {
151
157
  /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */
152
158
  readonly DEFAULT_CHECK_INTERVAL_MS: number;
153
159
  };
160
+ /**
161
+ * ログリテンション(保持期間)関連
162
+ */
163
+ declare const LOG_RETENTION: {
164
+ /** デフォルトのログ保持日数 */
165
+ readonly DEFAULT_DAYS: 7;
166
+ };
167
+ /**
168
+ * ログディレクトリ関連
169
+ */
170
+ declare const LOG_DIR: {
171
+ /** デフォルトのログ出力ディレクトリ(/tmp は Vercel 等のサーバーレス環境で書き込み可能) */
172
+ readonly DEFAULT: "/tmp/logs";
173
+ };
154
174
  /**
155
175
  * ログファイル名プレフィックス
156
176
  */
@@ -162,4 +182,4 @@ declare const LOG_FILE_PREFIX: {
162
182
  readonly SQL_ERROR: "sql_error_log";
163
183
  };
164
184
 
165
- export { type Logger as L, type SentryModule as S, TIMEZONE as T, VALID_LOG_LEVELS as V, type LoggerConfig as a, type LogContext as b, type LogLevel as c, type LogMethod as d, type LogMethodWithContext as e, type LogTypeConfig as f, createClientLogger as g, LOG_FILE_PREFIX as h, isSentryEnabled as i, LOG_LEVEL_PRIORITY as j, LOG_ROTATION as k, setSentryModule as s };
185
+ export { type Logger as L, type SentryModule as S, TIMEZONE as T, VALID_LOG_LEVELS as V, type LoggerConfig as a, type LogContext as b, type LogLevel as c, type LogMethod as d, type LogMethodWithContext as e, type LogTypeConfig as f, createClientLogger as g, LOG_FILE_PREFIX as h, isSentryEnabled as i, LOG_LEVEL_PRIORITY as j, LOG_ROTATION as k, LOG_DIR as l, LOG_RETENTION as m, setSentryModule as s };
@@ -103,6 +103,12 @@ interface LoggerConfig {
103
103
  * @default false
104
104
  */
105
105
  enableSentry?: boolean;
106
+ /**
107
+ * ログファイルの保持日数
108
+ * 起動時に古いログファイルを自動削除する
109
+ * @default 7
110
+ */
111
+ retentionDays?: number;
106
112
  }
107
113
 
108
114
  /**
@@ -151,6 +157,20 @@ declare const LOG_ROTATION: {
151
157
  /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */
152
158
  readonly DEFAULT_CHECK_INTERVAL_MS: number;
153
159
  };
160
+ /**
161
+ * ログリテンション(保持期間)関連
162
+ */
163
+ declare const LOG_RETENTION: {
164
+ /** デフォルトのログ保持日数 */
165
+ readonly DEFAULT_DAYS: 7;
166
+ };
167
+ /**
168
+ * ログディレクトリ関連
169
+ */
170
+ declare const LOG_DIR: {
171
+ /** デフォルトのログ出力ディレクトリ(/tmp は Vercel 等のサーバーレス環境で書き込み可能) */
172
+ readonly DEFAULT: "/tmp/logs";
173
+ };
154
174
  /**
155
175
  * ログファイル名プレフィックス
156
176
  */
@@ -162,4 +182,4 @@ declare const LOG_FILE_PREFIX: {
162
182
  readonly SQL_ERROR: "sql_error_log";
163
183
  };
164
184
 
165
- export { type Logger as L, type SentryModule as S, TIMEZONE as T, VALID_LOG_LEVELS as V, type LoggerConfig as a, type LogContext as b, type LogLevel as c, type LogMethod as d, type LogMethodWithContext as e, type LogTypeConfig as f, createClientLogger as g, LOG_FILE_PREFIX as h, isSentryEnabled as i, LOG_LEVEL_PRIORITY as j, LOG_ROTATION as k, setSentryModule as s };
185
+ export { type Logger as L, type SentryModule as S, TIMEZONE as T, VALID_LOG_LEVELS as V, type LoggerConfig as a, type LogContext as b, type LogLevel as c, type LogMethod as d, type LogMethodWithContext as e, type LogTypeConfig as f, createClientLogger as g, LOG_FILE_PREFIX as h, isSentryEnabled as i, LOG_LEVEL_PRIORITY as j, LOG_ROTATION as k, LOG_DIR as l, LOG_RETENTION as m, setSentryModule as s };
package/dist/index.cjs CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkUDIZDVDO_cjs = require('./chunk-UDIZDVDO.cjs');
6
- var chunk3QE5XQOJ_cjs = require('./chunk-3QE5XQOJ.cjs');
5
+ var chunkASPXOLET_cjs = require('./chunk-ASPXOLET.cjs');
6
+ var chunkLR6LZRSG_cjs = require('./chunk-LR6LZRSG.cjs');
7
7
 
8
8
  // src/index.ts
9
9
  async function createServerLogger(config) {
10
- const { createServerLogger: create } = await import('./server-E7QYW63S.cjs');
10
+ const { createServerLogger: create } = await import('./server-GAFSZR3C.cjs');
11
11
  return create(config);
12
12
  }
13
13
  function getLogger() {
@@ -15,20 +15,20 @@ function getLogger() {
15
15
  return globalThis.__DEGEL_LOGGER__;
16
16
  }
17
17
  if (typeof window !== "undefined") {
18
- globalThis.__DEGEL_LOGGER__ = chunkUDIZDVDO_cjs.createClientLogger();
18
+ globalThis.__DEGEL_LOGGER__ = chunkASPXOLET_cjs.createClientLogger();
19
19
  return globalThis.__DEGEL_LOGGER__;
20
20
  }
21
21
  if (!globalThis.__DEGEL_LOGGER_INITIALIZED__) {
22
- return chunkUDIZDVDO_cjs.createClientLogger();
22
+ return chunkASPXOLET_cjs.createClientLogger();
23
23
  }
24
- return globalThis.__DEGEL_LOGGER__ ?? chunkUDIZDVDO_cjs.createClientLogger();
24
+ return globalThis.__DEGEL_LOGGER__ ?? chunkASPXOLET_cjs.createClientLogger();
25
25
  }
26
26
  async function initializeLogger(config) {
27
27
  if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {
28
28
  return globalThis.__DEGEL_LOGGER__;
29
29
  }
30
30
  if (typeof window !== "undefined") {
31
- globalThis.__DEGEL_LOGGER__ = chunkUDIZDVDO_cjs.createClientLogger(config);
31
+ globalThis.__DEGEL_LOGGER__ = chunkASPXOLET_cjs.createClientLogger(config);
32
32
  } else {
33
33
  globalThis.__DEGEL_LOGGER__ = await createServerLogger(config);
34
34
  }
@@ -55,35 +55,43 @@ var index_default = logger;
55
55
 
56
56
  Object.defineProperty(exports, "createClientLogger", {
57
57
  enumerable: true,
58
- get: function () { return chunkUDIZDVDO_cjs.createClientLogger; }
58
+ get: function () { return chunkASPXOLET_cjs.createClientLogger; }
59
+ });
60
+ Object.defineProperty(exports, "LOG_DIR", {
61
+ enumerable: true,
62
+ get: function () { return chunkLR6LZRSG_cjs.LOG_DIR; }
59
63
  });
60
64
  Object.defineProperty(exports, "LOG_FILE_PREFIX", {
61
65
  enumerable: true,
62
- get: function () { return chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX; }
66
+ get: function () { return chunkLR6LZRSG_cjs.LOG_FILE_PREFIX; }
63
67
  });
64
68
  Object.defineProperty(exports, "LOG_LEVEL_PRIORITY", {
65
69
  enumerable: true,
66
- get: function () { return chunk3QE5XQOJ_cjs.LOG_LEVEL_PRIORITY; }
70
+ get: function () { return chunkLR6LZRSG_cjs.LOG_LEVEL_PRIORITY; }
71
+ });
72
+ Object.defineProperty(exports, "LOG_RETENTION", {
73
+ enumerable: true,
74
+ get: function () { return chunkLR6LZRSG_cjs.LOG_RETENTION; }
67
75
  });
68
76
  Object.defineProperty(exports, "LOG_ROTATION", {
69
77
  enumerable: true,
70
- get: function () { return chunk3QE5XQOJ_cjs.LOG_ROTATION; }
78
+ get: function () { return chunkLR6LZRSG_cjs.LOG_ROTATION; }
71
79
  });
72
80
  Object.defineProperty(exports, "TIMEZONE", {
73
81
  enumerable: true,
74
- get: function () { return chunk3QE5XQOJ_cjs.TIMEZONE; }
82
+ get: function () { return chunkLR6LZRSG_cjs.TIMEZONE; }
75
83
  });
76
84
  Object.defineProperty(exports, "VALID_LOG_LEVELS", {
77
85
  enumerable: true,
78
- get: function () { return chunk3QE5XQOJ_cjs.VALID_LOG_LEVELS; }
86
+ get: function () { return chunkLR6LZRSG_cjs.VALID_LOG_LEVELS; }
79
87
  });
80
88
  Object.defineProperty(exports, "isSentryEnabled", {
81
89
  enumerable: true,
82
- get: function () { return chunk3QE5XQOJ_cjs.isSentryEnabled; }
90
+ get: function () { return chunkLR6LZRSG_cjs.isSentryEnabled; }
83
91
  });
84
92
  Object.defineProperty(exports, "setSentryModule", {
85
93
  enumerable: true,
86
- get: function () { return chunk3QE5XQOJ_cjs.setSentryModule; }
94
+ get: function () { return chunkLR6LZRSG_cjs.setSentryModule; }
87
95
  });
88
96
  exports.createServerLogger = createServerLogger;
89
97
  exports.default = index_default;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["createClientLogger"],"mappings":";;;;;;;;AAwCA,eAAsB,mBAAmB,MAAA,EAAwC;AAC/E,EAAA,MAAM,EAAE,kBAAA,EAAoB,MAAA,EAAO,GAAI,MAAM,OAAO,uBAAa,CAAA;AACjE,EAAA,OAAO,OAAO,MAAM,CAAA;AACtB;AAkBO,SAAS,SAAA,GAAoB;AAElC,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,mBAAmBA,oCAAA,EAAmB;AACjD,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAIA,EAAA,IAAI,CAAC,WAAW,4BAAA,EAA8B;AAC5C,IAAA,OAAOA,oCAAA,EAAmB;AAAA,EAC5B;AAEA,EAAA,OAAO,UAAA,CAAW,oBAAoBA,oCAAA,EAAmB;AAC3D;AAMA,eAAsB,iBAAiB,MAAA,EAAwC;AAE7E,EAAA,IAAI,UAAA,CAAW,gBAAA,IAAoB,UAAA,CAAW,4BAAA,EAA8B;AAC1E,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,gBAAA,GAAmBA,qCAAmB,MAAM,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,gBAAA,GAAmB,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAC/D;AACA,EAAA,UAAA,CAAW,4BAAA,GAA+B,IAAA;AAC1C,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAMO,IAAM,MAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA,CAAM,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC5E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,aAAA,KAC5B,WAAU,CAAE,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,aAAa;AACzD;AAEA,IAAO,aAAA,GAAQ","file":"index.cjs","sourcesContent":["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// Constants\nexport {\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\n\n/**\n * サーバーサイド用ロガー作成関数(動的import)\n * Next.jsなどのバンドラーでクライアント用にバンドルされる際に\n * fsモジュールの解決エラーを防ぐため、動的importで提供\n */\nexport async function createServerLogger(config?: LoggerConfig): 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"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["createClientLogger"],"mappings":";;;;;;;;AA0CA,eAAsB,mBAAmB,MAAA,EAAwC;AAC/E,EAAA,MAAM,EAAE,kBAAA,EAAoB,MAAA,EAAO,GAAI,MAAM,OAAO,uBAAa,CAAA;AACjE,EAAA,OAAO,OAAO,MAAM,CAAA;AACtB;AAkBO,SAAS,SAAA,GAAoB;AAElC,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,mBAAmBA,oCAAA,EAAmB;AACjD,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAIA,EAAA,IAAI,CAAC,WAAW,4BAAA,EAA8B;AAC5C,IAAA,OAAOA,oCAAA,EAAmB;AAAA,EAC5B;AAEA,EAAA,OAAO,UAAA,CAAW,oBAAoBA,oCAAA,EAAmB;AAC3D;AAMA,eAAsB,iBAAiB,MAAA,EAAwC;AAE7E,EAAA,IAAI,UAAA,CAAW,gBAAA,IAAoB,UAAA,CAAW,4BAAA,EAA8B;AAC1E,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,gBAAA,GAAmBA,qCAAmB,MAAM,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,gBAAA,GAAmB,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAC/D;AACA,EAAA,UAAA,CAAW,4BAAA,GAA+B,IAAA;AAC1C,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAMO,IAAM,MAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA,CAAM,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC5E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,aAAA,KAC5B,WAAU,CAAE,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,aAAa;AACzD;AAEA,IAAO,aAAA,GAAQ","file":"index.cjs","sourcesContent":["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// Constants\nexport {\n LOG_DIR,\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_RETENTION,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\n\n/**\n * サーバーサイド用ロガー作成関数(動的import)\n * Next.jsなどのバンドラーでクライアント用にバンドルされる際に\n * fsモジュールの解決エラーを防ぐため、動的importで提供\n */\nexport async function createServerLogger(config?: LoggerConfig): 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/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { L as Logger, a as LoggerConfig } from './constants-Dw2vmgrv.cjs';
2
- export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-Dw2vmgrv.cjs';
1
+ import { L as Logger, a as LoggerConfig } from './constants-AnC0HL88.cjs';
2
+ export { l as LOG_DIR, h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, m as LOG_RETENTION, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-AnC0HL88.cjs';
3
3
  import 'pino';
4
4
 
5
5
  /**
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { L as Logger, a as LoggerConfig } from './constants-Dw2vmgrv.js';
2
- export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-Dw2vmgrv.js';
1
+ import { L as Logger, a as LoggerConfig } from './constants-AnC0HL88.js';
2
+ export { l as LOG_DIR, h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, m as LOG_RETENTION, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-AnC0HL88.js';
3
3
  import 'pino';
4
4
 
5
5
  /**
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import { createClientLogger } from './chunk-4NWY6SZL.js';
2
- export { createClientLogger } from './chunk-4NWY6SZL.js';
3
- export { LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, isSentryEnabled, setSentryModule } from './chunk-B7IDJBGL.js';
1
+ import { createClientLogger } from './chunk-YW5AQEU4.js';
2
+ export { createClientLogger } from './chunk-YW5AQEU4.js';
3
+ export { LOG_DIR, LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_RETENTION, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, isSentryEnabled, setSentryModule } from './chunk-XZN52OK2.js';
4
4
 
5
5
  // src/index.ts
6
6
  async function createServerLogger(config) {
7
- const { createServerLogger: create } = await import('./server-EIDMRA6K.js');
7
+ const { createServerLogger: create } = await import('./server-22NDXYBV.js');
8
8
  return create(config);
9
9
  }
10
10
  function getLogger() {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAwCA,eAAsB,mBAAmB,MAAA,EAAwC;AAC/E,EAAA,MAAM,EAAE,kBAAA,EAAoB,MAAA,EAAO,GAAI,MAAM,OAAO,sBAAa,CAAA;AACjE,EAAA,OAAO,OAAO,MAAM,CAAA;AACtB;AAkBO,SAAS,SAAA,GAAoB;AAElC,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,mBAAmB,kBAAA,EAAmB;AACjD,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAIA,EAAA,IAAI,CAAC,WAAW,4BAAA,EAA8B;AAC5C,IAAA,OAAO,kBAAA,EAAmB;AAAA,EAC5B;AAEA,EAAA,OAAO,UAAA,CAAW,oBAAoB,kBAAA,EAAmB;AAC3D;AAMA,eAAsB,iBAAiB,MAAA,EAAwC;AAE7E,EAAA,IAAI,UAAA,CAAW,gBAAA,IAAoB,UAAA,CAAW,4BAAA,EAA8B;AAC1E,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,gBAAA,GAAmB,mBAAmB,MAAM,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,gBAAA,GAAmB,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAC/D;AACA,EAAA,UAAA,CAAW,4BAAA,GAA+B,IAAA;AAC1C,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAMO,IAAM,MAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA,CAAM,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC5E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,aAAA,KAC5B,WAAU,CAAE,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,aAAa;AACzD;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["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// Constants\nexport {\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\n\n/**\n * サーバーサイド用ロガー作成関数(動的import)\n * Next.jsなどのバンドラーでクライアント用にバンドルされる際に\n * fsモジュールの解決エラーを防ぐため、動的importで提供\n */\nexport async function createServerLogger(config?: LoggerConfig): 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"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;AA0CA,eAAsB,mBAAmB,MAAA,EAAwC;AAC/E,EAAA,MAAM,EAAE,kBAAA,EAAoB,MAAA,EAAO,GAAI,MAAM,OAAO,sBAAa,CAAA;AACjE,EAAA,OAAO,OAAO,MAAM,CAAA;AACtB;AAkBO,SAAS,SAAA,GAAoB;AAElC,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,mBAAmB,kBAAA,EAAmB;AACjD,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAIA,EAAA,IAAI,CAAC,WAAW,4BAAA,EAA8B;AAC5C,IAAA,OAAO,kBAAA,EAAmB;AAAA,EAC5B;AAEA,EAAA,OAAO,UAAA,CAAW,oBAAoB,kBAAA,EAAmB;AAC3D;AAMA,eAAsB,iBAAiB,MAAA,EAAwC;AAE7E,EAAA,IAAI,UAAA,CAAW,gBAAA,IAAoB,UAAA,CAAW,4BAAA,EAA8B;AAC1E,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,UAAA,CAAW,gBAAA,GAAmB,mBAAmB,MAAM,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,gBAAA,GAAmB,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAC/D;AACA,EAAA,UAAA,CAAW,4BAAA,GAA+B,IAAA;AAC1C,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAMO,IAAM,MAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA,CAAM,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC5E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,aAAA,KAC5B,WAAU,CAAE,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,aAAa;AACzD;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["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// Constants\nexport {\n LOG_DIR,\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_RETENTION,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\n\n/**\n * サーバーサイド用ロガー作成関数(動的import)\n * Next.jsなどのバンドラーでクライアント用にバンドルされる際に\n * fsモジュールの解決エラーを防ぐため、動的importで提供\n */\nexport async function createServerLogger(config?: LoggerConfig): 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"]}
@@ -1,4 +1,4 @@
1
- import { TIMEZONE, LOG_ROTATION, VALID_LOG_LEVELS, LOG_FILE_PREFIX, getCurrentDate, formatLogMessage, isLogContext, isSentryEnabled, captureError, LOG_LEVEL_PRIORITY, formatLogMessageWithContext } from './chunk-B7IDJBGL.js';
1
+ import { LOG_RETENTION, LOG_DIR, TIMEZONE, LOG_ROTATION, VALID_LOG_LEVELS, LOG_FILE_PREFIX, getCurrentDate, formatLogMessage, isLogContext, isSentryEnabled, captureError, LOG_LEVEL_PRIORITY, formatLogMessageWithContext } from './chunk-XZN52OK2.js';
2
2
  import pino from 'pino';
3
3
 
4
4
  function shouldLog(logLevel, minLevel) {
@@ -7,18 +7,61 @@ function shouldLog(logLevel, minLevel) {
7
7
  async function createServerLogger(config = {}) {
8
8
  const {
9
9
  // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env
10
- logDir = process.env["LOG_DIR"] ?? `${process.cwd()}/logs`,
10
+ logDir: configuredLogDir = process.env["LOG_DIR"] ?? LOG_DIR.DEFAULT,
11
11
  // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env
12
12
  level = process.env["LOG_LEVEL"] ?? "debug",
13
13
  timezoneOffset = TIMEZONE.JST_OFFSET_MINUTES,
14
14
  rotationCheckInterval = LOG_ROTATION.DEFAULT_CHECK_INTERVAL_MS,
15
- enableSentry = false
15
+ enableSentry = false,
16
+ retentionDays = LOG_RETENTION.DEFAULT_DAYS
16
17
  } = config;
17
18
  const minLevel = VALID_LOG_LEVELS.includes(level) ? level : "debug";
18
19
  const fs = await import('fs');
19
20
  const path = await import('path');
20
- if (!fs.existsSync(logDir)) {
21
- fs.mkdirSync(logDir, { recursive: true });
21
+ let resolvedLogDir = null;
22
+ function tryMkdir(dir) {
23
+ try {
24
+ if (!fs.existsSync(dir)) {
25
+ fs.mkdirSync(dir, { recursive: true });
26
+ }
27
+ return true;
28
+ } catch {
29
+ return false;
30
+ }
31
+ }
32
+ if (tryMkdir(configuredLogDir)) {
33
+ resolvedLogDir = configuredLogDir;
34
+ } else if (configuredLogDir !== LOG_DIR.DEFAULT && tryMkdir(LOG_DIR.DEFAULT)) {
35
+ resolvedLogDir = LOG_DIR.DEFAULT;
36
+ console.warn(
37
+ `[@degel_lc/logger] Cannot create log directory "${configuredLogDir}". Falling back to "${LOG_DIR.DEFAULT}".`
38
+ );
39
+ } else if (configuredLogDir === LOG_DIR.DEFAULT) {
40
+ console.warn(
41
+ `[@degel_lc/logger] Cannot create log directory "${configuredLogDir}". Falling back to console output.`
42
+ );
43
+ } else {
44
+ console.warn(
45
+ "[@degel_lc/logger] Cannot create any log directory. Falling back to console output."
46
+ );
47
+ }
48
+ const fileLoggingEnabled = resolvedLogDir !== null;
49
+ const logDir = resolvedLogDir ?? configuredLogDir;
50
+ if (fileLoggingEnabled && resolvedLogDir) {
51
+ try {
52
+ const files = fs.readdirSync(resolvedLogDir);
53
+ const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1e3;
54
+ for (const file of files) {
55
+ if (!file.endsWith(".log")) continue;
56
+ const filePath = path.join(resolvedLogDir, file);
57
+ const stat = fs.statSync(filePath);
58
+ if (stat.mtimeMs < cutoff) {
59
+ fs.unlinkSync(filePath);
60
+ }
61
+ }
62
+ } catch {
63
+ console.warn("[@degel_lc/logger] Log cleanup failed, continuing without cleanup.");
64
+ }
22
65
  }
23
66
  const logTypes = {
24
67
  debug: { fileNamePrefix: LOG_FILE_PREFIX.DEBUG, level: "debug" },
@@ -33,6 +76,21 @@ async function createServerLogger(config = {}) {
33
76
  return fs.createWriteStream(logFilePath, { flags: "a" });
34
77
  }
35
78
  function createPinoLogger(fileNamePrefix) {
79
+ if (!fileLoggingEnabled) {
80
+ return pino({
81
+ base: null,
82
+ timestamp: false,
83
+ messageKey: "message",
84
+ formatters: {
85
+ level: () => ({}),
86
+ bindings: () => ({})
87
+ },
88
+ transport: {
89
+ target: "pino/file",
90
+ options: { destination: 1 }
91
+ }
92
+ });
93
+ }
36
94
  return pino(
37
95
  {
38
96
  base: null,
@@ -146,5 +204,5 @@ async function createServerLogger(config = {}) {
146
204
  }
147
205
 
148
206
  export { createServerLogger };
149
- //# sourceMappingURL=server-EIDMRA6K.js.map
150
- //# sourceMappingURL=server-EIDMRA6K.js.map
207
+ //# sourceMappingURL=server-22NDXYBV.js.map
208
+ //# sourceMappingURL=server-22NDXYBV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts"],"names":[],"mappings":"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","file":"server-22NDXYBV.js","sourcesContent":["import pino from 'pino';\nimport {\n LOG_DIR,\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_RETENTION,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\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/**\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: configuredLogDir = process.env['LOG_DIR'] ?? LOG_DIR.DEFAULT,\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n level = (process.env['LOG_LEVEL'] as LogLevel) ?? 'debug',\n timezoneOffset = TIMEZONE.JST_OFFSET_MINUTES,\n rotationCheckInterval = LOG_ROTATION.DEFAULT_CHECK_INTERVAL_MS,\n enableSentry = false,\n retentionDays = LOG_RETENTION.DEFAULT_DAYS,\n } = config;\n\n // 有効なログレベルかどうかを検証\n const minLevel: LogLevel = VALID_LOG_LEVELS.includes(level) ? level : 'debug';\n\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n // 段階的フォールバックでログディレクトリを解決\n // 1. 指定ディレクトリ → 2. /tmp/logs → 3. console出力\n let resolvedLogDir: string | null = null;\n\n function tryMkdir(dir: string): boolean {\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n if (tryMkdir(configuredLogDir)) {\n resolvedLogDir = configuredLogDir;\n } else if (configuredLogDir !== LOG_DIR.DEFAULT && tryMkdir(LOG_DIR.DEFAULT)) {\n resolvedLogDir = LOG_DIR.DEFAULT;\n console.warn(\n `[@degel_lc/logger] Cannot create log directory \"${configuredLogDir}\". Falling back to \"${LOG_DIR.DEFAULT}\".`\n );\n } else if (configuredLogDir === LOG_DIR.DEFAULT) {\n // デフォルトパス自体が失敗\n console.warn(\n `[@degel_lc/logger] Cannot create log directory \"${configuredLogDir}\". Falling back to console output.`\n );\n } else {\n console.warn(\n '[@degel_lc/logger] Cannot create any log directory. Falling back to console output.'\n );\n }\n\n const fileLoggingEnabled = resolvedLogDir !== null;\n const logDir = resolvedLogDir ?? configuredLogDir;\n\n // 古いログファイルのクリーンアップ\n if (fileLoggingEnabled && resolvedLogDir) {\n try {\n const files = fs.readdirSync(resolvedLogDir);\n const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;\n for (const file of files) {\n if (!file.endsWith('.log')) continue;\n const filePath = path.join(resolvedLogDir, file);\n const stat = fs.statSync(filePath);\n if (stat.mtimeMs < cutoff) {\n fs.unlinkSync(filePath);\n }\n }\n } catch {\n // クリーンアップ失敗は警告のみ(ロガー起動を阻害しない)\n console.warn('[@degel_lc/logger] Log cleanup failed, continuing without cleanup.');\n }\n }\n\n // 各ログレベル用の設定\n const logTypes: Record<string, LogTypeConfig> = {\n debug: { fileNamePrefix: LOG_FILE_PREFIX.DEBUG, level: 'debug' },\n info: { fileNamePrefix: LOG_FILE_PREFIX.INFO, level: 'info' },\n error: { fileNamePrefix: LOG_FILE_PREFIX.ERROR, level: 'error' },\n fatal: { fileNamePrefix: LOG_FILE_PREFIX.FATAL, level: 'fatal' },\n sqlError: { fileNamePrefix: LOG_FILE_PREFIX.SQL_ERROR, 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 // ロガーを作成する関数(ファイルまたはconsole)\n function createPinoLogger(fileNamePrefix: string): pino.Logger {\n if (!fileLoggingEnabled) {\n return pino({\n base: null,\n timestamp: false,\n messageKey: 'message',\n formatters: {\n level: () => ({}),\n bindings: () => ({}),\n },\n transport: {\n target: 'pino/file',\n options: { destination: 1 },\n },\n });\n }\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"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk3QE5XQOJ_cjs = require('./chunk-3QE5XQOJ.cjs');
3
+ var chunkLR6LZRSG_cjs = require('./chunk-LR6LZRSG.cjs');
4
4
  var pino = require('pino');
5
5
 
6
6
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -8,37 +8,95 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
8
  var pino__default = /*#__PURE__*/_interopDefault(pino);
9
9
 
10
10
  function shouldLog(logLevel, minLevel) {
11
- return chunk3QE5XQOJ_cjs.LOG_LEVEL_PRIORITY[logLevel] >= chunk3QE5XQOJ_cjs.LOG_LEVEL_PRIORITY[minLevel];
11
+ return chunkLR6LZRSG_cjs.LOG_LEVEL_PRIORITY[logLevel] >= chunkLR6LZRSG_cjs.LOG_LEVEL_PRIORITY[minLevel];
12
12
  }
13
13
  async function createServerLogger(config = {}) {
14
14
  const {
15
15
  // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env
16
- logDir = process.env["LOG_DIR"] ?? `${process.cwd()}/logs`,
16
+ logDir: configuredLogDir = process.env["LOG_DIR"] ?? chunkLR6LZRSG_cjs.LOG_DIR.DEFAULT,
17
17
  // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env
18
18
  level = process.env["LOG_LEVEL"] ?? "debug",
19
- timezoneOffset = chunk3QE5XQOJ_cjs.TIMEZONE.JST_OFFSET_MINUTES,
20
- rotationCheckInterval = chunk3QE5XQOJ_cjs.LOG_ROTATION.DEFAULT_CHECK_INTERVAL_MS,
21
- enableSentry = false
19
+ timezoneOffset = chunkLR6LZRSG_cjs.TIMEZONE.JST_OFFSET_MINUTES,
20
+ rotationCheckInterval = chunkLR6LZRSG_cjs.LOG_ROTATION.DEFAULT_CHECK_INTERVAL_MS,
21
+ enableSentry = false,
22
+ retentionDays = chunkLR6LZRSG_cjs.LOG_RETENTION.DEFAULT_DAYS
22
23
  } = config;
23
- const minLevel = chunk3QE5XQOJ_cjs.VALID_LOG_LEVELS.includes(level) ? level : "debug";
24
+ const minLevel = chunkLR6LZRSG_cjs.VALID_LOG_LEVELS.includes(level) ? level : "debug";
24
25
  const fs = await import('fs');
25
26
  const path = await import('path');
26
- if (!fs.existsSync(logDir)) {
27
- fs.mkdirSync(logDir, { recursive: true });
27
+ let resolvedLogDir = null;
28
+ function tryMkdir(dir) {
29
+ try {
30
+ if (!fs.existsSync(dir)) {
31
+ fs.mkdirSync(dir, { recursive: true });
32
+ }
33
+ return true;
34
+ } catch {
35
+ return false;
36
+ }
37
+ }
38
+ if (tryMkdir(configuredLogDir)) {
39
+ resolvedLogDir = configuredLogDir;
40
+ } else if (configuredLogDir !== chunkLR6LZRSG_cjs.LOG_DIR.DEFAULT && tryMkdir(chunkLR6LZRSG_cjs.LOG_DIR.DEFAULT)) {
41
+ resolvedLogDir = chunkLR6LZRSG_cjs.LOG_DIR.DEFAULT;
42
+ console.warn(
43
+ `[@degel_lc/logger] Cannot create log directory "${configuredLogDir}". Falling back to "${chunkLR6LZRSG_cjs.LOG_DIR.DEFAULT}".`
44
+ );
45
+ } else if (configuredLogDir === chunkLR6LZRSG_cjs.LOG_DIR.DEFAULT) {
46
+ console.warn(
47
+ `[@degel_lc/logger] Cannot create log directory "${configuredLogDir}". Falling back to console output.`
48
+ );
49
+ } else {
50
+ console.warn(
51
+ "[@degel_lc/logger] Cannot create any log directory. Falling back to console output."
52
+ );
53
+ }
54
+ const fileLoggingEnabled = resolvedLogDir !== null;
55
+ const logDir = resolvedLogDir ?? configuredLogDir;
56
+ if (fileLoggingEnabled && resolvedLogDir) {
57
+ try {
58
+ const files = fs.readdirSync(resolvedLogDir);
59
+ const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1e3;
60
+ for (const file of files) {
61
+ if (!file.endsWith(".log")) continue;
62
+ const filePath = path.join(resolvedLogDir, file);
63
+ const stat = fs.statSync(filePath);
64
+ if (stat.mtimeMs < cutoff) {
65
+ fs.unlinkSync(filePath);
66
+ }
67
+ }
68
+ } catch {
69
+ console.warn("[@degel_lc/logger] Log cleanup failed, continuing without cleanup.");
70
+ }
28
71
  }
29
72
  const logTypes = {
30
- debug: { fileNamePrefix: chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX.DEBUG, level: "debug" },
31
- info: { fileNamePrefix: chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX.INFO, level: "info" },
32
- error: { fileNamePrefix: chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX.ERROR, level: "error" },
33
- fatal: { fileNamePrefix: chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX.FATAL, level: "fatal" },
34
- sqlError: { fileNamePrefix: chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX.SQL_ERROR, level: "error" }
73
+ debug: { fileNamePrefix: chunkLR6LZRSG_cjs.LOG_FILE_PREFIX.DEBUG, level: "debug" },
74
+ info: { fileNamePrefix: chunkLR6LZRSG_cjs.LOG_FILE_PREFIX.INFO, level: "info" },
75
+ error: { fileNamePrefix: chunkLR6LZRSG_cjs.LOG_FILE_PREFIX.ERROR, level: "error" },
76
+ fatal: { fileNamePrefix: chunkLR6LZRSG_cjs.LOG_FILE_PREFIX.FATAL, level: "fatal" },
77
+ sqlError: { fileNamePrefix: chunkLR6LZRSG_cjs.LOG_FILE_PREFIX.SQL_ERROR, level: "error" }
35
78
  };
36
79
  function createLogStream(fileNamePrefix) {
37
- const dateStr = chunk3QE5XQOJ_cjs.getCurrentDate(timezoneOffset);
80
+ const dateStr = chunkLR6LZRSG_cjs.getCurrentDate(timezoneOffset);
38
81
  const logFilePath = path.join(logDir, `${fileNamePrefix}_${dateStr}.log`);
39
82
  return fs.createWriteStream(logFilePath, { flags: "a" });
40
83
  }
41
84
  function createPinoLogger(fileNamePrefix) {
85
+ if (!fileLoggingEnabled) {
86
+ return pino__default.default({
87
+ base: null,
88
+ timestamp: false,
89
+ messageKey: "message",
90
+ formatters: {
91
+ level: () => ({}),
92
+ bindings: () => ({})
93
+ },
94
+ transport: {
95
+ target: "pino/file",
96
+ options: { destination: 1 }
97
+ }
98
+ });
99
+ }
42
100
  return pino__default.default(
43
101
  {
44
102
  base: null,
@@ -62,7 +120,7 @@ async function createServerLogger(config = {}) {
62
120
  state.loggers[type] = createPinoLogger(logConfig.fileNamePrefix);
63
121
  }
64
122
  const checkAndRotateLogFiles = () => {
65
- const currentDate = chunk3QE5XQOJ_cjs.getCurrentDate(timezoneOffset);
123
+ const currentDate = chunkLR6LZRSG_cjs.getCurrentDate(timezoneOffset);
66
124
  if (checkAndRotateLogFiles.lastDate !== currentDate) {
67
125
  checkAndRotateLogFiles.lastDate = currentDate;
68
126
  for (const [type, logConfig] of Object.entries(logTypes)) {
@@ -70,7 +128,7 @@ async function createServerLogger(config = {}) {
70
128
  }
71
129
  }
72
130
  };
73
- checkAndRotateLogFiles.lastDate = chunk3QE5XQOJ_cjs.getCurrentDate(timezoneOffset);
131
+ checkAndRotateLogFiles.lastDate = chunkLR6LZRSG_cjs.getCurrentDate(timezoneOffset);
74
132
  state.rotationFunction = checkAndRotateLogFiles;
75
133
  if (process.env["NODE_ENV"] !== "test") {
76
134
  state.intervalId = setInterval(checkAndRotateLogFiles, rotationCheckInterval);
@@ -81,7 +139,7 @@ async function createServerLogger(config = {}) {
81
139
  return;
82
140
  }
83
141
  checkAndRotateLogFiles();
84
- const formattedMessage = chunk3QE5XQOJ_cjs.formatLogMessage(
142
+ const formattedMessage = chunkLR6LZRSG_cjs.formatLogMessage(
85
143
  logLevel,
86
144
  message,
87
145
  location,
@@ -98,7 +156,7 @@ async function createServerLogger(config = {}) {
98
156
  return;
99
157
  }
100
158
  checkAndRotateLogFiles();
101
- const formattedMessage = chunk3QE5XQOJ_cjs.formatLogMessageWithContext(
159
+ const formattedMessage = chunkLR6LZRSG_cjs.formatLogMessageWithContext(
102
160
  logLevel,
103
161
  message,
104
162
  ctx,
@@ -109,13 +167,13 @@ async function createServerLogger(config = {}) {
109
167
  if (logger) {
110
168
  logger[logLevel](formattedMessage);
111
169
  }
112
- if (sendToSentry && enableSentry && chunk3QE5XQOJ_cjs.isSentryEnabled()) {
113
- chunk3QE5XQOJ_cjs.captureError(ctx, message, error);
170
+ if (sendToSentry && enableSentry && chunkLR6LZRSG_cjs.isSentryEnabled()) {
171
+ chunkLR6LZRSG_cjs.captureError(ctx, message, error);
114
172
  }
115
173
  }
116
174
  function createLogMethod(loggerType, logLevel, sendToSentry = false) {
117
175
  return (ctxOrMessage, messageOrLocation, errorOrOriginal) => {
118
- if (chunk3QE5XQOJ_cjs.isLogContext(ctxOrMessage)) {
176
+ if (chunkLR6LZRSG_cjs.isLogContext(ctxOrMessage)) {
119
177
  formatAndLogWithContext(
120
178
  loggerType,
121
179
  logLevel,
@@ -132,9 +190,9 @@ async function createServerLogger(config = {}) {
132
190
  messageOrLocation ?? null,
133
191
  errorOrOriginal ?? null
134
192
  );
135
- if (sendToSentry && enableSentry && chunk3QE5XQOJ_cjs.isSentryEnabled()) {
193
+ if (sendToSentry && enableSentry && chunkLR6LZRSG_cjs.isSentryEnabled()) {
136
194
  const ctx = messageOrLocation ? { location: messageOrLocation } : {};
137
- chunk3QE5XQOJ_cjs.captureError(ctx, ctxOrMessage, errorOrOriginal);
195
+ chunkLR6LZRSG_cjs.captureError(ctx, ctxOrMessage, errorOrOriginal);
138
196
  }
139
197
  }
140
198
  };
@@ -152,5 +210,5 @@ async function createServerLogger(config = {}) {
152
210
  }
153
211
 
154
212
  exports.createServerLogger = createServerLogger;
155
- //# sourceMappingURL=server-E7QYW63S.cjs.map
156
- //# sourceMappingURL=server-E7QYW63S.cjs.map
213
+ //# sourceMappingURL=server-GAFSZR3C.cjs.map
214
+ //# sourceMappingURL=server-GAFSZR3C.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts"],"names":["LOG_LEVEL_PRIORITY","LOG_DIR","TIMEZONE","LOG_ROTATION","LOG_RETENTION","VALID_LOG_LEVELS","LOG_FILE_PREFIX","getCurrentDate","pino","formatLogMessage","formatLogMessageWithContext","isSentryEnabled","captureError","isLogContext"],"mappings":"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","file":"server-GAFSZR3C.cjs","sourcesContent":["import pino from 'pino';\nimport {\n LOG_DIR,\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_RETENTION,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\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/**\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: configuredLogDir = process.env['LOG_DIR'] ?? LOG_DIR.DEFAULT,\n // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires bracket notation for process.env\n level = (process.env['LOG_LEVEL'] as LogLevel) ?? 'debug',\n timezoneOffset = TIMEZONE.JST_OFFSET_MINUTES,\n rotationCheckInterval = LOG_ROTATION.DEFAULT_CHECK_INTERVAL_MS,\n enableSentry = false,\n retentionDays = LOG_RETENTION.DEFAULT_DAYS,\n } = config;\n\n // 有効なログレベルかどうかを検証\n const minLevel: LogLevel = VALID_LOG_LEVELS.includes(level) ? level : 'debug';\n\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n // 段階的フォールバックでログディレクトリを解決\n // 1. 指定ディレクトリ → 2. /tmp/logs → 3. console出力\n let resolvedLogDir: string | null = null;\n\n function tryMkdir(dir: string): boolean {\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return true;\n } catch {\n return false;\n }\n }\n\n if (tryMkdir(configuredLogDir)) {\n resolvedLogDir = configuredLogDir;\n } else if (configuredLogDir !== LOG_DIR.DEFAULT && tryMkdir(LOG_DIR.DEFAULT)) {\n resolvedLogDir = LOG_DIR.DEFAULT;\n console.warn(\n `[@degel_lc/logger] Cannot create log directory \"${configuredLogDir}\". Falling back to \"${LOG_DIR.DEFAULT}\".`\n );\n } else if (configuredLogDir === LOG_DIR.DEFAULT) {\n // デフォルトパス自体が失敗\n console.warn(\n `[@degel_lc/logger] Cannot create log directory \"${configuredLogDir}\". Falling back to console output.`\n );\n } else {\n console.warn(\n '[@degel_lc/logger] Cannot create any log directory. Falling back to console output.'\n );\n }\n\n const fileLoggingEnabled = resolvedLogDir !== null;\n const logDir = resolvedLogDir ?? configuredLogDir;\n\n // 古いログファイルのクリーンアップ\n if (fileLoggingEnabled && resolvedLogDir) {\n try {\n const files = fs.readdirSync(resolvedLogDir);\n const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;\n for (const file of files) {\n if (!file.endsWith('.log')) continue;\n const filePath = path.join(resolvedLogDir, file);\n const stat = fs.statSync(filePath);\n if (stat.mtimeMs < cutoff) {\n fs.unlinkSync(filePath);\n }\n }\n } catch {\n // クリーンアップ失敗は警告のみ(ロガー起動を阻害しない)\n console.warn('[@degel_lc/logger] Log cleanup failed, continuing without cleanup.');\n }\n }\n\n // 各ログレベル用の設定\n const logTypes: Record<string, LogTypeConfig> = {\n debug: { fileNamePrefix: LOG_FILE_PREFIX.DEBUG, level: 'debug' },\n info: { fileNamePrefix: LOG_FILE_PREFIX.INFO, level: 'info' },\n error: { fileNamePrefix: LOG_FILE_PREFIX.ERROR, level: 'error' },\n fatal: { fileNamePrefix: LOG_FILE_PREFIX.FATAL, level: 'fatal' },\n sqlError: { fileNamePrefix: LOG_FILE_PREFIX.SQL_ERROR, 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 // ロガーを作成する関数(ファイルまたはconsole)\n function createPinoLogger(fileNamePrefix: string): pino.Logger {\n if (!fileLoggingEnabled) {\n return pino({\n base: null,\n timestamp: false,\n messageKey: 'message',\n formatters: {\n level: () => ({}),\n bindings: () => ({}),\n },\n transport: {\n target: 'pino/file',\n options: { destination: 1 },\n },\n });\n }\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@degel_lc/logger",
3
- "version": "0.1.8",
3
+ "version": "0.2.0",
4
4
  "description": "phsk関連プロジェクト共通のpino-basedロギングライブラリ",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/sentry.ts"],"names":[],"mappings":"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","file":"chunk-3QE5XQOJ.cjs","sourcesContent":["/**\n * ログレベル関連の定数\n */\n\nimport type { LogLevel } from './types.js';\n\n/**\n * 有効なログレベル一覧\n * LogLevel型と同期した配列\n */\nexport const VALID_LOG_LEVELS: readonly LogLevel[] = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'fatal',\n] as const;\n\n/**\n * ログレベルの優先度マップ\n * 数値が大きいほど優先度が高い\n */\nexport const 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 */\nexport const TIMEZONE = {\n /** 日本標準時(JST)のUTCオフセット(分) */\n JST_OFFSET_MINUTES: 540 as number,\n};\n\n/**\n * ログローテーション関連\n */\nexport const LOG_ROTATION = {\n /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */\n DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1000,\n} as const;\n\n/**\n * ログファイル名プレフィックス\n */\nexport const LOG_FILE_PREFIX = {\n DEBUG: 'debug_log',\n INFO: 'info_log',\n ERROR: 'error_log',\n FATAL: 'fatal_log',\n SQL_ERROR: 'sql_error_log',\n} as const;\n\n/**\n * ログメッセージ関連の定数\n */\nexport const LOG_MESSAGES = {\n /** エラー情報がない場合のデフォルト表示 */\n NO_ERROR: 'なし',\n} as const;\n","import { LOG_MESSAGES, TIMEZONE } from './constants.js';\nimport type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_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 : LOG_MESSAGES.NO_ERROR;\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/sentry.ts"],"names":[],"mappings":"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","file":"chunk-B7IDJBGL.js","sourcesContent":["/**\n * ログレベル関連の定数\n */\n\nimport type { LogLevel } from './types.js';\n\n/**\n * 有効なログレベル一覧\n * LogLevel型と同期した配列\n */\nexport const VALID_LOG_LEVELS: readonly LogLevel[] = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'fatal',\n] as const;\n\n/**\n * ログレベルの優先度マップ\n * 数値が大きいほど優先度が高い\n */\nexport const 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 */\nexport const TIMEZONE = {\n /** 日本標準時(JST)のUTCオフセット(分) */\n JST_OFFSET_MINUTES: 540 as number,\n};\n\n/**\n * ログローテーション関連\n */\nexport const LOG_ROTATION = {\n /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */\n DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1000,\n} as const;\n\n/**\n * ログファイル名プレフィックス\n */\nexport const LOG_FILE_PREFIX = {\n DEBUG: 'debug_log',\n INFO: 'info_log',\n ERROR: 'error_log',\n FATAL: 'fatal_log',\n SQL_ERROR: 'sql_error_log',\n} as const;\n\n/**\n * ログメッセージ関連の定数\n */\nexport const LOG_MESSAGES = {\n /** エラー情報がない場合のデフォルト表示 */\n NO_ERROR: 'なし',\n} as const;\n","import { LOG_MESSAGES, TIMEZONE } from './constants.js';\nimport type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_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 : LOG_MESSAGES.NO_ERROR;\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":["LOG_LEVEL_PRIORITY","TIMEZONE","LOG_ROTATION","VALID_LOG_LEVELS","LOG_FILE_PREFIX","getCurrentDate","pino","formatLogMessage","formatLogMessageWithContext","isSentryEnabled","captureError","isLogContext"],"mappings":"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","file":"server-E7QYW63S.cjs","sourcesContent":["import pino from 'pino';\nimport {\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\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/**\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 = TIMEZONE.JST_OFFSET_MINUTES,\n rotationCheckInterval = LOG_ROTATION.DEFAULT_CHECK_INTERVAL_MS,\n enableSentry = false,\n } = config;\n\n // 有効なログレベルかどうかを検証\n const minLevel: LogLevel = VALID_LOG_LEVELS.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: LOG_FILE_PREFIX.DEBUG, level: 'debug' },\n info: { fileNamePrefix: LOG_FILE_PREFIX.INFO, level: 'info' },\n error: { fileNamePrefix: LOG_FILE_PREFIX.ERROR, level: 'error' },\n fatal: { fileNamePrefix: LOG_FILE_PREFIX.FATAL, level: 'fatal' },\n sqlError: { fileNamePrefix: LOG_FILE_PREFIX.SQL_ERROR, 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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":[],"mappings":"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","file":"server-EIDMRA6K.js","sourcesContent":["import pino from 'pino';\nimport {\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\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/**\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 = TIMEZONE.JST_OFFSET_MINUTES,\n rotationCheckInterval = LOG_ROTATION.DEFAULT_CHECK_INTERVAL_MS,\n enableSentry = false,\n } = config;\n\n // 有効なログレベルかどうかを検証\n const minLevel: LogLevel = VALID_LOG_LEVELS.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: LOG_FILE_PREFIX.DEBUG, level: 'debug' },\n info: { fileNamePrefix: LOG_FILE_PREFIX.INFO, level: 'info' },\n error: { fileNamePrefix: LOG_FILE_PREFIX.ERROR, level: 'error' },\n fatal: { fileNamePrefix: LOG_FILE_PREFIX.FATAL, level: 'fatal' },\n sqlError: { fileNamePrefix: LOG_FILE_PREFIX.SQL_ERROR, 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"]}