"Copyright placeholder" Object extend [ logConfig [ "I provide access to the global LogConfig" ^ LogConfig default ] logManager [ ^ LogManager default ] logDebug: aMessage area: anArea [ (self logManager) log: LogEntry withMsg: aMessage level: LogLevel debug area: anArea context: self ] logInfo: aMessage area: anArea [ (self logManager) log: LogEntry withMsg: aMessage level: LogLevel info area: anArea context: self ] logNotice: aMessage area: anArea [ (self logManager) log: LogEntry withMsg: aMessage level: LogLevel notice area: anArea context: self ] logError: aMessage area: anArea [ (self logManager) log: LogEntry withMsg: aMessage level: LogLevel error area: anArea context: self ] ] Object subclass: LogEntry [ | level ctx area msg | LogEntry class >> withMsg: aMsg level: anLevel area: anArea context: aContext [ ^ self new msg: aMsg; level: anLevel; area: anArea; context: aContext; yourself. ] msg [ ^ msg ] msg: aMsg [ msg := aMsg. ] level [ ^ level ] level: anLevel [ level := anLevel; ] area [ ^ area ] area: anArea [ area := anArea. ] context [ ^ context ] context: aContext [ context := aContext. ] ] Object subclass: LogLevel [ LogLevel class >> debug [ ^ 1 ] LogLevel class >> info [ ^ 3 ] LogLevel class >> notice [ ^ 5 ] LogLevel class >> error [ ^ 7 ] ] Object subclass: LogArea [ | name enabled level | Areas := Dictionary new. LogArea class >> findArea: aSymbol [ "Find an Area and place the default into our dictionary" ^ Areas at: aSymbol ifAbsent: [ LogArea allSubclassesDo: [ :each | each name = aSymbol ifTrue: [ | area | area := each default. Areas at: aSymbol put: area. ^ area ]. ]. ] ] LogArea class >> default [ ^ self subclassResponsibility ] name [ ^ self subclassResponsibility ] enabled [ ^ enabled ] enabled: anEnabled [ enabled := anEnabled. ] minLevel [ ^ level ] minLevel: aLevel [ level := aLevel ] ] Object subclass: LogConfig [ Config := LogConfig new. LogConfig class >> default [ ^ Config ] ] Object subclass: LogManager [ Log := LogManager new. LogManager class >> default [ ^ Log ] log: message source: anObject area: anArea level: anLevel [ | area | area := LogArea findArea: anArea. (area enabled and: [anLevel >= area minLevel]) ifTrue: [ Transcript show: message; nl. ]. ] ] Eval [ ]