@@ -3,85 +3,91 @@ import fs from 'node:fs'
33import path from 'node:path'
44import { createLogger , format , transports } from 'winston'
55
6- const { combine, timestamp, label, printf } = format
6+ const { combine, timestamp, label, printf, colorize , splat } = format
77
8- let MCP_USE_DEBUG = 0
8+ export type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly'
99
10- const debugEnv = process . env . DEBUG ?. toLowerCase ( )
11- if ( debugEnv === '2' ) {
12- MCP_USE_DEBUG = 2
10+ interface LoggerOptions {
11+ level ?: LogLevel
12+ console ?: boolean
13+ file ?: string
1314}
14- else if ( debugEnv === '1' ) {
15- MCP_USE_DEBUG = 1
15+
16+ const DEFAULT_LOGGER_NAME = 'mcp-use'
17+
18+ function resolveLevel ( env : string | undefined ) : LogLevel {
19+ switch ( env ?. trim ( ) ) {
20+ case '2' :
21+ return 'debug'
22+ case '1' :
23+ return 'info'
24+ default :
25+ return 'warn'
26+ }
1627}
1728
18- const defaultFormat = printf ( ( { level, message, label, timestamp } ) =>
19- `${ timestamp } [${ label } ] ${ level . toUpperCase ( ) } : ${ message } ` ,
20- )
29+ const defaultFormatter = printf ( ( { level, message, label, timestamp } ) => {
30+ return `${ timestamp } [${ label } ] ${ level . toUpperCase ( ) } : ${ message } `
31+ } )
2132
2233export class Logger {
23- private static loggers : Record < string , WinstonLogger > = { }
34+ private static instances : Record < string , WinstonLogger > = { }
2435
25- public static getLogger ( name : string = 'mcp_use' ) : WinstonLogger {
26- if ( ! this . loggers [ name ] ) {
27- this . loggers [ name ] = createLogger ( {
28- level : 'warn' ,
36+ public static get ( name : string = DEFAULT_LOGGER_NAME ) : WinstonLogger {
37+ if ( ! this . instances [ name ] ) {
38+ this . instances [ name ] = createLogger ( {
39+ level : resolveLevel ( process . env . DEBUG ) ,
2940 format : combine (
41+ colorize ( ) ,
42+ splat ( ) ,
3043 label ( { label : name } ) ,
3144 timestamp ( ) ,
32- defaultFormat ,
45+ defaultFormatter ,
3346 ) ,
3447 transports : [ ] ,
3548 } )
3649 }
37- return this . loggers [ name ]
50+
51+ return this . instances [ name ]
3852 }
3953
40- public static configure (
41- level ?: string ,
42- toConsole : boolean = true ,
43- toFile ?: string ,
44- ) : void {
45- const root = this . getLogger ( )
46-
47- if ( ! level ) {
48- level
49- = MCP_USE_DEBUG === 2
50- ? 'debug'
51- : MCP_USE_DEBUG === 1 ? 'info' : 'warn'
52- }
53- root . level = level
54+ public static configure ( options : LoggerOptions = { } ) : void {
55+ const { level, console = true , file } = options
56+ const resolvedLevel = level ?? resolveLevel ( process . env . DEBUG )
57+
58+ const root = this . get ( )
59+
60+ root . level = resolvedLevel
5461
5562 root . clear ( )
5663
57- if ( toConsole ) {
64+ if ( console ) {
5865 root . add ( new transports . Console ( ) )
5966 }
6067
61- if ( toFile ) {
62- const dir = path . dirname ( toFile )
63- if ( dir && ! fs . existsSync ( dir ) ) {
68+ if ( file ) {
69+ const dir = path . dirname ( path . resolve ( file ) )
70+ if ( ! fs . existsSync ( dir ) ) {
6471 fs . mkdirSync ( dir , { recursive : true } )
6572 }
66- root . add ( new transports . File ( { filename : toFile } ) )
73+ root . add ( new transports . File ( { filename : file } ) )
6774 }
6875 }
6976
70- public static setDebug ( debugLevel : number = 2 ) : void {
71- MCP_USE_DEBUG = debugLevel
77+ public static setDebug ( enabled : boolean | 0 | 1 | 2 ) : void {
78+ let level : LogLevel
79+ if ( enabled === 2 || enabled === true )
80+ level = 'debug'
81+ else if ( enabled === 1 )
82+ level = 'info'
83+ else level = 'warn'
7284
73- process . env . LANGCHAIN_VERBOSE = debugLevel >= 1 ? 'true' : 'false'
74-
75- const newLevel
76- = debugLevel === 2
77- ? 'debug'
78- : debugLevel === 1 ? 'info' : 'warn'
79- Object . values ( this . loggers ) . forEach ( ( log ) => {
80- log . level = newLevel
85+ Object . values ( this . instances ) . forEach ( ( logger ) => {
86+ logger . level = level
8187 } )
88+ process . env . DEBUG = enabled ? ( enabled === true ? '2' : String ( enabled ) ) : '0'
8289 }
8390}
8491
8592Logger . configure ( )
86-
87- export const logger = Logger . getLogger ( )
93+ export const logger = Logger . get ( )
0 commit comments