@rife/logger 0.0.5-beta.25 → 0.0.5-beta.27

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/pino.js CHANGED
@@ -3,7 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createLogger = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const pino_1 = tslib_1.__importDefault(require("pino"));
6
+ // https://github.com/pinojs/pino/blob/master/docs/api.md
6
7
  const env_1 = require("./env");
8
+ const trace_1 = require("./trace");
7
9
  function getPinoConfig() {
8
10
  const targets = [];
9
11
  if ((0, env_1.isDev)()) {
@@ -15,23 +17,25 @@ function getPinoConfig() {
15
17
  }
16
18
  targets.push({
17
19
  level: 'debug',
18
- target: 'pino/file',
19
- options: { destination: './.logs/1.log', mkdir: true },
20
+ target: './rotate',
21
+ options: { path: './.logs/' },
20
22
  });
21
23
  const config = {
22
24
  // base: { pid: undefined, hostname: undefined },
23
25
  transport: { targets },
26
+ mixin(data) {
27
+ if (!data?.traceId) {
28
+ return { traceId: (0, trace_1.getTraceId)() };
29
+ }
30
+ return {};
31
+ },
24
32
  };
25
33
  return config;
26
34
  }
27
35
  const startTime = Symbol('startTime');
28
36
  function createLogger(options) {
29
- let data = {};
30
37
  const logger = (0, pino_1.default)({
31
38
  ...getPinoConfig(),
32
- mixin() {
33
- return { ...data };
34
- },
35
39
  });
36
40
  const express = () => {
37
41
  const { mapHttpRequest, mapHttpResponse } = require('pino-std-serializers');
@@ -39,17 +43,20 @@ function createLogger(options) {
39
43
  const response = res;
40
44
  response[startTime] = response[startTime] || Date.now();
41
45
  const traceId = req.headers['trace-id'];
46
+ if (traceId) {
47
+ (0, trace_1.setTraceId)(traceId);
48
+ }
42
49
  const onComplete = () => {
43
50
  res.removeListener('close', onComplete);
44
51
  res.removeListener('finish', onComplete);
45
52
  res.removeListener('error', onComplete);
46
53
  const duration = Date.now() - response[startTime];
47
- logger.info({ traceId, duration, request: mapHttpRequest(req).req, response: mapHttpResponse(res).res });
54
+ logger.info({ duration, request: mapHttpRequest(req).req, response: mapHttpResponse(res).res }, 'request');
48
55
  };
49
56
  res.on('close', onComplete);
50
57
  res.on('finish', onComplete);
51
58
  res.on('error', onComplete);
52
- next();
59
+ (0, trace_1.runInTrace)(next);
53
60
  };
54
61
  };
55
62
  const instance = logger;
package/dist/pino.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pino.js","sourceRoot":"","sources":["../src/pino.ts"],"names":[],"mappings":";;;;AAAA,wDAAwB;AAIxB,+BAA8B;AAc9B,SAAS,aAAa;IAClB,MAAM,OAAO,GAAQ,EAAE,CAAC;IAExB,IAAI,IAAA,WAAK,GAAE,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,aAAa,EAAE,gCAAgC;YACvD,OAAO,EAAE,EAAE;SACd,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,IAAI,CAAC;QACT,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE;KACzD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAuB;QAC/B,iDAAiD;QACjD,SAAS,EAAE,EAAE,OAAO,EAAE;KACzB,CAAC;IAEF,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAEtC,SAAgB,YAAY,CAAC,OAAyB;IAClD,IAAI,IAAI,GAAQ,EAAE,CAAC;IAEnB,MAAM,MAAM,GAAG,IAAA,cAAI,EAAC;QAChB,GAAG,aAAa,EAAE;QAClB,KAAK;YACD,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;QACvB,CAAC;KACJ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAA0C,CAAC;QAErH,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAQ,GAAG,CAAC;YAC1B,QAAQ,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAExC,MAAM,UAAU,GAAG,GAAG,EAAE;gBACpB,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACxC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACzC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAElD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7G,CAAC,CAAC;YAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC7B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAE5B,IAAI,EAAE,CAAC;QACX,CAAC,CAAC;IACN,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAqD,CAAC;IAEvE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAE3B,OAAO,QAAQ,CAAC;AACpB,CAAC;AAvCD,oCAuCC"}
1
+ {"version":3,"file":"pino.js","sourceRoot":"","sources":["../src/pino.ts"],"names":[],"mappings":";;;;AAAA,wDAAwB;AACxB,yDAAyD;AAEzD,+BAA8B;AAC9B,mCAA6D;AAc7D,SAAS,aAAa;IAClB,MAAM,OAAO,GAAQ,EAAE,CAAC;IAExB,IAAI,IAAA,WAAK,GAAE,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,aAAa,EAAE,gCAAgC;YACvD,OAAO,EAAE,EAAE;SACd,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,IAAI,CAAC;QACT,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;KAChC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAuB;QAC/B,iDAAiD;QACjD,SAAS,EAAE,EAAE,OAAO,EAAE;QACtB,KAAK,CAAC,IAAS;YACX,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,IAAA,kBAAU,GAAE,EAAE,CAAC;YACrC,CAAC;YACD,OAAO,EAAE,CAAC;QACd,CAAC;KACJ,CAAC;IAEF,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAEtC,SAAgB,YAAY,CAAC,OAAyB;IAClD,MAAM,MAAM,GAAG,IAAA,cAAI,EAAC;QAChB,GAAG,aAAa,EAAE;KACrB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAA0C,CAAC;QAErH,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAQ,GAAG,CAAC;YAC1B,QAAQ,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACV,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,UAAU,GAAG,GAAG,EAAE;gBACpB,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACxC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACzC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAElD,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;YAC/G,CAAC,CAAC;YAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC7B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAE5B,IAAA,kBAAU,EAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;IACN,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAqD,CAAC;IAEvE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAE3B,OAAO,QAAQ,CAAC;AACpB,CAAC;AApCD,oCAoCC"}
package/dist/rotate.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const generator = (time, index) => {
4
+ if (!time) {
5
+ return 'server.log';
6
+ }
7
+ time = new Date(time);
8
+ const month = String(time.getMonth() + 1).padStart(2, '0');
9
+ const day = String(time.getDate()).padStart(2, '0');
10
+ if (index) {
11
+ const count = String(index).padStart(3, '0');
12
+ return `server.${time.getFullYear()}${month}${day}-${count}.log`;
13
+ }
14
+ return `server.${time.getFullYear()}${month}${day}.log`;
15
+ };
16
+ exports.default = (options) => {
17
+ const { createStream } = require('rotating-file-stream');
18
+ const { path } = options;
19
+ return createStream(generator, {
20
+ size: '50M',
21
+ maxSize: '500M',
22
+ interval: '1d',
23
+ path,
24
+ });
25
+ };
26
+ //# sourceMappingURL=rotate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate.js","sourceRoot":"","sources":["../src/rotate.ts"],"names":[],"mappings":";;AAMA,MAAM,SAAS,GAAG,CAAC,IAAmB,EAAE,KAAc,EAAE,EAAE;IACtD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,YAAY,CAAC;IACxB,CAAC;IACD,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,UAAU,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC;IACrE,CAAC;IACD,OAAO,UAAU,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,GAAG,GAAG,MAAM,CAAC;AAC5D,CAAC,CAAC;AAEF,kBAAe,CAAC,OAAsC,EAAE,EAAE;IACtD,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAA0C,CAAC;IAElG,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,OAAO,YAAY,CAAC,SAAS,EAAE;QAC3B,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,IAAI;QACd,IAAI;KACP,CAAC,CAAC;AACP,CAAC,CAAC"}
package/dist/test.js CHANGED
@@ -15,11 +15,11 @@ process.env.NODE_ENV = 'development';
15
15
  // logger.warn('execed');
16
16
  // logger.error(new Error('not found'));
17
17
  const pino_1 = require("./pino");
18
- const trace_1 = require("./trace");
19
18
  const logger = (0, pino_1.createLogger)();
20
- logger.warn({ data: { a: 2 } }, '123');
21
- const e = new Error('123');
22
- (0, trace_1.runInTrace)(() => {
23
- logger.error(e, '123');
24
- });
19
+ const obj = {
20
+ i: 1,
21
+ };
22
+ setInterval(() => {
23
+ logger.warn(`${obj.i++}`);
24
+ }, 1000);
25
25
  //# sourceMappingURL=test.js.map
package/dist/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;AAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC;AACrC,uCAAuC;AACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC;AAErC,4CAA4C;AAE5C,0GAA0G;AAE1G,4DAA4D;AAC5D,iCAAiC;AACjC,6BAA6B;AAC7B,+BAA+B;AAC/B,gCAAgC;AAChC,6BAA6B;AAC7B,qBAAqB;AACrB,yBAAyB;AACzB,wCAAwC;AAExC,iCAAsC;AACtC,mCAAqC;AAErC,MAAM,MAAM,GAAG,IAAA,mBAAY,GAAE,CAAC;AAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAEvC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;AAE3B,IAAA,kBAAU,EAAC,GAAG,EAAE;IACZ,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;AAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC;AACrC,uCAAuC;AACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC;AAErC,4CAA4C;AAE5C,0GAA0G;AAE1G,4DAA4D;AAC5D,iCAAiC;AACjC,6BAA6B;AAC7B,+BAA+B;AAC/B,gCAAgC;AAChC,6BAA6B;AAC7B,qBAAqB;AACrB,yBAAyB;AACzB,wCAAwC;AAExC,iCAAsC;AAGtC,MAAM,MAAM,GAAG,IAAA,mBAAY,GAAE,CAAC;AAE9B,MAAM,GAAG,GAAG;IACR,CAAC,EAAE,CAAC;CACP,CAAC;AACF,WAAW,CAAC,GAAG,EAAE;IACb,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC,EAAE,IAAI,CAAC,CAAC"}
package/dist/trace.js CHANGED
@@ -1,21 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setTraceId = exports.getTraceId = exports.runInTrace = exports.getNewTraceId = void 0;
3
+ exports.setTraceId = exports.getTraceId = exports.runInTrace = void 0;
4
4
  const async_hooks_1 = require("async_hooks");
5
- const nanoid_1 = require("nanoid");
6
5
  const als = new async_hooks_1.AsyncLocalStorage();
7
- // https://github.com/CyberAP/nanoid-dictionary/blob/master/src/nolookalikes.js
8
- exports.getNewTraceId = (0, nanoid_1.customAlphabet)('346789ABCDEFGHJKLMNPQRTUVWXYabcdefghijkmnpqrtwxyz', 5);
9
6
  function runInTrace(fn) {
10
- return als.run({ traceId: (0, exports.getNewTraceId)() }, fn);
7
+ const { v4 } = require('uuid');
8
+ return als.run({ traceId: v4() }, fn);
11
9
  }
12
10
  exports.runInTrace = runInTrace;
13
11
  function getTraceId() {
14
12
  return als.getStore()?.traceId;
15
13
  }
16
14
  exports.getTraceId = getTraceId;
17
- function setTraceId() {
18
- return als.getStore()?.traceId;
15
+ function setTraceId(traceId) {
16
+ return als.enterWith({ traceId });
19
17
  }
20
18
  exports.setTraceId = setTraceId;
21
19
  //# sourceMappingURL=trace.js.map
package/dist/trace.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,mCAAwC;AAExC,MAAM,GAAG,GAAG,IAAI,+BAAiB,EAA6B,CAAC;AAE/D,+EAA+E;AAClE,QAAA,aAAa,GAAG,IAAA,uBAAc,EAAC,mDAAmD,EAAE,CAAC,CAAC,CAAC;AAEpG,SAAgB,UAAU,CAAI,EAAyB;IACnD,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAA,qBAAa,GAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAFD,gCAEC;AAED,SAAgB,UAAU;IACtB,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;AACnC,CAAC;AAFD,gCAEC;AAED,SAAgB,UAAU;IACtB,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;AACnC,CAAC;AAFD,gCAEC"}
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,MAAM,GAAG,GAAG,IAAI,+BAAiB,EAA6B,CAAC;AAE/D,SAAgB,UAAU,CAAI,EAAyB;IACnD,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAHD,gCAGC;AAED,SAAgB,UAAU;IACtB,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;AACnC,CAAC;AAFD,gCAEC;AAED,SAAgB,UAAU,CAAC,OAAe;IACtC,OAAO,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC;AAFD,gCAEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rife/logger",
3
- "version": "0.0.5-beta.25",
3
+ "version": "0.0.5-beta.27",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./src/index.ts",
@@ -9,13 +9,14 @@
9
9
  "require": "./dist/index.js"
10
10
  },
11
11
  "./pino": {
12
- "require": "./dist/pino.js"
12
+ "require": "./dist/pino.js",
13
+ "types": "./src/pino.ts"
13
14
  }
14
15
  },
15
16
  "typesVersions": {
16
17
  "*": {
17
18
  "pino": [
18
- "./src/pino"
19
+ "./src/pino.ts"
19
20
  ]
20
21
  }
21
22
  },
@@ -26,15 +27,16 @@
26
27
  ],
27
28
  "dependencies": {
28
29
  "chalk": "4",
29
- "nanoid": "^3.3.6",
30
30
  "pino": "^8.16.1",
31
31
  "pino-http": "^8.5.1",
32
32
  "pino-pretty": "^10.2.3",
33
33
  "pino-std-serializers": "^6.2.2",
34
+ "rotating-file-stream": "^3.2.1",
34
35
  "safe-stable-stringify": "^2.4.3",
36
+ "uuid": "^9.0.1",
35
37
  "winston": "^3.9.0",
36
38
  "winston-daily-rotate-file": "^4.7.1",
37
- "@rife/config": "0.0.5-beta.25"
39
+ "@rife/config": "0.0.5-beta.27"
38
40
  },
39
41
  "scripts": {
40
42
  "dev": "infra dev",
package/src/pino.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import pino from 'pino';
2
2
  // https://github.com/pinojs/pino/blob/master/docs/api.md
3
3
 
4
- import { getTraceId } from './trace';
5
4
  import { isDev } from './env';
5
+ import { getTraceId, runInTrace, setTraceId } from './trace';
6
6
 
7
7
  export interface ILogger {
8
8
  debug: pino.LogFn;
@@ -29,13 +29,19 @@ function getPinoConfig() {
29
29
 
30
30
  targets.push({
31
31
  level: 'debug',
32
- target: 'pino/file',
33
- options: { destination: './.logs/1.log', mkdir: true },
32
+ target: './rotate',
33
+ options: { path: './.logs/' },
34
34
  });
35
35
 
36
36
  const config: pino.LoggerOptions = {
37
37
  // base: { pid: undefined, hostname: undefined },
38
38
  transport: { targets },
39
+ mixin(data: any) {
40
+ if (!data?.traceId) {
41
+ return { traceId: getTraceId() };
42
+ }
43
+ return {};
44
+ },
39
45
  };
40
46
 
41
47
  return config;
@@ -44,13 +50,8 @@ function getPinoConfig() {
44
50
  const startTime = Symbol('startTime');
45
51
 
46
52
  export function createLogger(options?: ILogger.Options) {
47
- let data: any = {};
48
-
49
53
  const logger = pino({
50
54
  ...getPinoConfig(),
51
- mixin() {
52
- return { ...data };
53
- },
54
55
  });
55
56
 
56
57
  const express = () => {
@@ -60,21 +61,23 @@ export function createLogger(options?: ILogger.Options) {
60
61
  const response: any = res;
61
62
  response[startTime] = response[startTime] || Date.now();
62
63
  const traceId = req.headers['trace-id'];
63
-
64
+ if (traceId) {
65
+ setTraceId(traceId);
66
+ }
64
67
  const onComplete = () => {
65
68
  res.removeListener('close', onComplete);
66
69
  res.removeListener('finish', onComplete);
67
70
  res.removeListener('error', onComplete);
68
71
  const duration = Date.now() - response[startTime];
69
72
 
70
- logger.info({ traceId, duration, request: mapHttpRequest(req).req, response: mapHttpResponse(res).res });
73
+ logger.info({ duration, request: mapHttpRequest(req).req, response: mapHttpResponse(res).res }, 'request');
71
74
  };
72
75
 
73
76
  res.on('close', onComplete);
74
77
  res.on('finish', onComplete);
75
78
  res.on('error', onComplete);
76
79
 
77
- next();
80
+ runInTrace(next);
78
81
  };
79
82
  };
80
83
  const instance = logger as typeof logger & { express: typeof express };
package/src/rotate.ts ADDED
@@ -0,0 +1,32 @@
1
+ import type { Options } from 'rotating-file-stream';
2
+
3
+ export interface PinoRotatingFileStreamOptions extends Options {
4
+ path: string;
5
+ }
6
+
7
+ const generator = (time: number | Date, index?: number) => {
8
+ if (!time) {
9
+ return 'server.log';
10
+ }
11
+ time = new Date(time);
12
+
13
+ const month = String(time.getMonth() + 1).padStart(2, '0');
14
+ const day = String(time.getDate()).padStart(2, '0');
15
+ if (index) {
16
+ const count = String(index).padStart(3, '0');
17
+ return `server.${time.getFullYear()}${month}${day}-${count}.log`;
18
+ }
19
+ return `server.${time.getFullYear()}${month}${day}.log`;
20
+ };
21
+
22
+ export default (options: PinoRotatingFileStreamOptions) => {
23
+ const { createStream } = require('rotating-file-stream') as typeof import('rotating-file-stream');
24
+
25
+ const { path } = options;
26
+ return createStream(generator, {
27
+ size: '50M',
28
+ maxSize: '500M',
29
+ interval: '1d',
30
+ path,
31
+ });
32
+ };
package/src/test.ts CHANGED
@@ -20,10 +20,10 @@ import { createLogger } from './pino';
20
20
  import { runInTrace } from './trace';
21
21
 
22
22
  const logger = createLogger();
23
- logger.warn({ data: { a: 2 } }, '123');
24
23
 
25
- const e = new Error('123');
26
-
27
- runInTrace(() => {
28
- logger.error(e, '123');
29
- });
24
+ const obj = {
25
+ i: 1,
26
+ };
27
+ setInterval(() => {
28
+ logger.warn(`${obj.i++}`);
29
+ }, 1000);
package/src/trace.ts CHANGED
@@ -1,20 +1,16 @@
1
1
  import { AsyncLocalStorage } from 'async_hooks';
2
2
 
3
- import { customAlphabet } from 'nanoid';
4
-
5
3
  const als = new AsyncLocalStorage<{ traceId: string } & any>();
6
4
 
7
- // https://github.com/CyberAP/nanoid-dictionary/blob/master/src/nolookalikes.js
8
- export const getNewTraceId = customAlphabet('346789ABCDEFGHJKLMNPQRTUVWXYabcdefghijkmnpqrtwxyz', 5);
9
-
10
5
  export function runInTrace<T>(fn: (...args: any[]) => T): T {
11
- return als.run({ traceId: getNewTraceId() }, fn);
6
+ const { v4 } = require('uuid');
7
+ return als.run({ traceId: v4() }, fn);
12
8
  }
13
9
 
14
10
  export function getTraceId() {
15
11
  return als.getStore()?.traceId;
16
12
  }
17
13
 
18
- export function setTraceId() {
19
- return als.getStore()?.traceId;
14
+ export function setTraceId(traceId: string) {
15
+ return als.enterWith({ traceId });
20
16
  }