loggerUtils.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
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
00058 ::msgcat::mc
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
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
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
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
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
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
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
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
00543
00544
00545