logxpert 2.0.0 → 2.0.3

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # LogXpert
2
2
 
3
- LogXpert is a powerful logging library for Node.js that provides easy-to-use logging methods with colorful formatted output and optional file logging support.
3
+ Colorful console logging for Node.js with optional daily file rotation.
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,90 +8,100 @@ LogXpert is a powerful logging library for Node.js that provides easy-to-use log
8
8
  npm install logxpert
9
9
  ```
10
10
 
11
- ## Usage
11
+ Requires Node.js `>=18`. Recommended minimum: Node.js 22 LTS. See [NODE_SUPPORT.md](NODE_SUPPORT.md) for the full support policy.
12
12
 
13
- CommonJS:
13
+ ## Quick start
14
14
 
15
15
  ```js
16
16
  const log = require('logxpert');
17
+ // or: import log from 'logxpert';
17
18
 
18
- log('general message');
19
- log.error('error message');
20
- log.warn('warn message');
21
- log.info('info with meta', { user: 1 });
22
- log.debug({ structured: 'object' });
23
- log.error(new Error('boom'));
19
+ log('general message'); // shortcut for info
20
+ log.info('hello', { user: 1 }); // with metadata
21
+ log.error(new Error('boom')); // Errors print message + stack
22
+ log.debug(() => JSON.stringify(hugeObject)); // lazy: skipped if level disabled
24
23
  ```
25
24
 
26
- ESM:
25
+ Levels: `error → warn → info → http → verbose → debug → silly` (default `debug`).
27
26
 
28
27
  ```js
29
- import log from 'logxpert';
28
+ log.setLevel('info'); // or via LOG_LEVEL env variable
29
+ ```
30
+
31
+ ## File logging
32
+
33
+ ```js
34
+ log.settings({ files: { folder: 'logs' } });
35
+ // → logs/logxpert-2026_10_08.log (prefix defaults to your package.json name)
36
+
37
+ log.settings({ files: { folder: 'logs', prefix: 'api' } });
38
+ // → logs/api-2026_10_08.log
30
39
 
31
- log.info('hello');
40
+ // Full control (omit prefix when used):
41
+ log.settings({ files: { folder: 'logs', filePattern: 'app-%datePattern%.log' } });
32
42
  ```
33
43
 
34
- Set level (`LOG_LEVEL` env also respected):
44
+ `%datePattern%` is replaced by the date (`datePattern` defaults to `YYYY_MM_DD`). Combining `prefix` with `filePattern` throws — pick one.
35
45
 
36
46
  ```js
37
- log.setLevel('info');
38
- console.log(log.getLevel());
47
+ log.settings({
48
+ files: {
49
+ folder: 'logs',
50
+ runNumber: true, // off by default → app-2026_10_08-1.log, -2.log, ...
51
+ maxFile: '14d', // retention
52
+ maxSize: '20m', // rotate above this size
53
+ zippedArchive: true,
54
+ },
55
+ });
56
+ log.close(); // call on shutdown
39
57
  ```
40
58
 
41
- Isolated instances and child loggers:
59
+ ## Console & instances
42
60
 
43
61
  ```js
62
+ log.settings({
63
+ console: {
64
+ enableTimestamp: true,
65
+ timestampFormat: 'YYYY-MM-DD HH:mm:ss',
66
+ colorize: true,
67
+ },
68
+ });
69
+
44
70
  const { createLogger } = require('logxpert');
45
- const apiLog = createLogger({ level: 'info' });
46
- apiLog.info('isolated');
71
+ const apiLog = createLogger({ level: 'info' }); // independent instance
47
72
 
48
- const child = log.child({ service: 'api' });
49
- child.info('child message');
73
+ const child = log.child({ service: 'api' }); // bound context
50
74
  ```
51
75
 
52
- ### File output & console timestamp
76
+ ## Full configuration (copy-paste)
53
77
 
54
78
  ```js
55
79
  log.settings({
56
- level: 'debug',
80
+ level: 'debug', // or process.env.LOG_LEVEL
57
81
  console: {
58
82
  enableTimestamp: true,
59
83
  timestampFormat: 'YYYY-MM-DD HH:mm:ss',
60
84
  timestampPrefix: '',
61
85
  timestampSuffix: '',
62
- colorize: true
86
+ colorize: true,
63
87
  },
64
88
  files: {
65
89
  folder: 'logs',
66
- filename: 'application-%DATE%.log',
67
- filesName: 'YYYY-MM-DD',
90
+ prefix: undefined, // defaults to your package.json name
91
+ // filePattern: 'app-%datePattern%.log', // full control (omit prefix if used)
92
+ datePattern: 'YYYY_MM_DD',
93
+ runNumber: false, // or true, or { separator: '-', padding: 0, startAt: 1 }
68
94
  maxFile: '14d',
69
95
  maxSize: '20m',
70
- zippedArchive: false
96
+ zippedArchive: false,
71
97
  }
72
98
  });
73
99
  ```
74
100
 
75
- Close file transports on shutdown:
76
-
77
- ```js
78
- log.close();
79
- ```
80
-
81
- ## API Reference
82
-
83
- - **log(message, ...meta):** info level.
84
- - **log.error/warn/info/debug/http/verbose/silly(message, ...meta)**
85
- - **log.log(level, message, ...meta)**
86
- - **log.settings({ console, files, level })**
87
- - **log.setLevel(level) / log.getLevel()**
88
- - **log.createLogger(options):** independent instance.
89
- - **log.child(meta):** child logger with bound context.
90
- - **log.close():** remove file transport.
101
+ Legacy aliases: `appName` (= `prefix`), `filename`/`pattern` (= `filePattern`), `filesName`/`dateFormat` (= `datePattern`).
91
102
 
92
- Console options: `enableTimestamp`, `timestampFormat`, `timestampPrefix`, `timestampSuffix`, `colorize`, `level`.
93
- Files options: `folder`, `filename`, `filesName`/`datePattern`, `maxFile`/`maxFiles`, `maxSize`, `zippedArchive`, `level`.
103
+ Security: messages are stripped of ANSI escapes and control characters (except `\n`, `\t`); file patterns escaping the log folder (`..`, absolute paths) are rejected.
94
104
 
95
105
  ## License
96
106
 
97
- GPL-3.0-only. See [LICENSE](LICENSE).
107
+ Apache-2.0. See [LICENSE](LICENSE).
package/index.d.mts ADDED
@@ -0,0 +1,22 @@
1
+ import log from './index.js';
2
+
3
+ export default log;
4
+
5
+ export const settings: typeof log.settings;
6
+ export const setLevel: typeof log.setLevel;
7
+ export const getLevel: typeof log.getLevel;
8
+ export const child: typeof log.child;
9
+ export const close: typeof log.close;
10
+ export const createLogger: typeof log.createLogger;
11
+ export const error: typeof log.error;
12
+ export const warn: typeof log.warn;
13
+ export const info: typeof log.info;
14
+ export const debug: typeof log.debug;
15
+
16
+ export type LogLevel = log.LogLevel;
17
+ export type ConsoleOptions = log.ConsoleOptions;
18
+ export type FilesOptions = log.FilesOptions;
19
+ export type RunNumberOptions = log.RunNumberOptions;
20
+ export type LogSettingsOptions = log.LogSettingsOptions;
21
+ export type ChildLogger = log.ChildLogger;
22
+ export type LogXpert = log.LogXpert;
package/index.d.ts CHANGED
@@ -1,57 +1,79 @@
1
- export type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly';
2
-
3
- export interface ConsoleOptions {
4
- enableTimestamp?: boolean;
5
- timestampFormat?: string;
6
- timestampPrefix?: string;
7
- timestampSuffix?: string;
8
- colorize?: boolean;
9
- level?: LogLevel;
10
- }
1
+ declare namespace log {
2
+ export type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly';
11
3
 
12
- export interface FilesOptions {
13
- folder?: string;
14
- filesName?: string;
15
- datePattern?: string;
16
- filename?: string;
17
- maxFile?: string;
18
- maxFiles?: string;
19
- maxSize?: string;
20
- zippedArchive?: boolean;
21
- level?: LogLevel;
22
- }
4
+ export interface ConsoleOptions {
5
+ enableTimestamp?: boolean;
6
+ timestampFormat?: string;
7
+ timestampPrefix?: string;
8
+ timestampSuffix?: string;
9
+ colorize?: boolean;
10
+ level?: LogLevel;
11
+ }
23
12
 
24
- export interface LogSettingsOptions {
25
- console?: ConsoleOptions;
26
- files?: FilesOptions;
27
- level?: LogLevel;
28
- }
13
+ export interface RunNumberOptions {
14
+ enabled?: boolean;
15
+ separator?: string;
16
+ padding?: number;
17
+ startAt?: number;
18
+ }
29
19
 
30
- export interface ChildLogger {
31
- error(message: unknown, ...meta: unknown[]): void;
32
- warn(message: unknown, ...meta: unknown[]): void;
33
- info(message: unknown, ...meta: unknown[]): void;
34
- debug(message: unknown, ...meta: unknown[]): void;
35
- log(level: LogLevel, message: unknown, ...meta: unknown[]): void;
36
- }
20
+ export interface FilesOptions {
21
+ folder?: string;
22
+ /** Preferred: date format for %DATE%. */
23
+ datePattern?: string;
24
+ /** @deprecated Use datePattern. */
25
+ filesName?: string;
26
+ dateFormat?: string;
27
+ /** Preferred: filename template containing %DATE%. */
28
+ filePattern?: string;
29
+ pattern?: string;
30
+ /** @deprecated Use filePattern. */
31
+ filename?: string;
32
+ /** Preferred: filename prefix used when no pattern is given. */
33
+ prefix?: string;
34
+ /** @deprecated Use prefix. */
35
+ appName?: string;
36
+ runNumber?: boolean | RunNumberOptions;
37
+ maxFile?: string;
38
+ maxFiles?: string;
39
+ maxSize?: string;
40
+ zippedArchive?: boolean;
41
+ level?: LogLevel;
42
+ }
37
43
 
38
- export interface LogXpert {
39
- (message: unknown, ...meta: unknown[]): void;
40
- error(message: unknown, ...meta: unknown[]): void;
41
- warn(message: unknown, ...meta: unknown[]): void;
42
- info(message: unknown, ...meta: unknown[]): void;
43
- debug(message: unknown, ...meta: unknown[]): void;
44
- http(message: unknown, ...meta: unknown[]): void;
45
- verbose(message: unknown, ...meta: unknown[]): void;
46
- silly(message: unknown, ...meta: unknown[]): void;
47
- log(level: LogLevel, message: unknown, ...meta: unknown[]): void;
48
- settings(options?: LogSettingsOptions): void;
49
- setLevel(level: LogLevel): void;
50
- getLevel(): string;
51
- child(meta?: Record<string, unknown>): ChildLogger;
52
- close(): void;
53
- createLogger(options?: LogSettingsOptions): LogXpert;
44
+ export interface LogSettingsOptions {
45
+ console?: ConsoleOptions;
46
+ files?: FilesOptions;
47
+ level?: LogLevel;
48
+ }
49
+
50
+ export interface ChildLogger {
51
+ error(message: unknown, ...meta: unknown[]): void;
52
+ warn(message: unknown, ...meta: unknown[]): void;
53
+ info(message: unknown, ...meta: unknown[]): void;
54
+ debug(message: unknown, ...meta: unknown[]): void;
55
+ log(level: LogLevel, message: unknown, ...meta: unknown[]): void;
56
+ }
57
+
58
+ export interface LogXpert {
59
+ (message: unknown, ...meta: unknown[]): void;
60
+ error(message: unknown, ...meta: unknown[]): void;
61
+ warn(message: unknown, ...meta: unknown[]): void;
62
+ info(message: unknown, ...meta: unknown[]): void;
63
+ debug(message: unknown, ...meta: unknown[]): void;
64
+ http(message: unknown, ...meta: unknown[]): void;
65
+ verbose(message: unknown, ...meta: unknown[]): void;
66
+ silly(message: unknown, ...meta: unknown[]): void;
67
+ log(level: LogLevel, message: unknown, ...meta: unknown[]): void;
68
+ settings(options?: LogSettingsOptions): void;
69
+ setLevel(level: LogLevel): void;
70
+ getLevel(): string;
71
+ child(meta?: Record<string, unknown>): ChildLogger;
72
+ close(): void;
73
+ createLogger(options?: LogSettingsOptions): LogXpert;
74
+ }
54
75
  }
55
76
 
56
- declare const log: LogXpert;
57
- export default log;
77
+ declare const log: log.LogXpert;
78
+
79
+ export = log;