@qianxude/logger 0.1.4

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/env.js ADDED
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Environment variable parsing for logger options.
3
+ *
4
+ * This module provides conventions and parsing functions for configuring
5
+ * logger options via environment variables.
6
+ */
7
+ /**
8
+ * Environment variable names for logger configuration.
9
+ */
10
+ export const LOG_ENV_VARS = {
11
+ // Common/Pretty options
12
+ LOG_LEVEL: 'LOG_LEVEL',
13
+ LOG_COLORIZE: 'LOG_COLORIZE',
14
+ LOG_TRANSLATE_TIME: 'LOG_TRANSLATE_TIME',
15
+ // File roll options
16
+ LOG_FILE: 'LOG_FILE',
17
+ LOG_FILE_SIZE: 'LOG_FILE_SIZE',
18
+ LOG_FILE_FREQUENCY: 'LOG_FILE_FREQUENCY',
19
+ LOG_FILE_EXTENSION: 'LOG_FILE_EXTENSION',
20
+ LOG_FILE_SYMLINK: 'LOG_FILE_SYMLINK',
21
+ LOG_FILE_LIMIT_COUNT: 'LOG_FILE_LIMIT_COUNT',
22
+ LOG_FILE_DATE_FORMAT: 'LOG_FILE_DATE_FORMAT',
23
+ LOG_FILE_MKDIR: 'LOG_FILE_MKDIR',
24
+ };
25
+ /** Valid log levels for validation */
26
+ const VALID_LOG_LEVELS = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];
27
+ /**
28
+ * Parse a boolean from environment variable string.
29
+ *
30
+ * @param value - The environment variable value
31
+ * @param defaultValue - Default value if not set
32
+ * @returns The parsed boolean
33
+ */
34
+ function parseEnvBoolean(value, defaultValue) {
35
+ if (value === undefined) {
36
+ return defaultValue;
37
+ }
38
+ const normalized = value.toLowerCase();
39
+ if (normalized === 'true') {
40
+ return true;
41
+ }
42
+ if (normalized === 'false') {
43
+ return false;
44
+ }
45
+ throw new Error(`Invalid boolean value '${value}'. Must be 'true' or 'false'.`);
46
+ }
47
+ /**
48
+ * Parse a number from environment variable string.
49
+ *
50
+ * @param value - The environment variable value
51
+ * @param defaultValue - Default value if not set (undefined means optional)
52
+ * @returns The parsed number or undefined if not set and no default
53
+ */
54
+ function parseEnvNumber(value, defaultValue) {
55
+ if (value === undefined) {
56
+ return defaultValue;
57
+ }
58
+ const parsed = Number(value);
59
+ if (Number.isNaN(parsed)) {
60
+ throw new Error(`Invalid number value '${value}'. Must be a valid number.`);
61
+ }
62
+ return parsed;
63
+ }
64
+ /**
65
+ * Parse a log level from environment variable string.
66
+ *
67
+ * @param value - The environment variable value
68
+ * @returns The validated LogLevel or undefined if not set
69
+ * @throws Error if value is invalid
70
+ */
71
+ function parseEnvLogLevel(value) {
72
+ if (value === undefined) {
73
+ return undefined;
74
+ }
75
+ const normalized = value.toLowerCase();
76
+ if (!VALID_LOG_LEVELS.includes(normalized)) {
77
+ throw new Error(`Invalid LOG_LEVEL value '${value}'. Must be one of: ${VALID_LOG_LEVELS.join(', ')}.`);
78
+ }
79
+ return normalized;
80
+ }
81
+ /**
82
+ * Parse frequency option from environment variable string.
83
+ *
84
+ * @param value - The environment variable value
85
+ * @returns The parsed frequency value or undefined if not set
86
+ * @throws Error if value is invalid
87
+ */
88
+ function parseEnvFrequency(value) {
89
+ if (value === undefined) {
90
+ return undefined;
91
+ }
92
+ const normalized = value.toLowerCase();
93
+ if (normalized === 'daily' || normalized === 'hourly') {
94
+ return normalized;
95
+ }
96
+ // Try to parse as number (milliseconds)
97
+ const parsed = Number(value);
98
+ if (Number.isNaN(parsed)) {
99
+ throw new Error(`Invalid LOG_FILE_FREQUENCY value '${value}'. Must be 'daily', 'hourly', or a number (milliseconds).`);
100
+ }
101
+ return parsed;
102
+ }
103
+ /**
104
+ * Parse file size option from environment variable string.
105
+ *
106
+ * Accepts formats like '10m', '100k', '1g', or plain number (MB).
107
+ *
108
+ * @param value - The environment variable value
109
+ * @returns The parsed size value or undefined if not set
110
+ */
111
+ function parseEnvSize(value) {
112
+ if (value === undefined) {
113
+ return undefined;
114
+ }
115
+ // Check if it's a string with unit suffix (k, m, g)
116
+ const match = value.match(/^(\d+(?:\.\d+)?)([kmg])?$/i);
117
+ if (!match) {
118
+ throw new Error(`Invalid LOG_FILE_SIZE value '${value}'. Must be a number or string like '10m', '100k', '1g'.`);
119
+ }
120
+ // If has suffix, return as string; otherwise return as number
121
+ if (match[2]) {
122
+ return value.toLowerCase();
123
+ }
124
+ return Number(value);
125
+ }
126
+ /**
127
+ * Parse PrettyPinoOptions from environment variables.
128
+ *
129
+ * All environment variables are optional.
130
+ *
131
+ * ## Optional Environment Variables
132
+ *
133
+ * - `LOG_LEVEL`: Log level ('fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace'), default: 'info'
134
+ * - `LOG_COLORIZE`: Enable colorized output ('true' | 'false'), default: true
135
+ * - `LOG_TRANSLATE_TIME`: Time format string, default: 'SYS:standard'
136
+ *
137
+ * @param env - Environment variables object (defaults to process.env)
138
+ * @returns Partial PrettyPinoOptions parsed from environment
139
+ * @throws Error if any environment variable value is invalid
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * const options = parsePrettyPinoOptionsEnv(process.env);
144
+ * const logger = createPrettyPino(options);
145
+ * ```
146
+ */
147
+ export function parsePrettyPinoOptionsEnv(env = process.env) {
148
+ const options = {};
149
+ const level = parseEnvLogLevel(env[LOG_ENV_VARS.LOG_LEVEL]);
150
+ if (level !== undefined) {
151
+ options.level = level;
152
+ }
153
+ // For boolean options, only set if the env var is defined
154
+ if (env[LOG_ENV_VARS.LOG_COLORIZE] !== undefined) {
155
+ options.colorize = parseEnvBoolean(env[LOG_ENV_VARS.LOG_COLORIZE], true);
156
+ }
157
+ if (env[LOG_ENV_VARS.LOG_TRANSLATE_TIME] !== undefined) {
158
+ options.translateTime = env[LOG_ENV_VARS.LOG_TRANSLATE_TIME];
159
+ }
160
+ return options;
161
+ }
162
+ export function parsePinoRollOptionsEnv(env = process.env, options) {
163
+ const result = {};
164
+ const invalidVars = [];
165
+ const logFile = env[LOG_ENV_VARS.LOG_FILE];
166
+ if (logFile !== undefined && logFile !== '') {
167
+ result.file = logFile;
168
+ }
169
+ const size = parseEnvSize(env[LOG_ENV_VARS.LOG_FILE_SIZE]);
170
+ if (size !== undefined) {
171
+ result.size = size;
172
+ }
173
+ const frequency = parseEnvFrequency(env[LOG_ENV_VARS.LOG_FILE_FREQUENCY]);
174
+ if (frequency !== undefined) {
175
+ result.frequency = frequency;
176
+ }
177
+ if (env[LOG_ENV_VARS.LOG_FILE_EXTENSION] !== undefined) {
178
+ result.extension = env[LOG_ENV_VARS.LOG_FILE_EXTENSION];
179
+ }
180
+ if (env[LOG_ENV_VARS.LOG_FILE_SYMLINK] !== undefined) {
181
+ result.symlink = parseEnvBoolean(env[LOG_ENV_VARS.LOG_FILE_SYMLINK], true);
182
+ }
183
+ const limitCount = parseEnvNumber(env[LOG_ENV_VARS.LOG_FILE_LIMIT_COUNT]);
184
+ if (limitCount !== undefined) {
185
+ result.limit = { count: limitCount };
186
+ }
187
+ if (env[LOG_ENV_VARS.LOG_FILE_DATE_FORMAT] !== undefined) {
188
+ result.dateFormat = env[LOG_ENV_VARS.LOG_FILE_DATE_FORMAT];
189
+ }
190
+ if (env[LOG_ENV_VARS.LOG_FILE_MKDIR] !== undefined) {
191
+ result.mkdir = parseEnvBoolean(env[LOG_ENV_VARS.LOG_FILE_MKDIR], true);
192
+ }
193
+ // Validate required env var: LOG_FILE
194
+ if (result.file === undefined) {
195
+ invalidVars.push(LOG_ENV_VARS.LOG_FILE);
196
+ }
197
+ // Handle missing required vars
198
+ if (invalidVars.length > 0) {
199
+ if (options?.noThrow) {
200
+ result._invalid = true;
201
+ result._invalidVars = invalidVars;
202
+ }
203
+ else {
204
+ throw new Error(`Missing required environment variable(s): ${invalidVars.join(', ')}. ` +
205
+ `LOG_FILE is required for file-based logging.`);
206
+ }
207
+ }
208
+ return result;
209
+ }
210
+ export function parseDuoTargetPinoOptionsEnv(env = process.env, options) {
211
+ const prettyOptions = parsePrettyPinoOptionsEnv(env);
212
+ const rollOptions = parsePinoRollOptionsEnv(env, options ?? {});
213
+ const result = {
214
+ ...prettyOptions,
215
+ ...rollOptions,
216
+ };
217
+ return result;
218
+ }
219
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @qianxude/logger
3
+ *
4
+ * Production-ready pino-based logger implementations for qianxude stack.
5
+ */
6
+ export { createPrettyPino, createDuoTargetPino, createPino, createRollFilePino, type PrettyPinoOptions, type DuoTargetPinoOptions, } from './pino-factory.js';
7
+ export { PinoLogger, wrapPinoLogger } from './pino-logger.js';
8
+ export type { PinoRollOptions, PinoRollLimitOptions } from './types/index.js';
9
+ export { parsePrettyPinoOptionsEnv, parsePinoRollOptionsEnv, parseDuoTargetPinoOptionsEnv, LOG_ENV_VARS, } from './env.js';
10
+ export type { ParseEnvOptions, ParseEnvMeta, ParsedPinoRollOptions, ParsedDuoTargetPinoOptions, } from './env.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG9D,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG9E,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,YAAY,GACb,MAAM,UAAU,CAAC;AAGlB,YAAY,EACV,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @qianxude/logger
3
+ *
4
+ * Production-ready pino-based logger implementations for qianxude stack.
5
+ */
6
+ // Factory functions for creating raw pino loggers
7
+ export { createPrettyPino, createDuoTargetPino, createPino, createRollFilePino, } from './pino-factory.js';
8
+ // PinoLogger class and wrapper function
9
+ export { PinoLogger, wrapPinoLogger } from './pino-logger.js';
10
+ // Environment variable parsing
11
+ export { parsePrettyPinoOptionsEnv, parsePinoRollOptionsEnv, parseDuoTargetPinoOptionsEnv, LOG_ENV_VARS, } from './env.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,kDAAkD;AAClD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAE3B,wCAAwC;AACxC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAK9D,+BAA+B;AAC/B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,YAAY,GACb,MAAM,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type re-exports from @qianxude/shared for convenience.
3
+ */
4
+ export type { Logger, LogLevel, Context, LevelEntry, Entry, GenericLog, LeveledLog } from '@qianxude/shared';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import pino from 'pino';
2
+ import type { PrettyOptions } from 'pino-pretty';
3
+ import type { LogLevel } from '@qianxude/shared';
4
+ import type { PinoRollOptions } from './types/index.js';
5
+ /**
6
+ * Options for creating a pretty console pino logger.
7
+ */
8
+ export interface PrettyPinoOptions {
9
+ /** Minimum log level (default: 'info') */
10
+ level?: LogLevel;
11
+ /** Enable colorized output (default: true) */
12
+ colorize?: boolean;
13
+ /** Time format for timestamps (default: 'SYS:standard') */
14
+ translateTime?: string;
15
+ /** Custom pino-pretty options */
16
+ prettyOptions?: PrettyOptions;
17
+ }
18
+ /**
19
+ * Options for creating a duo-target pino logger (console + file with rotation).
20
+ */
21
+ export interface DuoTargetPinoOptions extends PrettyPinoOptions, PinoRollOptions {
22
+ }
23
+ /**
24
+ * Create a pretty console pino logger for development.
25
+ *
26
+ * @param options - Configuration options
27
+ * @returns A pino.Logger instance configured for pretty console output
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * import { createPrettyPino } from '@qianxude/logger';
32
+ *
33
+ * const logger = createPrettyPino({ level: 'debug' });
34
+ * logger.info({ userId: 123 }, 'User logged in');
35
+ * ```
36
+ */
37
+ export declare function createPrettyPino(options?: PrettyPinoOptions): pino.Logger;
38
+ /**
39
+ * Create a duo-target pino logger that outputs to both console (pretty) and file (with rotation).
40
+ *
41
+ * @param options - Configuration options including file path and rotation settings
42
+ * @returns A pino.Logger instance configured for dual output
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * import { createDuoTargetPino } from '@qianxude/logger';
47
+ *
48
+ * const logger = createDuoTargetPino({
49
+ * level: 'info',
50
+ * file: './logs/app.log',
51
+ * frequency: 'daily',
52
+ * limit: { count: 7 }, // Keep 7 days of logs
53
+ * });
54
+ * logger.info({ userId: 123 }, 'User logged in');
55
+ * ```
56
+ */
57
+ export declare function createDuoTargetPino(options: DuoTargetPinoOptions): pino.Logger;
58
+ /**
59
+ * Create a pino logger with custom configuration.
60
+ *
61
+ * @param options - Pino logger options
62
+ * @returns A pino.Logger instance
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { createPino } from '@qianxude/logger';
67
+ *
68
+ * const logger = createPino({
69
+ * level: 'debug',
70
+ * base: { service: 'my-service' },
71
+ * });
72
+ * ```
73
+ */
74
+ export declare function createPino(options?: pino.LoggerOptions): pino.Logger;
75
+ /**
76
+ * Create a pino logger with a single file transport (with rotation).
77
+ *
78
+ * @param options - Configuration options including file path and rotation settings
79
+ * @returns A pino.Logger instance configured for file output only
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * import { createRollFilePino } from '@qianxude/logger';
84
+ *
85
+ * const logger = createRollFilePino({
86
+ * level: 'info',
87
+ * file: './logs/app.log',
88
+ * frequency: 'daily',
89
+ * });
90
+ * ```
91
+ */
92
+ export declare function createRollFilePino(options: PinoRollOptions & {
93
+ level?: LogLevel;
94
+ file: string;
95
+ }): pino.Logger;
96
+ //# sourceMappingURL=pino-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino-factory.d.ts","sourceRoot":"","sources":["../src/pino-factory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAgC,MAAM,MAAM,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAkBxD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB,EAAE,eAAe;CAAG;AAenF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,IAAI,CAAC,MAAM,CAmB7E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAiD9E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,IAAI,CAAC,aAAkB,GAAG,IAAI,CAAC,MAAM,CAExE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,GAAG;IAAE,KAAK,CAAC,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5D,IAAI,CAAC,MAAM,CA4Bb"}
@@ -0,0 +1,167 @@
1
+ import pino from 'pino';
2
+ /**
3
+ * Resolve a transport target to its absolute path.
4
+ * Required for Bun workspace compatibility where pino's default resolution fails
5
+ * due to symlinked node_modules structure.
6
+ *
7
+ * @param target - The transport target package name or path
8
+ * @returns The resolved absolute path, or the original target if resolution fails
9
+ */
10
+ function resolveTransportTarget(target) {
11
+ try {
12
+ return import.meta.resolve(target);
13
+ }
14
+ catch {
15
+ return target; // fallback to original if resolution fails (e.g., already absolute path)
16
+ }
17
+ }
18
+ /**
19
+ * Pino level mapping to match our LogLevel.
20
+ * Pino uses numeric levels: trace=10, debug=20, info=30, warn=40, error=50, fatal=60.
21
+ */
22
+ const LOG_LEVEL_MAP = {
23
+ trace: 'trace',
24
+ debug: 'debug',
25
+ info: 'info',
26
+ warn: 'warn',
27
+ error: 'error',
28
+ fatal: 'fatal',
29
+ };
30
+ /**
31
+ * Create a pretty console pino logger for development.
32
+ *
33
+ * @param options - Configuration options
34
+ * @returns A pino.Logger instance configured for pretty console output
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { createPrettyPino } from '@qianxude/logger';
39
+ *
40
+ * const logger = createPrettyPino({ level: 'debug' });
41
+ * logger.info({ userId: 123 }, 'User logged in');
42
+ * ```
43
+ */
44
+ export function createPrettyPino(options = {}) {
45
+ const { level = 'info', colorize = true, translateTime = 'SYS:standard', prettyOptions = {}, } = options;
46
+ return pino({
47
+ level: LOG_LEVEL_MAP[level],
48
+ transport: {
49
+ target: resolveTransportTarget('pino-pretty'),
50
+ options: {
51
+ colorize,
52
+ translateTime,
53
+ ...prettyOptions,
54
+ },
55
+ },
56
+ });
57
+ }
58
+ /**
59
+ * Create a duo-target pino logger that outputs to both console (pretty) and file (with rotation).
60
+ *
61
+ * @param options - Configuration options including file path and rotation settings
62
+ * @returns A pino.Logger instance configured for dual output
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { createDuoTargetPino } from '@qianxude/logger';
67
+ *
68
+ * const logger = createDuoTargetPino({
69
+ * level: 'info',
70
+ * file: './logs/app.log',
71
+ * frequency: 'daily',
72
+ * limit: { count: 7 }, // Keep 7 days of logs
73
+ * });
74
+ * logger.info({ userId: 123 }, 'User logged in');
75
+ * ```
76
+ */
77
+ export function createDuoTargetPino(options) {
78
+ const { level = 'info', file, colorize = true, translateTime = 'SYS:standard', frequency, size, mkdir = true, symlink = true, limit, prettyOptions = {}, } = options;
79
+ // Build pino-roll options
80
+ const rollOptions = {
81
+ file,
82
+ mkdir,
83
+ symlink,
84
+ ...(frequency !== undefined && { frequency }),
85
+ ...(size !== undefined && { size }),
86
+ ...(limit !== undefined && { limit }),
87
+ };
88
+ const prettyTargetOptions = {
89
+ target: resolveTransportTarget('pino-pretty'),
90
+ level: LOG_LEVEL_MAP[level],
91
+ options: {
92
+ colorize,
93
+ translateTime,
94
+ ...prettyOptions,
95
+ },
96
+ };
97
+ const rollTargetOptions = {
98
+ target: resolveTransportTarget('pino-roll'),
99
+ level: LOG_LEVEL_MAP[level],
100
+ options: rollOptions,
101
+ };
102
+ return pino({
103
+ level: LOG_LEVEL_MAP[level],
104
+ transport: {
105
+ targets: [
106
+ prettyTargetOptions,
107
+ rollTargetOptions,
108
+ ],
109
+ },
110
+ });
111
+ }
112
+ /**
113
+ * Create a pino logger with custom configuration.
114
+ *
115
+ * @param options - Pino logger options
116
+ * @returns A pino.Logger instance
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * import { createPino } from '@qianxude/logger';
121
+ *
122
+ * const logger = createPino({
123
+ * level: 'debug',
124
+ * base: { service: 'my-service' },
125
+ * });
126
+ * ```
127
+ */
128
+ export function createPino(options = {}) {
129
+ return pino(options);
130
+ }
131
+ /**
132
+ * Create a pino logger with a single file transport (with rotation).
133
+ *
134
+ * @param options - Configuration options including file path and rotation settings
135
+ * @returns A pino.Logger instance configured for file output only
136
+ *
137
+ * @example
138
+ * ```ts
139
+ * import { createRollFilePino } from '@qianxude/logger';
140
+ *
141
+ * const logger = createRollFilePino({
142
+ * level: 'info',
143
+ * file: './logs/app.log',
144
+ * frequency: 'daily',
145
+ * });
146
+ * ```
147
+ */
148
+ export function createRollFilePino(options) {
149
+ const { level = 'info', file, frequency, size, mkdir = true, symlink = true, limit, } = options;
150
+ // Build pino-roll options
151
+ const rollOptions = {
152
+ file,
153
+ mkdir,
154
+ symlink,
155
+ ...(frequency !== undefined && { frequency }),
156
+ ...(size !== undefined && { size }),
157
+ ...(limit !== undefined && { limit }),
158
+ };
159
+ return pino({
160
+ level: LOG_LEVEL_MAP[level],
161
+ transport: {
162
+ target: resolveTransportTarget('pino-roll'),
163
+ options: rollOptions,
164
+ },
165
+ });
166
+ }
167
+ //# sourceMappingURL=pino-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino-factory.js","sourceRoot":"","sources":["../src/pino-factory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAgC,MAAM,MAAM,CAAC;AAKpD;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,MAAc;IAC5C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,yEAAyE;IAC1F,CAAC;AACH,CAAC;AAqBD;;;GAGG;AACH,MAAM,aAAa,GAAiC;IAClD,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACf,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA6B,EAAE;IAC9D,MAAM,EACJ,KAAK,GAAG,MAAM,EACd,QAAQ,GAAG,IAAI,EACf,aAAa,GAAG,cAAc,EAC9B,aAAa,GAAG,EAAE,GACnB,GAAG,OAAO,CAAC;IAEZ,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,SAAS,EAAE;YACT,MAAM,EAAE,sBAAsB,CAAC,aAAa,CAAC;YAC7C,OAAO,EAAE;gBACP,QAAQ;gBACR,aAAa;gBACb,GAAG,aAAa;aACjB;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,EACJ,KAAK,GAAG,MAAM,EACd,IAAI,EACJ,QAAQ,GAAG,IAAI,EACf,aAAa,GAAG,cAAc,EAC9B,SAAS,EACT,IAAI,EACJ,KAAK,GAAG,IAAI,EACZ,OAAO,GAAG,IAAI,EACd,KAAK,EACL,aAAa,GAAG,EAAE,GACnB,GAAG,OAAO,CAAC;IAEZ,0BAA0B;IAC1B,MAAM,WAAW,GAAoB;QACnC,IAAI;QACJ,KAAK;QACL,OAAO;QACP,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7C,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;KACtC,CAAC;IAEF,MAAM,mBAAmB,GAA0C;QACjE,MAAM,EAAE,sBAAsB,CAAC,aAAa,CAAC;QAC7C,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,OAAO,EAAE;YACP,QAAQ;YACR,aAAa;YACb,GAAG,aAAa;SACjB;KACF,CAAC;IAEF,MAAM,iBAAiB,GAA4C;QACjE,MAAM,EAAE,sBAAsB,CAAC,WAAW,CAAC;QAC3C,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,OAAO,EAAE,WAAW;KACrB,CAAC;IAEF,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,SAAS,EAAE;YACT,OAAO,EAAE;gBACP,mBAAmB;gBACnB,iBAAiB;aAClB;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,UAAU,CAAC,UAA8B,EAAE;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA6D;IAE7D,MAAM,EACJ,KAAK,GAAG,MAAM,EACd,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,KAAK,GAAG,IAAI,EACZ,OAAO,GAAG,IAAI,EACd,KAAK,GACN,GAAG,OAAO,CAAC;IAEZ,0BAA0B;IAC1B,MAAM,WAAW,GAAoB;QACnC,IAAI;QACJ,KAAK;QACL,OAAO;QACP,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7C,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;KACtC,CAAC;IAEF,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,SAAS,EAAE;YACT,MAAM,EAAE,sBAAsB,CAAC,WAAW,CAAC;YAC3C,OAAO,EAAE,WAAW;SACrB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type pino from 'pino';
2
+ import { BaseLogger, type LogSupport, type Context } from '@qianxude/shared';
3
+ /**
4
+ * Pino-backed logger that extends BaseLogger.
5
+ * Wraps a pino.Logger instance and provides stack-standard logging methods.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { createPrettyPino, PinoLogger } from '@qianxude/logger';
10
+ *
11
+ * const rawPino = createPrettyPino({ level: 'debug' });
12
+ * const logger = new PinoLogger(rawPino, { service: 'my-app' });
13
+ *
14
+ * logger.info('Application started');
15
+ * logger.error({ err: new Error('Oops') }, 'Something went wrong');
16
+ *
17
+ * const childLogger = logger.spawn({ requestId: 'abc-123' });
18
+ * childLogger.info('Processing request');
19
+ * ```
20
+ */
21
+ export declare class PinoLogger extends BaseLogger {
22
+ protected _pino: pino.Logger;
23
+ protected _delegate: LogSupport;
24
+ /**
25
+ * Create a new PinoLogger wrapping a pino instance.
26
+ *
27
+ * @param pinoInstance - The underlying pino.Logger to wrap
28
+ * @param ctx - Initial context to attach to all log messages
29
+ */
30
+ constructor(pinoInstance: pino.Logger, ctx?: Context);
31
+ /**
32
+ * Get the underlying pino logger instance.
33
+ * Useful for advanced pino-specific operations.
34
+ */
35
+ get pino(): pino.Logger;
36
+ /**
37
+ * Create a child logger that extends the current context.
38
+ * The child logger shares the same pino instance but has its own context.
39
+ */
40
+ spawn(ctx?: Context): this;
41
+ }
42
+ /**
43
+ * Wrap a raw pino logger into a stack-standard Logger.
44
+ *
45
+ * @param pinoInstance - The pino.Logger instance to wrap
46
+ * @param ctx - Initial context to attach
47
+ * @returns A PinoLogger instance implementing the Logger interface
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * import pino from 'pino';
52
+ * import { wrapPinoLogger } from '@qianxude/logger';
53
+ *
54
+ * const rawPino = pino({ level: 'info' });
55
+ * const logger = wrapPinoLogger(rawPino, { app: 'my-service' });
56
+ * ```
57
+ */
58
+ export declare function wrapPinoLogger(pinoInstance: pino.Logger, ctx?: Context): PinoLogger;
59
+ //# sourceMappingURL=pino-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino-logger.d.ts","sourceRoot":"","sources":["../src/pino-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAkC,MAAM,kBAAkB,CAAC;AA6B7G;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;IAC7B,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC;IAEhC;;;;;OAKG;gBACS,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAE,OAAY;IAOxD;;;OAGG;IACH,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAEtB;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI;CAO3B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,CAEnF"}