logxpert 1.0.5 → 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/CHANGELOG.md +20 -0
- package/LICENSE +201 -674
- package/README.md +107 -108
- package/index.d.mts +22 -0
- package/index.d.ts +79 -0
- package/main.js +354 -176
- package/main.mjs +14 -0
- package/package.json +55 -6
- package/CODE_OF_CONDUCT.md +0 -128
package/README.md
CHANGED
|
@@ -1,108 +1,107 @@
|
|
|
1
|
-
# LogXpert
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
log
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
//
|
|
41
|
-
log.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
log.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
This project is licensed under GNU General Public License v3.0. See the [LICENSE](LICENSE) file for details.
|
|
1
|
+
# LogXpert
|
|
2
|
+
|
|
3
|
+
Colorful console logging for Node.js with optional daily file rotation.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install logxpert
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires Node.js `>=18`. Recommended minimum: Node.js 22 LTS. See [NODE_SUPPORT.md](NODE_SUPPORT.md) for the full support policy.
|
|
12
|
+
|
|
13
|
+
## Quick start
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
const log = require('logxpert');
|
|
17
|
+
// or: import log from 'logxpert';
|
|
18
|
+
|
|
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
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Levels: `error → warn → info → http → verbose → debug → silly` (default `debug`).
|
|
26
|
+
|
|
27
|
+
```js
|
|
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
|
|
39
|
+
|
|
40
|
+
// Full control (omit prefix when used):
|
|
41
|
+
log.settings({ files: { folder: 'logs', filePattern: 'app-%datePattern%.log' } });
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`%datePattern%` is replaced by the date (`datePattern` defaults to `YYYY_MM_DD`). Combining `prefix` with `filePattern` throws — pick one.
|
|
45
|
+
|
|
46
|
+
```js
|
|
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
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Console & instances
|
|
60
|
+
|
|
61
|
+
```js
|
|
62
|
+
log.settings({
|
|
63
|
+
console: {
|
|
64
|
+
enableTimestamp: true,
|
|
65
|
+
timestampFormat: 'YYYY-MM-DD HH:mm:ss',
|
|
66
|
+
colorize: true,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const { createLogger } = require('logxpert');
|
|
71
|
+
const apiLog = createLogger({ level: 'info' }); // independent instance
|
|
72
|
+
|
|
73
|
+
const child = log.child({ service: 'api' }); // bound context
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Full configuration (copy-paste)
|
|
77
|
+
|
|
78
|
+
```js
|
|
79
|
+
log.settings({
|
|
80
|
+
level: 'debug', // or process.env.LOG_LEVEL
|
|
81
|
+
console: {
|
|
82
|
+
enableTimestamp: true,
|
|
83
|
+
timestampFormat: 'YYYY-MM-DD HH:mm:ss',
|
|
84
|
+
timestampPrefix: '',
|
|
85
|
+
timestampSuffix: '',
|
|
86
|
+
colorize: true,
|
|
87
|
+
},
|
|
88
|
+
files: {
|
|
89
|
+
folder: 'logs',
|
|
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 }
|
|
94
|
+
maxFile: '14d',
|
|
95
|
+
maxSize: '20m',
|
|
96
|
+
zippedArchive: false,
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Legacy aliases: `appName` (= `prefix`), `filename`/`pattern` (= `filePattern`), `filesName`/`dateFormat` (= `datePattern`).
|
|
102
|
+
|
|
103
|
+
Security: messages are stripped of ANSI escapes and control characters (except `\n`, `\t`); file patterns escaping the log folder (`..`, absolute paths) are rejected.
|
|
104
|
+
|
|
105
|
+
## License
|
|
106
|
+
|
|
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
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
declare namespace log {
|
|
2
|
+
export type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly';
|
|
3
|
+
|
|
4
|
+
export interface ConsoleOptions {
|
|
5
|
+
enableTimestamp?: boolean;
|
|
6
|
+
timestampFormat?: string;
|
|
7
|
+
timestampPrefix?: string;
|
|
8
|
+
timestampSuffix?: string;
|
|
9
|
+
colorize?: boolean;
|
|
10
|
+
level?: LogLevel;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface RunNumberOptions {
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
separator?: string;
|
|
16
|
+
padding?: number;
|
|
17
|
+
startAt?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
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
|
+
}
|
|
43
|
+
|
|
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
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
declare const log: log.LogXpert;
|
|
78
|
+
|
|
79
|
+
export = log;
|