| 1 | package provide tlogger 0.5 |
|---|
| 2 | |
|---|
| 3 | namespace eval ::tlogger { |
|---|
| 4 | variable services [list] |
|---|
| 5 | variable data |
|---|
| 6 | |
|---|
| 7 | array set data { |
|---|
| 8 | logfile "" |
|---|
| 9 | channel stdout |
|---|
| 10 | level notice |
|---|
| 11 | levels { debug info notice warn error critical alert emergency } |
|---|
| 12 | } |
|---|
| 13 | set data(lvidx) [lsearch $data(levels) $data(level)] |
|---|
| 14 | } |
|---|
| 15 | |
|---|
| 16 | proc ::level_str { level } { |
|---|
| 17 | string toupper $level |
|---|
| 18 | } |
|---|
| 19 | |
|---|
| 20 | proc ::tlogger::init { svc {logfile ""}} { |
|---|
| 21 | |
|---|
| 22 | variable services |
|---|
| 23 | variable data |
|---|
| 24 | upvar \#0 ::tlogger::data_${svc} mydata |
|---|
| 25 | |
|---|
| 26 | array set mydata [array get data] |
|---|
| 27 | if {[lsearch $services $svc]==-1} { |
|---|
| 28 | lappend services $svc |
|---|
| 29 | } |
|---|
| 30 | |
|---|
| 31 | set logfile [file normalize $logfile] |
|---|
| 32 | if {$mydata(logfile) ne $logfile} { |
|---|
| 33 | if {$mydata(channel) ne "stdout"} { |
|---|
| 34 | catch { |
|---|
| 35 | close $mydata(channel) |
|---|
| 36 | } |
|---|
| 37 | } |
|---|
| 38 | set mydata(logfile) $logfile |
|---|
| 39 | if {$logfile eq ""} { |
|---|
| 40 | set mydata(channel) "stdout" |
|---|
| 41 | } else { |
|---|
| 42 | if {[catch { |
|---|
| 43 | open $logfile {WRONLY CREAT APPEND} |
|---|
| 44 | } result]} { |
|---|
| 45 | puts "::tlogger::init : $result" |
|---|
| 46 | } else { |
|---|
| 47 | set mydata(channel) $result |
|---|
| 48 | } |
|---|
| 49 | } |
|---|
| 50 | } |
|---|
| 51 | } |
|---|
| 52 | |
|---|
| 53 | proc ::tlogger::close { svc } { |
|---|
| 54 | |
|---|
| 55 | upvar \#0 ::tlogger::data_${svc} mydata |
|---|
| 56 | |
|---|
| 57 | flush $mydata(channel) |
|---|
| 58 | if {$mydata(channel) ne "stdout"} { |
|---|
| 59 | catch { |
|---|
| 60 | close $mydata(channel) |
|---|
| 61 | } |
|---|
| 62 | } |
|---|
| 63 | array unset mydata |
|---|
| 64 | } |
|---|
| 65 | |
|---|
| 66 | proc ::tlogger::apache_time { } { |
|---|
| 67 | # APACHE |
|---|
| 68 | # Tue Nov 28 11:14:04 2006 |
|---|
| 69 | clock format [clock seconds] -format "%a %b %d %H:%M:%S %Y" |
|---|
| 70 | } |
|---|
| 71 | |
|---|
| 72 | proc ::tlogger::level { svc {level ""} } { |
|---|
| 73 | |
|---|
| 74 | upvar \#0 ::tlogger::data_${svc} mydata |
|---|
| 75 | |
|---|
| 76 | if {$level eq ""} { |
|---|
| 77 | set mydata(level) |
|---|
| 78 | } else { |
|---|
| 79 | set lvidx [lsearch $mydata(levels) $level] |
|---|
| 80 | if {$lvidx==-1} { |
|---|
| 81 | return "" |
|---|
| 82 | } else { |
|---|
| 83 | set cur $mydata(level) |
|---|
| 84 | set mydata(level) $level |
|---|
| 85 | set mydata(lvidx) $lvidx |
|---|
| 86 | set cur |
|---|
| 87 | } |
|---|
| 88 | } |
|---|
| 89 | } |
|---|
| 90 | |
|---|
| 91 | proc ::tlogger::log { svc level msg } { |
|---|
| 92 | |
|---|
| 93 | variable services |
|---|
| 94 | |
|---|
| 95 | if {[lsearch $services $svc]!=-1} { |
|---|
| 96 | upvar \#0 ::tlogger::data_${svc} mydata |
|---|
| 97 | |
|---|
| 98 | set lvidx [lsearch $mydata(levels) $level] |
|---|
| 99 | if {$lvidx >= $mydata(lvidx)} { |
|---|
| 100 | puts $mydata(channel) "[apache_time], $svc\[[pid]\], [level_str $level], $msg" |
|---|
| 101 | flush $mydata(channel) |
|---|
| 102 | } |
|---|
| 103 | } |
|---|
| 104 | } |
|---|