1+ import type { LogLevel as LogLevelType , OnLogCallback } from "../types.js" ;
2+
13/**
2- * Simple logger utility with configurable debug mode
4+ * Simple logger utility with configurable debug mode and external log forwarding
35 */
46export enum LogLevel {
57 ERROR = 0 ,
@@ -11,28 +13,38 @@ export enum LogLevel {
1113export interface LoggerConfig {
1214 debug ?: boolean ;
1315 prefix ?: string ;
16+ scope ?: string ;
17+ onLog ?: OnLogCallback ;
1418}
1519
1620export class Logger {
1721 private debugEnabled : boolean ;
1822 private prefix : string ;
23+ private scope : string ;
24+ private onLog ?: OnLogCallback ;
1925
2026 constructor ( config : LoggerConfig = { } ) {
2127 this . debugEnabled = config . debug ?? false ;
2228 this . prefix = config . prefix ?? "[PostHog Agent]" ;
29+ this . scope = config . scope ?? "agent" ;
30+ this . onLog = config . onLog ;
2331 }
2432
2533 setDebug ( enabled : boolean ) {
2634 this . debugEnabled = enabled ;
2735 }
2836
37+ setOnLog ( onLog : OnLogCallback | undefined ) {
38+ this . onLog = onLog ;
39+ }
40+
2941 private formatMessage (
3042 level : string ,
3143 message : string ,
3244 data ?: unknown ,
3345 ) : string {
3446 const timestamp = new Date ( ) . toISOString ( ) ;
35- const base = `${ timestamp } ${ this . prefix } ${ level } ${ message } ` ;
47+ const base = `${ timestamp } ${ this . prefix } [ ${ level } ] ${ message } ` ;
3648
3749 if ( data !== undefined ) {
3850 return `${ base } ${ JSON . stringify ( data , null , 2 ) } ` ;
@@ -41,45 +53,49 @@ export class Logger {
4153 return base ;
4254 }
4355
44- error ( message : string , error ?: Error | unknown ) {
45- // Always log errors
46- if ( error instanceof Error ) {
47- console . error (
48- this . formatMessage ( "[ERROR]" , message , {
49- message : error . message ,
50- stack : error . stack ,
51- } ) ,
52- ) ;
53- } else {
54- console . error ( this . formatMessage ( "[ERROR]" , message , error ) ) ;
56+ private emitLog ( level : LogLevelType , message : string , data ?: unknown ) {
57+ if ( this . onLog ) {
58+ this . onLog ( level , this . scope , message , data ) ;
59+ return ;
60+ }
61+
62+ const shouldLog = this . debugEnabled || level === "error" ;
63+
64+ if ( shouldLog ) {
65+ console [ level ] ( this . formatMessage ( level . toLowerCase ( ) , message , data ) ) ;
5566 }
5667 }
5768
69+ error ( message : string , error ?: Error | unknown ) {
70+ const data =
71+ error instanceof Error
72+ ? { message : error . message , stack : error . stack }
73+ : error ;
74+
75+ this . emitLog ( "error" , message , data ) ;
76+ }
77+
5878 warn ( message : string , data ?: unknown ) {
59- if ( this . debugEnabled ) {
60- console . warn ( this . formatMessage ( "[WARN]" , message , data ) ) ;
61- }
79+ this . emitLog ( "warn" , message , data ) ;
6280 }
6381
6482 info ( message : string , data ?: unknown ) {
65- if ( this . debugEnabled ) {
66- console . log ( this . formatMessage ( "[INFO]" , message , data ) ) ;
67- }
83+ this . emitLog ( "info" , message , data ) ;
6884 }
6985
7086 debug ( message : string , data ?: unknown ) {
71- if ( this . debugEnabled ) {
72- console . log ( this . formatMessage ( "[DEBUG]" , message , data ) ) ;
73- }
87+ this . emitLog ( "debug" , message , data ) ;
7488 }
7589
7690 /**
77- * Create a child logger with additional prefix
91+ * Create a child logger with additional prefix and scope
7892 */
7993 child ( childPrefix : string ) : Logger {
8094 return new Logger ( {
8195 debug : this . debugEnabled ,
8296 prefix : `${ this . prefix } [${ childPrefix } ]` ,
97+ scope : `${ this . scope } :${ childPrefix } ` ,
98+ onLog : this . onLog ,
8399 } ) ;
84100 }
85101}
0 commit comments