1##Library Header 2# 3# Copyright (c) 2005 Cisco Systems, Inc. 4# 5# Name: 6# ::logger::appender 7# 8# Purpose: 9# collection of appenders for tcllib logger 10# 11# Author: 12# Aamer Akhter / aakhter@cisco.com 13# 14# Support Alias: 15# aakhter@cisco.com 16# 17# Usage: 18# package require logger::appender 19# 20# Description: 21# set of logger templates 22# 23# Requirements: 24# package require logger 25# package require md5 26# 27# Variables: 28# namespace ::loggerExtension:: 29# id: CVS ID: keyword extraction 30# version: current version of package 31# packageDir: directory where package is located 32# log: instance log 33# 34# Notes: 35# 1. 36# 37# Keywords: 38# 39# 40# Category: 41# 42# 43# End of Header 44 45package require md5 46 47namespace eval ::logger::appender { 48 variable fgcolor 49 array set fgcolor { 50 red {31m} 51 red-bold {1;31m} 52 black {m} 53 blue {1m} 54 green {32m} 55 yellow {33m} 56 cyan {36m} 57 } 58 59 variable levelToColor 60 array set levelToColor { 61 debug cyan 62 info blue 63 notice black 64 warn red 65 error red 66 critical red-bold 67 alert red-bold 68 emergency red-bold 69 } 70} 71 72 73 74##Procedure Header 75# Copyright (c) 2005 Cisco Systems, Inc. 76# 77# Name: 78# ::logger::appender::console 79# 80# Purpose: 81# 82# 83# Synopsis: 84# ::logger::appender::console -level <level> -service <service> [options] 85# 86# Arguments: 87# -level <level> 88# name of level to fill in as 'priority' in log proc 89# -service <service> 90# name of service to fill in as 'category' in log proc 91# -appenderArgs <appenderArgs> 92# any additional args in list form 93# -conversionPattern <conversionPattern> 94# log pattern to use (see genLogProc) 95# -procName <procName> 96# explicitly set the proc name 97# -procNameVar <procNameVar> 98# name of variable to set in the calling context 99# variable has name of proc 100# 101# 102# Return Values: 103# a runnable command 104# 105# Description: 106# 107# 108# Examples: 109# 110# 111# Notes: 112# 1. 113# 114# End of Procedure Header 115 116 117proc ::logger::appender::console {args} { 118 set usage {console 119 ?-level level? 120 ?-service service? 121 ?-appenderArgs appenderArgs? 122 } 123 set bargs $args 124 set conversionPattern {\[%d\] \[%c\] \[%M\] \[%p\] %m} 125 while {[llength $args] > 1} { 126 set opt [lindex $args 0] 127 set args [lrange $args 1 end] 128 switch -exact -- $opt { 129 -level { set level [lindex $args 0] 130 set args [lrange $args 1 end] 131 } 132 -service { set service [lindex $args 0] 133 set args [lrange $args 1 end] 134 } 135 -appenderArgs { 136 set appenderArgs [lindex $args 0] 137 set args [lrange $args 1 end] 138 set args [concat $args $appenderArgs] 139 } 140 -conversionPattern { 141 set conversionPattern [lindex $args 0] 142 set args [lrange $args 1 end] 143 } 144 -procName { 145 set procName [lindex $args 0] 146 set args [lrange $args 1 end] 147 } 148 -procNameVar { 149 set procNameVar [lindex $args 0] 150 set args [lrange $args 1 end] 151 } 152 default { 153 return -code error [msgcat::mc "Unknown argument: \"%s\" :\nUsage:\ 154 %s" $opt $usage] 155 } 156 } 157 } 158 if {![info exists procName]} { 159 set procName [genProcName $bargs] 160 } 161 if {[info exists procNameVar]} { 162 upvar $procNameVar myProcNameVar 163 } 164 set procText \ 165 [ ::logger::utils::createLogProc \ 166 -procName $procName \ 167 -conversionPattern $conversionPattern \ 168 -category $service \ 169 -priority $level ] 170 set myProcNameVar $procName 171 return $procText 172} 173 174 175 176##Procedure Header 177# Copyright (c) 2005 Cisco Systems, Inc. 178# 179# Name: 180# ::logger::appender::colorConsole 181# 182# Purpose: 183# 184# 185# Synopsis: 186# ::logger::appender::console -level <level> -service <service> [options] 187# 188# Arguments: 189# -level <level> 190# name of level to fill in as 'priority' in log proc 191# -service <service> 192# name of service to fill in as 'category' in log proc 193# -appenderArgs <appenderArgs> 194# any additional args in list form 195# -conversionPattern <conversionPattern> 196# log pattern to use (see genLogProc) 197# -procName <procName> 198# explicitly set the proc name 199# -procNameVar <procNameVar> 200# name of variable to set in the calling context 201# variable has name of proc 202# 203# 204# Return Values: 205# a runnable command 206# 207# Description: 208# provides colorized logs 209# 210# Examples: 211# 212# 213# Notes: 214# 1. 215# 216# End of Procedure Header 217 218 219proc ::logger::appender::colorConsole {args} { 220 variable fgcolor 221 set usage {console 222 ?-level level? 223 ?-service service? 224 ?-appenderArgs appenderArgs? 225 } 226 set bargs $args 227 set conversionPattern {\[%d\] \[%c\] \[%M\] \[%p\] %m} 228 upvar 0 ::logger::appender::levelToColor colorMap 229 while {[llength $args] > 1} { 230 set opt [lindex $args 0] 231 set args [lrange $args 1 end] 232 switch -exact -- $opt { 233 -level { set level [lindex $args 0] 234 set args [lrange $args 1 end] 235 } 236 -service { set service [lindex $args 0] 237 set args [lrange $args 1 end] 238 } 239 -appenderArgs { 240 set appenderArgs [lindex $args 0] 241 set args [lrange $args 1 end] 242 set args [concat $args $appenderArgs] 243 } 244 -conversionPattern { 245 set conversionPattern [lindex $args 0] 246 set args [lrange $args 1 end] 247 } 248 -procName { 249 set procName [lindex $args 0] 250 set args [lrange $args 1 end] 251 } 252 -procNameVar { 253 set procNameVar [lindex $args 0] 254 set args [lrange $args 1 end] 255 } 256 default { 257 return -code error [msgcat::mc "Unknown argument: \"%s\" :\nUsage:\ 258 %s" $opt $usage] 259 } 260 } 261 } 262 if {![info exists procName]} { 263 set procName [genProcName $bargs] 264 } 265 upvar $procNameVar myProcNameVar 266 if {[info exists level]} { 267 #apply color 268 set colorCode $colorMap($level) 269 append newCPattern {\033\[} $fgcolor($colorCode) $conversionPattern {\033\[0m} 270 set conversionPattern $newCPattern 271 } 272 set procText \ 273 [ ::logger::utils::createLogProc \ 274 -procName $procName \ 275 -conversionPattern $conversionPattern \ 276 -category $service \ 277 -priority $level ] 278 set myProcNameVar $procName 279 return $procText 280} 281 282##Procedure Header 283# Copyright (c) 2005 Cisco Systems, Inc. 284# 285# Name: 286# ::logger::appender::fileAppend 287# 288# Purpose: 289# 290# 291# Synopsis: 292# ::logger::appender::fileAppend -level <level> -service <service> -outputChannel <channel> [options] 293# 294# Arguments: 295# -level <level> 296# name of level to fill in as 'priority' in log proc 297# -service <service> 298# name of service to fill in as 'category' in log proc 299# -appenderArgs <appenderArgs> 300# any additional args in list form 301# -conversionPattern <conversionPattern> 302# log pattern to use (see genLogProc) 303# -procName <procName> 304# explicitly set the proc name 305# -procNameVar <procNameVar> 306# name of variable to set in the calling context 307# variable has name of proc 308# -outputChannel <channel> 309# name of output channel (eg stdout, file handle) 310# 311# 312# Return Values: 313# a runnable command 314# 315# Description: 316# 317# 318# Examples: 319# 320# 321# Notes: 322# 1. 323# 324# End of Procedure Header 325 326 327proc ::logger::appender::fileAppend {args} { 328 set usage {console 329 ?-level level? 330 ?-service service? 331 ?-outputChannel channel? 332 ?-appenderArgs appenderArgs? 333 } 334 set bargs $args 335 set conversionPattern {\[%d\] \[%c\] \[%M\] \[%p\] %m} 336 while {[llength $args] > 1} { 337 set opt [lindex $args 0] 338 set args [lrange $args 1 end] 339 switch -exact -- $opt { 340 -level { set level [lindex $args 0] 341 set args [lrange $args 1 end] 342 } 343 -service { set service [lindex $args 0] 344 set args [lrange $args 1 end] 345 } 346 -appenderArgs { 347 set appenderArgs [lindex $args 0] 348 set args [lrange $args 1 end] 349 set args [concat $args $appenderArgs] 350 } 351 -conversionPattern { 352 set conversionPattern [lindex $args 0] 353 set args [lrange $args 1 end] 354 } 355 -procName { 356 set procName [lindex $args 0] 357 set args [lrange $args 1 end] 358 } 359 -procNameVar { 360 set procNameVar [lindex $args 0] 361 set args [lrange $args 1 end] 362 } 363 -outputChannel { 364 set outputChannel [lindex $args 0] 365 set args [lrange $args 1 end] 366 } 367 default { 368 return -code error [msgcat::mc "Unknown argument: \"%s\" :\nUsage:\ 369 %s" $opt $usage] 370 } 371 } 372 } 373 if {![info exists procName]} { 374 set procName [genProcName $bargs] 375 } 376 if {[info exists procNameVar]} { 377 upvar $procNameVar myProcNameVar 378 } 379 set procText \ 380 [ ::logger::utils::createLogProc \ 381 -procName $procName \ 382 -conversionPattern $conversionPattern \ 383 -category $service \ 384 -outputChannel $outputChannel \ 385 -priority $level ] 386 set myProcNameVar $procName 387 return $procText 388} 389 390 391 392 393##Internal Procedure Header 394# Copyright (c) 2005 Cisco Systems, Inc. 395# 396# Name: 397# ::logger::appender::genProcName 398# 399# Purpose: 400# 401# 402# Synopsis: 403# ::logger::appender::genProcName <args> 404# 405# Arguments: 406# <formatString> 407# string composed of formatting chars (see description) 408# 409# 410# Return Values: 411# a runnable command 412# 413# Description: 414# 415# 416# Examples: 417# ::loggerExtension::new param1 418# ::loggerExtension::new param2 419# ::loggerExtension::new param3 <option1> 420# 421# 422# Sample Input: 423# (Optional) Sample of input to the proc provided by its argument values. 424# 425# Sample Output: 426# (Optional) For procs that output to files, provide 427# sample of format of output produced. 428# Notes: 429# 1. 430# 431# End of Procedure Header 432 433 434proc ::logger::appender::genProcName {args} { 435 set name [md5::md5 -hex $args] 436 return "::logger::appender::logProc-$name" 437} 438 439 440package provide logger::appender 1.3 441 442# ;;; Local Variables: *** 443# ;;; mode: tcl *** 444# ;;; End: *** 445