Posted to tcl by colin at Tue Aug 28 23:06:17 GMT 2012view pretty

# syslog using Udp extension
# Colin McCormack

lappend auto_path [pwd]/Udp
package require Udp
package require TclOO
package provide Syslog 1.0

oo::class create Syslog {
    method timestamp {time} {
        # return a timestamp of $time
        if {![string is integer -strict $time]} {
            set time [clock scan $time -timezone :UTC]
        }
        return [clock format $time -format "%Y-%m-%dT%H:%M:%SZ"]
    }

    method log {message args} {
        variable template
        set props [dict merge $template $args]
        foreach {p script} {
            timestamp {clock seconds}
        } {
            if {![dict exists $props $p]} {
                dict set props $p [eval $script]
            }
        }

        dict with props {
            set timestamp [my timestamp $timestamp]
            if {![string is integer -strict $facility]} {
                variable facilities
                set facility [dict get $facilities $facility]
            }
            if {![string is integer -strict $priority]} {
                variable priorities
                set priority [dict get $priorities $priority]
            }
            set PRI [expr {($facility * 8) + $priority}]
            set line "<$PRI>1 $timestamp $hostname $appname $procid $msgid - $message"
            #puts stderr $line
        }
        variable syslog; variable server; variable port
        ::udp send $syslog $server $port $line
    }

    destructor {
        variable syslog
        catch {chan close $syslog}
    }

    constructor {args} {
        variable facility user
        variable priority debug
        variable hostname [info host]
        variable procid [pid]
        variable appname $::argv0
        variable msgid -
        variable template {}

        variable port 514	;# syslog's port

        variable {*}$args

        if {![info exists server]} {
            error "must specify Syslog server"
        }

        variable syslog [::udp create]

        foreach v {hostname procid appname msgid facility priority} {
            if {![dict exists $template $v]} {
                dict set template $v [set $v]
            }
        }

        variable facilities
        set i 0
        foreach f {
            kern user mail daemon auth syslog
            lrp news uucp cron authpriv ftp ntp audit alert clock
            local0 local1 local2 local3 local4 local5 local6 local7
        } {
            dict set facilities $f $i
            dict set facilities $i $f
            incr i
        }

        variable priorities
        set i 0
        foreach f {emergency alert critical error warning notice info debug} {
            dict set priorities $f $i
            dict set priorities $i $f
            incr i
        }
    }
}

if {[info exists argv0] && ($argv0 eq [info script])} {
    Syslog create syslog server box
    syslog log "This is a test"
}