logtotext.tcl

Go to the documentation of this file.
00001 /* !/usr/bin/env tclsh*/
00002 /*  */
00003 /*  Logger example - How to log to a text widget*/
00004 /* */
00005 /*  (c) 2005 Michael Schlenker <mic42@users.sourceforge.net>*/
00006 /* */
00007 /*  $Id: logtotext.tcl,v 1.2 2005/06/01 03:09:49 andreas_kupries Exp $*/
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 /*  Create a simple logger with the servicename 'global'*/
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 /*  Put the logmessage to the logger system*/
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 /*  Allow toggling of display*/
00117 /*  */
00118 /*  only time and level are used in this example, but you could*/
00119 /*  elide specific messages levels too*/
00120 /* */
00121 ret  toggleElide (type type) {
00122     global config
00123     $::logwidget tag configure logger::$type -elide $config(elide,$type)
00124     return
00125 }
00126 
00127 /*  A rather basic insert*/
00128 /* */
00129 /*  I a long running application we would probably add some code to only keep*/
00130 /*  a specific number of log messages in the text widget, and throw away some older*/
00131 /*  ones. (basic stuff, just count lines and for example add a */
00132 /*  $logwidget delete 1.0 2.0*/
00133 /*  if the log grows too long, needs refinement if you have multi line log messages )*/
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 /*  Add some repeating message */
00158 every 10000 {${mylogger}::info "The current time is [clock format [clock seconds] -format "%H:%M:%S"]"} 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1