@autofleet/logger 4.0.3 → 4.0.5

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/package.json CHANGED
@@ -1,14 +1,19 @@
1
1
  {
2
2
  "name": "@autofleet/logger",
3
- "version": "4.0.3",
3
+ "version": "4.0.5",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "readme.md"
10
+ ],
6
11
  "scripts": {
7
12
  "coverage": "jest --coverage --forceExit --runInBand",
8
13
  "test": "jest --runInBand",
9
14
  "test-auto": "jest --watch --runInBand",
10
- "linter": "./node_modules/.bin/eslint ./src",
11
- "build": "tsc",
15
+ "linter": "eslint ./src",
16
+ "build": "tsc --project tsconfig.build.json",
12
17
  "prepublishOnly": "npm run build",
13
18
  "example": "ts-node example.ts"
14
19
  },
package/readme.md ADDED
@@ -0,0 +1,63 @@
1
+ # Autofleet Node.js Logger
2
+
3
+ A Winston-like logger for Node.js backend, now using Pino.
4
+
5
+ ## Usage:
6
+ The logger provides a Winston-like API once initialized:
7
+
8
+ ```js
9
+ import Logger from '@autofleet/logger';
10
+
11
+ const logger = Logger();
12
+
13
+ logger.info('it is working');
14
+ logger.error('errors displayed in logs/error.log', new Error('test error'));
15
+ logger.debug('debug with object', { a: 5 });
16
+ ```
17
+
18
+
19
+ # Migration to V4
20
+
21
+ In V4, we transitioned the underlying logger from Winston to Pino. Since Pino has a different API, we’ve added class methods to maintain a similar API, with two key changes:
22
+ * **Context Middleware:** Previously, the Zehut package would receive a Winston logger upon initialization to enable automatic tracing in logs. To remove this coupling, we’ve introduced a new method, addContextMiddleware, which allows you to add labels to each log. You can use this method to add the trace ID (see example below).
23
+ * **TypeScript Compatibility:** Due to the migration to TypeScript, the import statement may differ in non-TypeScript files.
24
+
25
+
26
+ **Old Logger**
27
+ ```js
28
+ const Logger = require('@autofleet/logger');
29
+
30
+ enableTracing({
31
+ outbreakOptions: {
32
+ headersPrefix: 'x-af',
33
+ winstonLogger: logger,
34
+ },
35
+ });
36
+ ```
37
+
38
+ **New Logger**
39
+ ```javascript
40
+ // Typescript
41
+ import Logger from '@autofleet/logger';
42
+
43
+ const logger = Logger();
44
+
45
+ logger.addContextMiddleware(() => ({
46
+ traceId: zehut.outbreak.getCurrentContext()?.context?.get('x-trace-id'),
47
+ }));
48
+
49
+ // Plain nodejs
50
+ const { default: Logger } = require('@autofleet/logger');
51
+
52
+ const logger = Logger();
53
+
54
+ logger.addContextMiddleware(() => {
55
+ try {
56
+ return {
57
+ traceId: zehut.outbreak.getCurrentContext()?.context?.get('x-trace-id')
58
+ }
59
+ } catch(e) {
60
+ return {}
61
+ }
62
+ });
63
+ ```
package/.jest.config.js DELETED
@@ -1,8 +0,0 @@
1
- module.exports = {
2
- testEnvironment: 'node',
3
- coverageThreshold: {
4
- global: {
5
- lines: 80,
6
- },
7
- },
8
- };
package/dist/example.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/example.js DELETED
@@ -1,14 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const index_1 = __importDefault(require("./index"));
7
- const logger = (0, index_1.default)('info');
8
- logger.info('it is working');
9
- logger.error('errors displayed in logs/error.log', new Error('test error'));
10
- logger.debug('debug with object', { a: 5 });
11
- const loggerMiddleware = () => ({ middleware: Math.random() });
12
- logger.addContextMiddleware(loggerMiddleware);
13
- logger.info('middleware added', { a: 5 });
14
- logger.error('middleware added', new Error('test error'));
@@ -1 +0,0 @@
1
- export {};
@@ -1,50 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const index_1 = __importDefault(require("./index"));
7
- const { env } = process;
8
- describe('Logger', () => {
9
- it('it`s default level is info', () => {
10
- env.NODE_ENV = '';
11
- const logger = (0, index_1.default)();
12
- expect(logger).toBeDefined();
13
- expect(logger.level).toBe('debug');
14
- logger.info('test');
15
- });
16
- it('its default develpment level is debug', () => {
17
- env.NODE_ENV = 'development';
18
- const logger = (0, index_1.default)();
19
- expect(logger.level).toBe('debug');
20
- });
21
- it('its default test level is info', () => {
22
- env.NODE_ENV = 'test';
23
- const logger = (0, index_1.default)();
24
- expect(logger.level).toBe('info');
25
- });
26
- it('its default production level is info', () => {
27
- env.NODE_ENV = 'production';
28
- const logger = (0, index_1.default)();
29
- expect(logger.level).toBe('info');
30
- });
31
- it('its level can be override by LOG_LEVEL env variable', () => {
32
- env.NODE_ENV = 'development';
33
- env.LOG_LEVEL = 'warn';
34
- const logger = (0, index_1.default)();
35
- expect(logger.level).toBe('warn');
36
- });
37
- it('its level can be override by function variable', () => {
38
- env.NODE_ENV = 'production';
39
- env.LOG_LEVEL = 'warn';
40
- const logger = (0, index_1.default)('info');
41
- expect(logger.level).toBe('info');
42
- });
43
- it('its has functions for each level', () => {
44
- const logger = (0, index_1.default)();
45
- expect(typeof logger.error).toBe('function');
46
- expect(typeof logger.warn).toBe('function');
47
- expect(typeof logger.info).toBe('function');
48
- expect(typeof logger.debug).toBe('function');
49
- });
50
- });
package/src/example.ts DELETED
@@ -1,13 +0,0 @@
1
- import Logger from './index';
2
-
3
- const logger = Logger('info');
4
-
5
- logger.info('it is working');
6
- logger.error('errors displayed in logs/error.log', new Error('test error'));
7
- logger.debug('debug with object', { a: 5 });
8
-
9
- const loggerMiddleware = () => ({ middleware: Math.random() });
10
- logger.addContextMiddleware(loggerMiddleware);
11
-
12
- logger.info('middleware added', { a: 5 });
13
- logger.error('middleware added', new Error('test error'));
package/src/index.test.ts DELETED
@@ -1,53 +0,0 @@
1
- import Logger from './index';
2
-
3
- const { env } = process;
4
-
5
- describe('Logger', () => {
6
- it('it`s default level is info', () => {
7
- env.NODE_ENV = '';
8
- const logger = Logger();
9
- expect(logger).toBeDefined();
10
- expect(logger.level).toBe('debug');
11
- logger.info('test');
12
- });
13
-
14
- it('its default develpment level is debug', () => {
15
- env.NODE_ENV = 'development';
16
- const logger = Logger();
17
- expect(logger.level).toBe('debug');
18
- });
19
-
20
- it('its default test level is info', () => {
21
- env.NODE_ENV = 'test';
22
- const logger = Logger();
23
- expect(logger.level).toBe('info');
24
- });
25
-
26
- it('its default production level is info', () => {
27
- env.NODE_ENV = 'production';
28
- const logger = Logger();
29
- expect(logger.level).toBe('info');
30
- });
31
-
32
- it('its level can be override by LOG_LEVEL env variable', () => {
33
- env.NODE_ENV = 'development';
34
- env.LOG_LEVEL = 'warn';
35
- const logger = Logger();
36
- expect(logger.level).toBe('warn');
37
- });
38
-
39
- it('its level can be override by function variable', () => {
40
- env.NODE_ENV = 'production';
41
- env.LOG_LEVEL = 'warn';
42
- const logger = Logger('info');
43
- expect(logger.level).toBe('info');
44
- });
45
-
46
- it('its has functions for each level', () => {
47
- const logger = Logger();
48
- expect(typeof logger.error).toBe('function');
49
- expect(typeof logger.warn).toBe('function');
50
- expect(typeof logger.info).toBe('function');
51
- expect(typeof logger.debug).toBe('function');
52
- });
53
- });
package/src/index.ts DELETED
@@ -1,117 +0,0 @@
1
- import Pino from 'pino';
2
- import { gcpLogOptions } from 'pino-cloud-logging';
3
-
4
- // eslint-disable-next-line no-shadow
5
- export enum LogLevel {
6
- trace = 'trace',
7
- debug = 'debug',
8
- info = 'info',
9
- warn = 'warn',
10
- error = 'error',
11
- fatal = 'fatal',
12
- }
13
-
14
- type LogLevels = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
15
-
16
- const getLevel = (logLevel?: LogLevel): LogLevel => {
17
- if (logLevel) return logLevel;
18
- if (process.env.LOG_LEVEL) return process.env.LOG_LEVEL as LogLevel;
19
- if (process.env.NODE_ENV && ['production', 'staging', 'test'].includes(process.env.NODE_ENV)) return LogLevel.info;
20
- if (process.env.NODE_ENV === 'development') return LogLevel.debug;
21
- return LogLevel.debug;
22
- };
23
-
24
- const createLoggerInstance = (level: LogLevel, options: object) => {
25
- let loggerInstance;
26
- if (process.env.NODE_ENV === 'production') {
27
- loggerInstance = Pino(gcpLogOptions({
28
- level: process.env.PINO_LOG_LEVEL || 'info',
29
- ...options,
30
- }));
31
- } else {
32
- loggerInstance = Pino({
33
- level: process.env.PINO_LOG_LEVEL || 'info',
34
- transport: {
35
- target: 'pino-pretty',
36
- options: {
37
- colorize: true,
38
- },
39
- },
40
- ...options,
41
- });
42
- }
43
- loggerInstance.level = level;
44
- return loggerInstance;
45
- };
46
-
47
- type MiddlewareFunction = () => Record<string, unknown>;
48
-
49
- export class LoggerInstanceManager {
50
- contextMiddlewares: MiddlewareFunction[];
51
-
52
- logger: Pino.Logger;
53
-
54
- constructor(logLevel?: LogLevel) {
55
- this.contextMiddlewares = [];
56
- this.logger = createLoggerInstance(getLevel(logLevel), {
57
- mixin: () => this.addMetadata(),
58
- });
59
- }
60
-
61
- // To support winston like logging in pino
62
- winstonLikeLoggerCall(logLevel: LogLevel, message: string, meta: unknown) {
63
- if (meta) {
64
- this.logger[logLevel](meta, message);
65
- } else {
66
- this.logger[logLevel](message);
67
- }
68
- }
69
-
70
- addMetadata(): Record<string, unknown> {
71
- const newMetadata = {};
72
- this.contextMiddlewares.forEach((middleware) => {
73
- const metadata = middleware();
74
- Object.assign(newMetadata, metadata);
75
- });
76
- return newMetadata;
77
- }
78
-
79
- addContextMiddleware(middleware: MiddlewareFunction) {
80
- this.contextMiddlewares.push(middleware);
81
- }
82
-
83
- trace(message: string, meta?: unknown) {
84
- this.winstonLikeLoggerCall(LogLevel.trace, message, meta);
85
- }
86
-
87
- debug(message: string, meta?: unknown) {
88
- this.winstonLikeLoggerCall(LogLevel.debug, message, meta);
89
- }
90
-
91
- info(message: string, meta?: unknown) {
92
- this.winstonLikeLoggerCall(LogLevel.info, message, meta);
93
- }
94
-
95
- warn(message: string, meta?: unknown) {
96
- this.winstonLikeLoggerCall(LogLevel.warn, message, meta);
97
- }
98
-
99
- error(message: string, meta?: unknown) {
100
- this.winstonLikeLoggerCall(LogLevel.error, message, meta);
101
- }
102
-
103
- fatal(message: string, meta?: unknown) {
104
- this.winstonLikeLoggerCall(LogLevel.fatal, message, meta);
105
- }
106
-
107
- child(metadata: Record<string, unknown>) {
108
- return this.logger.child(metadata);
109
- }
110
-
111
- get level() {
112
- return this.logger.level;
113
- }
114
- }
115
-
116
- // eslint-disable-next-line max-len
117
- export default (loglevel?: LogLevels): LoggerInstanceManager => new LoggerInstanceManager(loglevel as LogLevel);
package/tsconfig.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES6",
4
- "module": "commonjs", /* Specify what module code is generated. */ /* Allow 'import x from y' when a module doesn't have a default export. */
5
- "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
6
- // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
7
- "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
8
-
9
- /* Type Checking */
10
- "strict": true, /* Enable all strict type-checking options. */
11
- "outDir": "./dist",
12
- "declaration": true,
13
- "rootDir": "./src",
14
- }
15
- }