{"_id":"@17live/node-logger","_rev":"3-f529f4d108f518f3b542e0d6c16e0850","name":"@17live/node-logger","dist-tags":{"latest":"3.0.2"},"versions":{"3.0.1":{"name":"@17live/node-logger","version":"3.0.1","keywords":["logger","slack","fluentd"],"author":{"name":"17live"},"license":"MIT","_id":"@17live/node-logger@3.0.1","maintainers":[{"name":"17live-sre","email":"sre@17.media"},{"name":"louisba17","email":"louisba@17.media"},{"name":"shanechen","email":"shanechen@17.media"},{"name":"jerrylin-17media","email":"jerrylin@17.media"}],"homepage":"https://github.com/17media/node-logger#readme","bugs":{"url":"https://github.com/17media/node-logger/issues"},"dist":{"shasum":"975f7e7de9ff1a29796bcde94e7e2fcf7d3a0b36","tarball":"https://registry.npmjs.org/@17live/node-logger/-/node-logger-3.0.1.tgz","fileCount":134,"integrity":"sha512-jV7UgADVQRhpGQzLWOaWsUPQ4OiQqW5WekSn+MrdmoIBG7Q7a4h+Tm2EgAiprlwOtE+zkBkTgt6u+b7L5hezCg==","signatures":[{"sig":"MEYCIQD2yb4EIDC0KhLKEzd4ZL2nxO8U3SSVPFOLwCJdoRiRHQIhAK9rslwyt8GOBCuKEbVBSN7zDMrOORP2aQJdI2tCNbyw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203661},"main":"lib/index.js","type":"module","types":"./lib/index.d.ts","module":"src/index.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"cd4827f41c71821d7835ae2a8ecc16c8804eefea","scripts":{"lint":"eslint .","test":"jest","build":"tsc && babel src -d lib --ignore __tests__ --extensions \".ts,.js\" && echo '{\"type\": \"commonjs\"}' > lib/package.json","prepare":"husky","test:watch":"yarn test --watch","build:watch":"yarn build --watch"},"_npmUser":{"name":"shanechen","email":"shanechen@17.media"},"repository":{"url":"git+https://github.com/17media/node-logger.git","type":"git"},"_npmVersion":"11.12.1","description":"Centralized logger for 17LIVE Node.JS projects","directories":{},"lint-staged":{"src/**/*.js":["eslint --fix"]},"_nodeVersion":"24.15.0","dependencies":{"@slack/web-api":"^7.15.1","@babel/runtime-corejs3":"^7.29.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","husky":"^9.0.0","eslint":"^9.0.0","globals":"^15.0.0","@babel/cli":"^7.12.1","@eslint/js":"^9.0.0","babel-jest":"^30.3.0","jest-junit":"^16.0.0","typescript":"^6.0.3","@babel/core":"^7.12.3","@types/jest":"^30.0.0","@types/node":"^25.6.0","lint-staged":"^15.0.0","coveralls-next":"^6.0.1","@eslint/eslintrc":"^3.0.0","@babel/preset-env":"^7.12.1","eslint-plugin-react":"^7.37.0","@babel/eslint-parser":"^7.12.1","eslint-plugin-import":"^2.31.0","@babel/preset-typescript":"^7.28.5","@babel/plugin-transform-runtime":"^7.29.0"},"_npmOperationalInternal":{"tmp":"tmp/node-logger_3.0.1_1778144068577_0.2673510521179221","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@17live/node-logger","version":"3.0.2","type":"module","description":"Centralized logger for 17LIVE NodeJS projects","main":"lib/index.js","module":"src/index.ts","exports":{".":{"import":"./lib/index.js","require":"./lib/index.js","types":"./lib/index.d.ts"}},"scripts":{"prepare":"husky","build":"tsc && babel src -d lib --ignore __tests__ --extensions \".ts,.js\" && echo '{\"type\": \"commonjs\"}' > lib/package.json","build:watch":"yarn build --watch","test":"jest","test:watch":"yarn test --watch","lint":"eslint ."},"lint-staged":{"src/**/*.js":["eslint --fix"]},"repository":{"type":"git","url":"git+https://github.com/17media/node-logger.git"},"keywords":["logger","slack","fluentd"],"author":{"name":"17live"},"license":"MIT","publishConfig":{"access":"public"},"engines":{"node":">=18.0.0"},"bugs":{"url":"https://github.com/17media/node-logger/issues"},"homepage":"https://github.com/17media/node-logger#readme","dependencies":{"@babel/runtime-corejs3":"^7.29.2","@slack/web-api":"^7.15.1"},"devDependencies":{"@babel/cli":"^7.12.1","@babel/core":"^7.12.3","@babel/eslint-parser":"^7.12.1","@babel/plugin-transform-runtime":"^7.29.0","@babel/preset-env":"^7.12.1","@babel/preset-typescript":"^7.28.5","@eslint/eslintrc":"^3.0.0","@eslint/js":"^9.0.0","@types/jest":"^30.0.0","@types/node":"^25.6.0","babel-jest":"^30.3.0","coveralls-next":"^6.0.1","eslint":"^9.0.0","eslint-plugin-import":"^2.31.0","eslint-plugin-react":"^7.37.0","globals":"^15.0.0","husky":"^9.0.0","jest":"^30.3.0","jest-junit":"^16.0.0","lint-staged":"^15.0.0","typescript":"^6.0.3"},"gitHead":"9ed609dbbf85869ee97e8ffba221c2a046f4fccd","types":"./lib/index.d.ts","_id":"@17live/node-logger@3.0.2","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-noQkWMi52dNTu867eCfEwjBRDCqVHjN0NQyxglx69HRl12zHZgltIcDzAvpINKL2DuB64GGYI+xrz5VyL3YCBg==","shasum":"59bcb742e4a6a12f2670d3a2fa53e52ae7e73cb2","tarball":"https://registry.npmjs.org/@17live/node-logger/-/node-logger-3.0.2.tgz","fileCount":102,"unpackedSize":184708,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCmrFCPn9ADA7M5ho/OWB7u/0JnoHRWkDhnzRkXbsiiYAIhAM0j8PZRwrt5BVoXN7NxLO1E3KgIyc3KoChvEsrqEj92"}]},"_npmUser":{"name":"shanechen","email":"shanechen@17.media"},"directories":{},"maintainers":[{"name":"tiffany1004","email":"tiffanychen@17.media"},{"name":"17live-sre","email":"sre@17.media"},{"name":"louisba17","email":"louisba@17.media"},{"name":"shanechen","email":"shanechen@17.media"},{"name":"jerrylin-17media","email":"jerrylin@17.media"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-logger_3.0.2_1778552787591_0.8597163993301717"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-07T08:54:28.481Z","modified":"2026-05-12T02:26:27.970Z","3.0.1":"2026-05-07T08:54:28.749Z","3.0.2":"2026-05-12T02:26:27.782Z"},"bugs":{"url":"https://github.com/17media/node-logger/issues"},"author":{"name":"17live"},"license":"MIT","homepage":"https://github.com/17media/node-logger#readme","keywords":["logger","slack","fluentd"],"repository":{"type":"git","url":"git+https://github.com/17media/node-logger.git"},"description":"Centralized logger for 17LIVE NodeJS projects","maintainers":[{"name":"tiffany1004","email":"tiffanychen@17.media"},{"name":"17live-sre","email":"sre@17.media"},{"name":"louisba17","email":"louisba@17.media"},{"name":"shanechen","email":"shanechen@17.media"},{"name":"jerrylin-17media","email":"jerrylin@17.media"}],"readme":"# node-logger v3.0.0 🚀\n\nCentralized logger for 17LIVE NodeJS projects.\n\n## ✨ v3.0.0 亮點\n- **100% TypeScript**: 完整型別定義，完美支援 IDE 自動補全與開發者體驗。\n- **現代化非同步**: 所有日誌發送任務原生支援 `async/await`。\n- **零依賴**: 移除 lodash 等外部套件，保持極致輕量與安全。\n- **向下相容**: 100% 相容 v2.x 代碼，升級現有專案無需修改任何程式碼。\n- **100% 測試覆蓋率**: 嚴格驗證所有邏輯路徑、邊界情況與極端案例。\n\n## 🛠 配置說明\n\n```typescript\nimport { createLogger, Level } from '@17live/node-logger';\n\nconst loggerConfig = {\n  // 基礎配置 (建議 v3 寫法)\n  base: {\n    project: 'my-app',\n    environment: 'production',\n    logLevel: Level.INFO,\n  },\n  // 或者傳統 v2 寫法 (直接將 project/environment 放在頂層)\n  // project: 'my-app',\n  // environment: 'production',\n\n  Slack: {\n    slackToken: 'xoxb-xxx',\n    slackChannel: '#alerts',\n  },\n  Console: true,\n};\n```\n\n## 🚀 使用方式\n\n### 1. 工廠模式 (v3+ 推薦)\n\n這種方式將配置初始化與標籤綁定分離，適合在大型多模組應用中共享同一個工廠，並在不同模組間獲取帶有標籤的 Logger。\n\n```typescript\nimport { createLogger } from '@17live/node-logger';\n\n// 1. 初始化工廠 (只需一次)\nconst loggerFactory = createLogger(loggerConfig);\n\n// 2. 在不同模組建立帶有標籤的 Logger\nconst logger = loggerFactory('auth-module');\nconst dbLogger = loggerFactory('db-module');\n\nawait logger.info('用戶登入成功', { userId: 123 });\n```\n\n### 2. 直接模式 (向下相容 v2.x)\n\n如果你正從 v2 升級，現有的呼叫方式依然完全有效，不需要任何程式碼異動。\n\n```typescript\nimport { createLogger } from '@17live/node-logger';\n\n// 直接傳入配置與標籤\nconst logger = createLogger(loggerConfig, 'legacy-module');\n\nawait logger.warn('舊有的呼叫方式依然運作順暢！');\n```\n\n## 📋 版本差異對照 (v2 vs v3)\n\n| 特性 | v2.x (傳統) | v3.x (現代) | 說明 |\n| :--- | :--- | :--- | :--- |\n| **初始化方式** | `createLogger(conf, label)` | `createLogger(conf)(label)` | v3 支援工廠模式，重複使用率與效能更佳 |\n| **配置結構** | 專案資訊位於頂層 | 建議放在 `base` 物件內 | v3 具備自動提取頂層配置的相容邏輯 |\n| **傳回值** | Logger 實例 | Logger 工廠函數 | v3 會根據參數個數自動切換傳回類型 |\n| **非同步狀態** | 回傳 `Promise<any>` | 回傳 `PromiseSettledResult[]` | v3 讓你精確掌握每個分發服務的發送結果 |\n| **資料處理** | 僅支援基本物件 | 支援 Date, Map, Set, Error | v3 資料扁平化能力大幅強化 |\n\n## 🛡 安全與穩定性\n- **循環引用偵測**: 自動偵測並標記物件循環引用（標記為 `[Circular Reference]`），避免崩潰。\n- **最大深度保護**: 預設扁平化限制為 10 層（可調整），防止處理過大物件導致效能受損。\n- **逾時保護**: 單一服務發送超過 10 秒自動棄置，確保不因為單點故障阻塞主程式。\n\n## 🛠 開發指南\n\n### 開發標準\n- **嚴格型別**: 嚴禁使用 `any`。請使用泛型或搭配類型守衛的 `unknown`。\n- **測試要求**: 所有 Pull Request 必須維持 100% 的邏輯與分支覆蓋率。\n- **Git Hooks**: Pre-commit 鉤子會自動執行 `eslint` 與 `tsc --noEmit`。若有任何語法或型別錯誤將無法提交。\n\n### 常用指令\n- `yarn test`: 執行所有單元測試並產出覆蓋率報告。\n- `yarn lint`: 檢查並修復程式碼風格。\n- `yarn build`: 手動觸發編譯（主要用於本地 `npm link` 測試）。\n\n### 發佈流程\n發佈流程透過 CircleCI 自動化執行。若要發佈新版本：\n1. 在 PR 中更新 `package.json` 與 `CHANGELOG.md` 的版本號。\n2. 將 PR 合併至 `master` 分支。\n3. 建立並推送一個 Git Tag：\n   ```bash\n   git tag v3.0.x\n   git push origin v3.0.x\n   ```\n4. CircleCI 會偵測到 Tag，自動執行測試、編譯，並發佈至 npm registry。\n","readmeFilename":"README.zh-TW.md"}