logtotext.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 package require Tcl 8.4
00010 package require Tk
00011 package require logger
00012
00013 config = (elide,time) 0
00014 config = (elide,level) 0
00015 foreach level [logger::levels] {
00016 config = (elide,$level) 0
00017 }
00018
00019 logmessage = "A little log message"
00020
00021
00022
00023
00024 ret createLogger () {
00025 global mylogger
00026 set mylogger [logger::init global]
00027
00028 # loggers logproc takes just one arg, so curry
00029 # our proc with the loglevel and use an alias
00030 foreach level [logger::levels] {
00031 interp alias {} insertLogLine_$level {} insertLogLine $level
00032 ${mylogger}::logproc $level insertLogLine_$level
00033 }
00034 }
00035
00036
00037 ret sendMessageToLog (type level) {
00038 ${::mylogger}::$level $::logmessage
00039 }
00040
00041 ret createGUI () {
00042 global mylogger
00043 global logwidget
00044
00045 wm title . "Logger example - log to text widget"
00046
00047 # a little compose window for entering messages
00048 labelframe .compose -text "Compose log message"
00049 entry .compose.logmessage -textvariable logmessage
00050 frame .compose.levels
00051 foreach level [logger::levels] {
00052 set p .compose.levels.$level
00053 button $p -command [list sendMessageToLog $level] -text "Log as $level"
00054 lappend buttons $p
00055 }
00056 eval grid $buttons -sticky ew -padx 2 -pady 5
00057 grid .compose.logmessage -sticky ew
00058 grid .compose.levels -sticky ew
00059 grid .compose -sticky ew
00060
00061 # The output window
00062 labelframe .log -text "Log output"
00063 text .log.text -yscrollcommand [list .log.yscroll set] -wrap none
00064 set logwidget .log.text
00065 scrollbar .log.yscroll -orient vertical -command [list $logwidget yview]
00066 frame .log.buttons
00067 frame .log.buttons.elide
00068 checkbutton .log.buttons.elide.toggletime -text "Display Timestamp" -command [list toggleElide time] \
00069 -onvalue 0 -offvalue 1 -variable config(elide,time)
00070 checkbutton .log.buttons.elide.togglelevel -text "Display Level" -command [list toggleElide level] \
00071 -onvalue 0 -offvalue 1 -variable config(elide,level)
00072 frame .log.buttons.elidelevels
00073 foreach level [logger::levels] {
00074 set b .log.buttons.elidelevels.$level
00075 checkbutton $b -text "Display $level" -command [list toggleElide $level] -variable config(elide,$level) \
00076 -onvalue 0 -offvalue 1
00077 lappend elides $b
00078 }
00079 eval grid $elides
00080 grid .log.text .log.yscroll -sticky nsew
00081 grid configure .log.yscroll -sticky nws
00082 grid .log.buttons.elide.toggletime .log.buttons.elide.togglelevel
00083 grid .log.buttons.elide -sticky ew
00084 grid .log.buttons.elidelevels -sticky ew
00085 grid .log.buttons -columnspan 2 -sticky ew
00086 grid .log -sticky news
00087 grid columnconfigure . 0 -weight 1
00088 grid rowconfigure . 0 -weight 0
00089 grid rowconfigure . 1 -weight 1
00090 grid columnconfigure .log 0 -weight 1
00091 grid columnconfigure .log 1 -weight 0
00092 grid rowconfigure .log 0 -weight 1
00093
00094 #
00095 # Now we create some fonts
00096 # a fixed font for the first two columns, so they stay nicely lined up
00097 # a proportional font for the message as it is probably better to read
00098 #
00099 font create logger::timefont -family {Courier} -size 12
00100 font create logger::levelfont -family {Courier} -size 12
00101 font create logger::msgfont -family {Times} -size 12
00102 $logwidget tag configure logger::time -font logger::timefont
00103 $logwidget tag configure logger::level -font logger::levelfont
00104 $logwidget tag configure logger::message -font logger::msgfont
00105
00106 # Now we create some colors for the levels, so our messages appear in different colors
00107 foreach level [logger::levels] color {darkgrey lightgrey brown blue orange red} {
00108 $logwidget tag configure logger::$level -background $color
00109 }
00110
00111 # Disable the widget, so it is read only
00112 $logwidget configure -state disabled
00113
00114 }
00115
00116
00117
00118
00119
00120
00121 ret toggleElide (type type) {
00122 global config
00123 $::logwidget tag configure logger::$type -elide $config(elide,$type)
00124 return
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 ret insertLogLine (type level , type txt) {
00136 global logwidget
00137
00138 $logwidget configure -state normal
00139 $logwidget insert end "<[clock format [clock seconds] -format "%H:%M:%S"]> " [list logger::time logger::$level] \
00140 [format "%10.10s : " <$level>] [list logger::level logger::$level] \
00141 $txt\n [list logger::message logger::$level]
00142 $logwidget configure -state disabled
00143 }
00144
00145 ret every (type time , type body) {
00146 after $time [info level 0]
00147 uplevel #0 $body
00148 }
00149
00150 ret main () {
00151 createLogger
00152 createGUI
00153 }
00154
00155 main
00156
00157
00158 every 10000 {${mylogger}::info "The current time is [clock format [clock seconds] -format "%H:%M:%S"]"}