loggerUtils.tcl

Go to the documentation of this file.
00001 /* Library Header*/
00002 /* */
00003 /*  $Id: loggerUtils.tcl,v 1.6 2007/03/20 16:22:16 andreas_kupries Exp $*/
00004 /*  Copyright (c) 2005 Cisco Systems, Inc.*/
00005 /* */
00006 /*  Name:*/
00007 /*  ::logger::utils::*/
00008 /* */
00009 /*  Purpose:*/
00010 /*  an extension to the tcllib logger module*/
00011 /* */
00012 /*  Author:*/
00013 /*   Aamer Akhter / aakhter@cisco.com*/
00014 /* */
00015 /*  Support Alias:*/
00016 /*        aakhter@cisco.com*/
00017 /* */
00018 /*  Usage:*/
00019 /*  package require logger::utils*/
00020 /* */
00021 /*  Description:*/
00022 /*  this extension adds template based appenders*/
00023 /* */
00024 /*  Requirements:*/
00025 /*        package require logger*/
00026 /* */
00027 /*  Variables:*/
00028 /*        namespace   ::logger::utils::*/
00029 /*        id:         CVS ID: keyword extraction*/
00030 /*        version:    current version of package*/
00031 /*        packageDir: directory where package is located*/
00032 /*        log:        instance log*/
00033 /* */
00034 /*  Notes:*/
00035 /*        1.*/
00036 /* */
00037 /*  Keywords:*/
00038 /* */
00039 /* */
00040 /*  Category:*/
00041 /* */
00042 /* */
00043 /*  End of Header*/
00044 
00045 package require Tcl 8.4
00046 package require logger
00047 package require logger::appender
00048 package require msgcat
00049 
00050 namespace ::logger::utils {
00051 
00052     variable packageDir [file dirname [info script]]
00053     variable log        [logger::init logger::utils]
00054 
00055     logger::import -force -namespace log logger::utils
00056 
00057     /*  @mdgen OWNER: msgs/*.msg*/
00058     ::msgcat::mc
00059 }
00060 
00061 /* Internal Procedure Header*/
00062 /*  $Id: loggerUtils.tcl,v 1.6 2007/03/20 16:22:16 andreas_kupries Exp $*/
00063 /*  Copyright (c) 2005 Cisco Systems, Inc.*/
00064 /* */
00065 /*  Name:*/
00066 /*  ::logger::utils::createFormatCmd*/
00067 /* */
00068 /*  Purpose:*/
00069 /* */
00070 /* */
00071 /*  Synopsis:*/
00072 /*        ::logger::utils::createFormatCmd <formatString>*/
00073 /* */
00074 /*  Arguments:*/
00075 /*        <formatString>*/
00076 /*             string composed of formatting chars (see description)*/
00077 /* */
00078 /* */
00079 /*  Return Values:*/
00080 /*  a runnable command*/
00081 /* */
00082 /*  Description:*/
00083 /*        createFormatCmd translates <formatString> into an expandable*/
00084 /*        command string.*/
00085 /* */
00086 /*        The following are the known substitutions (from log4perl):*/
00087 /*             %c category of the logging event*/
00088 /*             %C fully qualified name of logging event*/
00089 /*             %d current date in yyyy/MM/dd hh:mm:ss*/
00090 /*             %H hostname*/
00091 /*             %m message to be logged*/
00092 /*             %M method where logging event was issued*/
00093 /*             %p priority of logging event*/
00094 /*             %P pid of current process*/
00095 /* */
00096 /* */
00097 /*  Examples:*/
00098 /*        ::logger::new param1*/
00099 /*        ::logger::new param2*/
00100 /*        ::logger::new param3 <option1>*/
00101 /* */
00102 /* */
00103 /*  Sample Input:*/
00104 /*  (Optional) Sample of input to the proc provided by its argument values.*/
00105 /* */
00106 /*  Sample Output:*/
00107 /*  (Optional) For procs that output to files, provide*/
00108 /*  sample of format of output produced.*/
00109 /*  Notes:*/
00110 /*  1.*/
00111 /* */
00112 /*  End of Procedure Header*/
00113 
00114 
00115 ret  ::logger::utils::createFormatCmd (type text , type args) {
00116     variable log
00117     array set opt $args
00118 
00119     regsub -all -- \
00120     {%P} \
00121     $text \
00122     [pid] \
00123     text
00124 
00125     regsub -all -- \
00126     {%H} \
00127     $text \
00128     [info hostname] \
00129     text
00130 
00131 
00132     #the %d subst has to happen at the end
00133     regsub -all -- \
00134     {%d} \
00135     $text \
00136     {[clock format [clock seconds] -format {%Y/%m/%d %H:%M:%S}]} \
00137     text
00138 
00139     if {[info exists opt(-category)]} {
00140     regsub -all -- \
00141         {%c} \
00142         $text \
00143         $opt(-category) \
00144         text
00145 
00146     regsub -all -- \
00147         {%C} \
00148         $text \
00149         [lindex [split $opt(-category) :: ] 0] \
00150         text
00151     }
00152 
00153     if {[info exists opt(-priority)]} {
00154     regsub -all -- \
00155         {%p} \
00156         $text \
00157         $opt(-priority) \
00158         text
00159     }
00160 
00161     return $text
00162 }
00163 
00164 
00165 
00166 /* Procedure Header*/
00167 /*  $Id: loggerUtils.tcl,v 1.6 2007/03/20 16:22:16 andreas_kupries Exp $*/
00168 /*  Copyright (c) 2005 Cisco Systems, Inc.*/
00169 /* */
00170 /*  Name:*/
00171 /*  ::logger::utils::createLogProc*/
00172 /* */
00173 /*  Purpose:*/
00174 /* */
00175 /* */
00176 /*  Synopsis:*/
00177 /*        ::logger::utils::createLogProc -procName <procName> [options]*/
00178 /* */
00179 /*  Arguments:*/
00180 /*        -procName <procName>*/
00181 /*             name of proc to create*/
00182 /*        -conversionPattern <pattern>*/
00183 /*             see createFormatCmd for <pattern>*/
00184 /*        -category <category>*/
00185 /*             the category (service)*/
00186 /*        -priority <priority>*/
00187 /*             the priority (level)*/
00188 /*        -outputChannel <channel>*/
00189 /*             channel to output on (default stdout)*/
00190 /* */
00191 /* */
00192 /*  Return Values:*/
00193 /*  a runnable command*/
00194 /* */
00195 /*  Description:*/
00196 /*        createFormatCmd translates <formatString> into an expandable*/
00197 /*        command string.*/
00198 /* */
00199 /*        The following are the known substitutions (from log4perl):*/
00200 /*             %c category of the logging event*/
00201 /*             %C fully qualified name of logging event*/
00202 /*             %d current date in yyyy/MM/dd hh:mm:ss*/
00203 /*             %H hostname*/
00204 /*             %m message to be logged*/
00205 /*             %M method where logging event was issued*/
00206 /*             %p priority of logging event*/
00207 /*             %P pid of current process*/
00208 /* */
00209 /* */
00210 /*  Examples:*/
00211 /* */
00212 /* */
00213 /*  Sample Input:*/
00214 /*  (Optional) Sample of input to the proc provided by its argument values.*/
00215 /* */
00216 /*  Sample Output:*/
00217 /*  (Optional) For procs that output to files, provide*/
00218 /*  sample of format of output produced.*/
00219 /*  Notes:*/
00220 /*  1.*/
00221 /* */
00222 /*  End of Procedure Header*/
00223 
00224 
00225 ret  ::logger::utils::createLogProc (type args) {
00226     variable log
00227     array set opt $args
00228 
00229     set formatText ""
00230     set methodText ""
00231     if {[info exists opt(-conversionPattern)]} {
00232     set text $opt(-conversionPattern)
00233 
00234     regsub -all -- \
00235         {%P} \
00236         $text \
00237         [pid] \
00238         text
00239 
00240     regsub -all -- \
00241         {%H} \
00242         $text \
00243         [info hostname] \
00244         text
00245 
00246     if {[info exists opt(-category)]} {
00247         regsub -all -- \
00248         {%c} \
00249         $text \
00250         $opt(-category) \
00251         text
00252 
00253         regsub -all -- \
00254         {%C} \
00255         $text \
00256         [lindex [split $opt(-category) :: ] 0] \
00257         text
00258     }
00259 
00260     if {[info exists opt(-priority)]} {
00261         regsub -all -- \
00262         {%p} \
00263         $text \
00264         $opt(-priority) \
00265         text
00266     }
00267 
00268 
00269     if {[regexp {%M} $text]} {
00270         set methodText {
00271         if {[info level] < 2} {
00272             set method "global"
00273         } else {
00274             set method [lindex [info level -1] 0]
00275         }
00276 
00277         }
00278 
00279         regsub -all -- \
00280         {%M} \
00281         $text \
00282         {$method} \
00283         text
00284     }
00285 
00286     regsub -all -- \
00287         {%m} \
00288         $text \
00289         {$text} \
00290         text
00291 
00292     regsub -all -- \
00293         {%d} \
00294         $text \
00295         {[clock format [clock seconds] -format {%Y/%m/%d %H:%M:%S}]} \
00296         text
00297 
00298     }
00299 
00300     if {[info exists opt(-outputChannel)]} {
00301     set outputChannel $opt(-outputChannel)
00302     } else {
00303     set outputChannel stdout
00304     }
00305 
00306     set formatText $text
00307     set outputCommand puts
00308 
00309     set procText {
00310     proc $opt(-procName) {text} {
00311         $methodText
00312         $outputCommand $outputChannel \"$formatText\"
00313     }
00314     }
00315 
00316     set procText [subst $procText]
00317     return $procText
00318 }
00319 
00320 
00321 /* Procedure Header*/
00322 /*  $Id: loggerUtils.tcl,v 1.6 2007/03/20 16:22:16 andreas_kupries Exp $*/
00323 /*  Copyright (c) 2005 Cisco Systems, Inc.*/
00324 /* */
00325 /*  Name:*/
00326 /*  ::logger::utils::applyAppender*/
00327 /* */
00328 /*  Purpose:*/
00329 /* */
00330 /* */
00331 /*  Synopsis:*/
00332 /*        ::logger::utils::applyAppender -appender <appenderType> [options]*/
00333 /* */
00334 /*  Arguments:*/
00335 /*        -service <logger service names>*/
00336 /*        -serviceCmd <logger serviceCmds>*/
00337 /*             name of logger instance to modify*/
00338 /*             -serviceCmd takes as input the return of logger::init*/
00339 /* */
00340 /*        -appender <appenderType>*/
00341 /*             type of appender to use*/
00342 /*              console|colorConsole...*/
00343 /* */
00344 /*        -conversionPattern <pattern>*/
00345 /*             see createLogProc for format*/
00346 /*             if not provided the default pattern*/
00347 /*             is used:*/
00348 /*              {\[%d\] \[%c\] \[%M\] \[%p\] %m}*/
00349 /* */
00350 /*        -levels <levels to apply to>*/
00351 /*             list of levels to apply this appender to*/
00352 /*             by default all levels are applied to*/
00353 /* */
00354 /*  Return Values:*/
00355 /* */
00356 /* */
00357 /*  Description:*/
00358 /*        applyAppender will create an appender for the specified*/
00359 /*        logger services. If not service is specified then the*/
00360 /*        appender will be added as the default appender for*/
00361 /*        the specified levels. If no levels are specified, then*/
00362 /*        all levels are assumed.*/
00363 /* */
00364 /*        The following are the known substitutions (from log4perl):*/
00365 /*             %c category of the logging event*/
00366 /*             %C fully qualified name of logging event*/
00367 /*             %d current date in yyyy/MM/dd hh:mm:ss*/
00368 /*             %H hostname*/
00369 /*             %m message to be logged*/
00370 /*             %M method where logging event was issued*/
00371 /*             %p priority of logging event*/
00372 /*             %P pid of current process*/
00373 /* */
00374 /* */
00375 /*  Examples:*/
00376 /*         % set log [logger::init testLog]*/
00377 /*         ::logger::tree::testLog*/
00378 /*         % logger::utils::applyAppender -appender console -serviceCmd $log*/
00379 /*         % ${log}::error "this is error"*/
00380 /*         [2005/08/22 10:14:13] [testLog] [global] [error] this is error*/
00381 /* */
00382 /* */
00383 /*  End of Procedure Header*/
00384 
00385 
00386 ret  ::logger::utils::applyAppender (type args) {
00387     set usage {logger::utils::applyAppender
00388     -appender appender
00389     ?-instance?
00390     ?-levels levels?
00391     ?-appenderArgs appenderArgs?
00392     }
00393     set levels [logger::levels]
00394     set appenderArgs {}
00395     set bargs $args
00396     while {[llength $args] > 1} {
00397         set opt [lindex $args 0]
00398         set args [lrange $args 1 end]
00399         switch  -exact -- $opt {
00400             -appender { set appender [lindex $args 0]
00401         set args [lrange $args 1 end]
00402         }
00403         -serviceCmd { set serviceCmd [lindex $args 0]
00404         set args [lrange $args 1 end]
00405         }
00406         -service { set serviceCmd [logger::servicecmd [lindex $args 0]]
00407         set args [lrange $args 1 end]
00408         }
00409             -levels { set levels [lindex $args 0]
00410         set args [lrange $args 1 end]
00411         }
00412         -appenderArgs {
00413         set appenderArgs [lindex $args 0]
00414         set args [lrange $args 1 end]
00415         }
00416             default {
00417                 return -code error [msgcat::mc "Unknown argument: \"%s\" :\nUsage:\
00418                 %s" $opt $usage]
00419             }
00420         }
00421     }
00422 
00423     set appender ::logger::appender::${appender}
00424     if {[info commands $appender] == {}} {
00425     return -code error [msgcat::mc "could not find appender '%s'" $appender]
00426     }
00427 
00428     #if service is not specified make all future services with this appender
00429     # spec
00430     if {![info exists serviceCmd]} {
00431     set ::logger::utils::autoApplyAppenderArgs $bargs
00432     #add trace
00433     #check to see if trace is already set
00434     if {[lsearch [trace info execution logger::init] \
00435          {leave ::logger::utils::autoApplyAppender} ] == -1} {
00436         trace add execution ::logger::init leave ::logger::utils::autoApplyAppender
00437     }
00438     return
00439     }
00440 
00441 
00442     #foreach service specified, apply the appender for each of the levels
00443     # specified
00444     foreach srvCmd $serviceCmd {
00445 
00446     foreach lvl $levels {
00447         set procText [$appender -appenderArgs $appenderArgs \
00448                   -level $lvl \
00449                   -service [${srvCmd}::servicename] \
00450                   -procNameVar procName
00451              ]
00452         eval $procText
00453         ${srvCmd}::logproc $lvl $procName
00454     }
00455     }
00456 }
00457 
00458 
00459 /* Internal Procedure Header*/
00460 /*  $Id: loggerUtils.tcl,v 1.6 2007/03/20 16:22:16 andreas_kupries Exp $*/
00461 /*  Copyright (c) 2005 Cisco Systems, Inc.*/
00462 /* */
00463 /*  Name:*/
00464 /*  ::logger::utils::autoApplyAppender*/
00465 /* */
00466 /*  Purpose:*/
00467 /* */
00468 /* */
00469 /*  Synopsis:*/
00470 /*        ::logger::utils::autoApplyAppender <command> <command-string> <log> <op> <args>*/
00471 /* */
00472 /*  Arguments:*/
00473 /*        <command>*/
00474 /*        <command-string>*/
00475 /*        <log>*/
00476 /*             servicecmd generated by logger:init*/
00477 /*        <op>*/
00478 /*        <args>*/
00479 /* */
00480 /*  Return Values:*/
00481 /*  <log>*/
00482 /* */
00483 /*  Description:*/
00484 /*        autoApplyAppender is designed to be added via trace leave*/
00485 /*        to logger::init calls*/
00486 /* */
00487 /*        autoApplyAppender will look at preconfigred state (via applyAppender)*/
00488 /*        to autocreate appenders for newly created logger instances*/
00489 /* */
00490 /*  Examples:*/
00491 /*  logger::utils::applyAppender -appender console*/
00492 /*  set log [logger::init applyAppender-3]*/
00493 /*  ${log}::error "this is error"*/
00494 /* */
00495 /* */
00496 /*  Sample Input:*/
00497 /* */
00498 /*  Sample Output:*/
00499 /* */
00500 /*  Notes:*/
00501 /*  1.*/
00502 /* */
00503 /*  End of Procedure Header*/
00504 
00505 
00506 ret  ::logger::utils::autoApplyAppender (type command , type command-, type string , type log , type op , type args) {
00507     variable autoApplyAppenderArgs
00508     set bAppArgs $autoApplyAppenderArgs
00509     set levels [logger::levels]
00510     set appenderArgs {}
00511     while {[llength $bAppArgs] > 1} {
00512         set opt [lindex $bAppArgs 0]
00513         set bAppArgs [lrange $bAppArgs 1 end]
00514         switch  -exact -- $opt {
00515             -appender { set appender [lindex $bAppArgs 0]
00516         set bAppArgs [lrange $bAppArgs 1 end]
00517         }
00518             -levels { set levels [lindex $bAppArgs 0]
00519         set bAppArgs [lrange $bAppArgs 1 end]
00520         }
00521         -appenderArgs {
00522         set appenderArgs [lindex $bAppArgs 0]
00523         set bAppArgs [lrange $bAppArgs 1 end]
00524         }
00525             default {
00526                 return -code error [msgcat::mc "Unknown argument: \"%s\" :\nUsage:\
00527                 %s" $opt $usage]
00528             }
00529         }
00530     }
00531     if {![info exists appender]} {
00532     return -code error [msgcat::mc "need to specify -appender"]
00533     }
00534     logger::utils::applyAppender -appender $appender -serviceCmd $log \
00535     -levels $levels -appenderArgs $appenderArgs
00536     return $log
00537 }
00538 
00539 
00540 package provide logger::utils 1.3
00541 
00542 /*  ;;; Local Variables: ****/
00543 /*  ;;; mode: tcl ****/
00544 /*  ;;; End: ****/
00545 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1