@@ -6,6 +6,7 @@ import fs from 'node:fs';
66import path from 'node:path' ;
77
88type LogLevel = 'debug' | 'info' | 'warn' | 'error' ;
9+ type FormatOptions = { useColor ?: boolean ; truncateStrings ?: boolean } ;
910
1011const COLORS = {
1112 debug : '\x1b[36m' ,
@@ -15,6 +16,7 @@ const COLORS = {
1516} ;
1617
1718const RESET = '\x1b[0m' ;
19+ const CONSOLE_META_CHAR_LIMIT = 100 ;
1820
1921class Logger {
2022 private level : LogLevel ;
@@ -28,21 +30,45 @@ class Logger {
2830 this . logFilePath = path . join ( logDir , 'browseros-server.log' ) ;
2931 }
3032
31- private format ( level : LogLevel , message : string , meta ?: object ) : string {
33+ private format (
34+ level : LogLevel ,
35+ message : string ,
36+ meta ?: object ,
37+ { useColor = true , truncateStrings = false } : FormatOptions = { } ,
38+ ) : string {
3239 const timestamp = new Date ( ) . toISOString ( ) ;
33- const color = COLORS [ level ] ;
34- const metaStr = meta ? `\n${ JSON . stringify ( meta , null , 2 ) } ` : '' ;
35- return `${ color } [${ timestamp } ] [${ level . toUpperCase ( ) } ]${ RESET } ${ message } ${ metaStr } ` ;
40+ const prefix = useColor
41+ ? `${ COLORS [ level ] } [${ timestamp } ] [${ level . toUpperCase ( ) } ]${ RESET } `
42+ : `[${ timestamp } ] [${ level . toUpperCase ( ) } ]` ;
43+ const metaStr = meta
44+ ? `\n${ this . stringifyMeta ( meta , truncateStrings ) } `
45+ : '' ;
46+ return `${ prefix } ${ message } ${ metaStr } ` ;
3647 }
3748
38- private formatPlain ( level : LogLevel , message : string , meta ?: object ) : string {
39- const timestamp = new Date ( ) . toISOString ( ) ;
40- const metaStr = meta ? `\n${ JSON . stringify ( meta , null , 2 ) } ` : '' ;
41- return `[${ timestamp } ] [${ level . toUpperCase ( ) } ] ${ message } ${ metaStr } ` ;
49+ private stringifyMeta ( meta : object , truncateStrings : boolean ) : string {
50+ return JSON . stringify (
51+ meta ,
52+ ( key , value ) => {
53+ if (
54+ truncateStrings &&
55+ typeof value === 'string' &&
56+ value . length > CONSOLE_META_CHAR_LIMIT
57+ ) {
58+ const extra = value . length - CONSOLE_META_CHAR_LIMIT ;
59+ return `${ value . slice ( 0 , CONSOLE_META_CHAR_LIMIT ) } ... (+${ extra } chars)` ;
60+ }
61+ return value ;
62+ } ,
63+ 2 ,
64+ ) ;
4265 }
4366
4467 private log ( level : LogLevel , message : string , meta ?: object ) {
45- const formatted = this . format ( level , message , meta ) ;
68+ const formatted = this . format ( level , message , meta , {
69+ useColor : true ,
70+ truncateStrings : true ,
71+ } ) ;
4672
4773 switch ( level ) {
4874 case 'error' :
@@ -56,7 +82,10 @@ class Logger {
5682 }
5783
5884 if ( this . logFilePath ) {
59- const plainFormatted = this . formatPlain ( level , message , meta ) ;
85+ const plainFormatted = this . format ( level , message , meta , {
86+ useColor : false ,
87+ truncateStrings : false ,
88+ } ) ;
6089 try {
6190 fs . appendFileSync ( this . logFilePath , plainFormatted + '\n' ) ;
6291 } catch ( error ) {
0 commit comments