loggerutils.tcl
来自「Linux下的MSN聊天程序源码」· TCL 代码 · 共 536 行
TCL
536 行
##Library Header## $Id: loggerUtils.tcl 5912 2006-01-23 11:45:49Z tjikkun $# Copyright (c) 2005 Cisco Systems, Inc.## Name:# ::logger::utils::## Purpose:# an extension to the tcllib logger module## Author:# Aamer Akhter / aakhter@cisco.com## Support Alias:# aakhter@cisco.com## Usage:# package require logger::utils## Description:# this extension adds template based appenders## Requirements:# package require logger## Variables:# namespace ::logger::utils::# id: CVS ID: keyword extraction# version: current version of package# packageDir: directory where package is located# log: instance log## Notes:# 1.## Keywords:### Category:### End of Headerpackage require Tcl 8.2package require loggerpackage require logger::appenderpackage require msgcatnamespace eval ::logger::utils { variable packageDir [file dirname [info script]] variable log [logger::init logger::utils] logger::import -force -namespace log logger::utils ::msgcat::mcload [file join $packageDir msgs]}##Internal Procedure Header# $Id: loggerUtils.tcl 5912 2006-01-23 11:45:49Z tjikkun $# Copyright (c) 2005 Cisco Systems, Inc.## Name:# ::logger::utils::createFormatCmd## Purpose:### Synopsis:# ::logger::utils::createFormatCmd <formatString>## Arguments:# <formatString># string composed of formatting chars (see description)### Return Values:# a runnable command## Description:# createFormatCmd translates <formatString> into an expandable# command string.## The following are the known substitutions (from log4perl):# %c category of the logging event# %C fully qualified name of logging event# %d current date in yyyy/MM/dd hh:mm:ss# %H hostname# %m message to be logged# %M method where logging event was issued# %p priority of logging event# %P pid of current process### Examples:# ::logger::new param1# ::logger::new param2# ::logger::new param3 <option1>### Sample Input:# (Optional) Sample of input to the proc provided by its argument values.## Sample Output:# (Optional) For procs that output to files, provide# sample of format of output produced.# Notes:# 1.## End of Procedure Headerproc ::logger::utils::createFormatCmd {text args} { variable log array set opt $args regsub -all -- \ {%P} \ $text \ [pid] \ text regsub -all -- \ {%H} \ $text \ [info hostname] \ text #the %d subst has to happen at the end regsub -all -- \ {%d} \ $text \ {[clock format [clock seconds] -format {%G/%m/%d %H:%M:%S}]} \ text if {[info exist opt(-category)]} { regsub -all -- \ {%c} \ $text \ $opt(-category) \ text regsub -all -- \ {%C} \ $text \ [lindex [split $opt(-category) :: ] 0] \ text } if {[info exist opt(-priority)]} { regsub -all -- \ {%p} \ $text \ $opt(-priority) \ text } return $text}##Procedure Header# $Id: loggerUtils.tcl 5912 2006-01-23 11:45:49Z tjikkun $# Copyright (c) 2005 Cisco Systems, Inc.## Name:# ::logger::utils::createLogProc## Purpose:### Synopsis:# ::logger::utils::createLogProc -procName <procName> [options]## Arguments:# -procName <procName># name of proc to create# -conversionPattern <pattern># see createFormatCmd for <pattern># -category <category># the category (service)# -priority <priority># the priority (level)### Return Values:# a runnable command## Description:# createFormatCmd translates <formatString> into an expandable# command string.## The following are the known substitutions (from log4perl):# %c category of the logging event# %C fully qualified name of logging event# %d current date in yyyy/MM/dd hh:mm:ss# %H hostname# %m message to be logged# %M method where logging event was issued# %p priority of logging event# %P pid of current process### Examples:### Sample Input:# (Optional) Sample of input to the proc provided by its argument values.## Sample Output:# (Optional) For procs that output to files, provide# sample of format of output produced.# Notes:# 1.## End of Procedure Headerproc ::logger::utils::createLogProc {args} { variable log array set opt $args set formatText "" set methodText "" if {[info exist opt(-conversionPattern)]} { set text $opt(-conversionPattern) regsub -all -- \ {%P} \ $text \ [pid] \ text regsub -all -- \ {%H} \ $text \ [info hostname] \ text if {[info exist opt(-category)]} { regsub -all -- \ {%c} \ $text \ $opt(-category) \ text regsub -all -- \ {%C} \ $text \ [lindex [split $opt(-category) :: ] 0] \ text } if {[info exist opt(-priority)]} { regsub -all -- \ {%p} \ $text \ $opt(-priority) \ text } if {[regexp {%M} $text]} { set methodText { if {[info level] < 2} { set method "global" } else { set method [lindex [info level -1] 0] } } regsub -all -- \ {%M} \ $text \ {$method} \ text } regsub -all -- \ {%m} \ $text \ {$text} \ text regsub -all -- \ {%d} \ $text \ {[clock format [clock seconds] -format {%G/%m/%d %H:%M:%S}]} \ text } set formatText $text set outputCommand puts set outputChannel stdout set procText { proc $opt(-procName) {text} { $methodText $outputCommand $outputChannel \"$formatText\" } } set procText [subst $procText] return $procText}##Procedure Header# $Id: loggerUtils.tcl 5912 2006-01-23 11:45:49Z tjikkun $# Copyright (c) 2005 Cisco Systems, Inc.## Name:# ::logger::utils::applyAppender## Purpose:### Synopsis:# ::logger::utils::applyAppender -appender <appenderType> [options]## Arguments:# -service <logger service names># -serviceCmd <logger serviceCmds># name of logger instance to modify# -serviceCmd takes as input the return of logger::init## -appender <appenderType># type of appender to use# console|colorConsole...## -conversionPattern <pattern># see createLogProc for format# if not provided the default pattern# is used:# {\[%d\] \[%c\] \[%M\] \[%p\] %m}## -levels <levels to apply to># list of levels to apply this appender to# by default all levels are applied to## Return Values:### Description:# applyAppender will create an appender for the specified# logger services. If not service is specified then the# appender will be added as the default appender for# the specified levels. If no levels are specified, then# all levels are assumed.## The following are the known substitutions (from log4perl):# %c category of the logging event# %C fully qualified name of logging event# %d current date in yyyy/MM/dd hh:mm:ss# %H hostname# %m message to be logged# %M method where logging event was issued# %p priority of logging event# %P pid of current process### Examples:# % set log [logger::init testLog]# ::logger::tree::testLog# % logger::utils::applyAppender -appender console -serviceCmd $log# % ${log}::error "this is error"# [2005/08/22 10:14:13] [testLog] [global] [error] this is error### End of Procedure Headerproc ::logger::utils::applyAppender {args} { set usage {logger::applyAppender -appender appender ?-instance? ?-levels levels? ?-appenderArgs appenderArgs? } set levels [logger::levels] set appenderArgs {} set bargs $args while {[llength $args] > 1} { set opt [lindex $args 0] set args [lrange $args 1 end] switch -exact -- $opt { -appender { set appender [lindex $args 0] set args [lrange $args 1 end] } -serviceCmd { set serviceCmd [lindex $args 0] set args [lrange $args 1 end] } -service { set serviceCmd [logger::servicecmd [lindex $args 0]] set args [lrange $args 1 end] } -levels { set levels [lindex $args 0] set args [lrange $args 1 end] } -appenderArgs { set appenderArgs [lindex $args 0] set args [lrange $args 1 end] } default { return -code error [msgcat::mc "Unknown argument: \"%s\" :\nUsage:\ %s" $opt $usage] } } } set appender ::logger::appender::${appender} if {[info commands $appender] == {}} { return -code error [msgcat::mc "could not find appender '%s'" $appender] } #if service is not specified make all future services with this appender # spec if {![info exist serviceCmd]} { set ::logger::utils::autoApplyAppenderArgs $bargs #add trace #check to see if trace is already set if {[lsearch [trace info execution logger::init] \ {leave ::logger::utils::autoApplyAppender} ] == -1} { trace add execution ::logger::init leave ::logger::utils::autoApplyAppender } return } #foreach service specified, apply the appender for each of the levels # specified foreach srvCmd $serviceCmd { foreach lvl $levels { set procText [$appender -appenderArgs $appenderArgs \ -level $lvl \ -service [${srvCmd}::servicename] \ -procNameVar procName ] eval $procText ${srvCmd}::logproc $lvl $procName } }}##Internal Procedure Header# $Id: loggerUtils.tcl 5912 2006-01-23 11:45:49Z tjikkun $# Copyright (c) 2005 Cisco Systems, Inc.## Name:# ::logger::utils::autoApplyAppender## Purpose:### Synopsis:# ::logger::utils::autoApplyAppender <command> <command-string> <log> <op> <args>## Arguments:# <command># <command-string># <log># servicecmd generated by logger:init# <op># <args>## Return Values:# <log>## Description:# autoApplyAppender is designed to be added via trace leave# to logger::init calls## autoApplyAppender will look at preconfigred state (via applyAppender)# to autocreate appenders for newly created logger instances## Examples:# logger::applyAppender -appender console# set log [logger::init applyAppender-3]# ${log}::error "this is error"### Sample Input:## Sample Output:## Notes:# 1.## End of Procedure Headerproc ::logger::utils::autoApplyAppender {command command-string log op args} { variable autoApplyAppenderArgs set bAppArgs $autoApplyAppenderArgs set levels [logger::levels] set appenderArgs {} while {[llength $bAppArgs] > 1} { set opt [lindex $bAppArgs 0] set bAppArgs [lrange $bAppArgs 1 end] switch -exact -- $opt { -appender { set appender [lindex $bAppArgs 0] set bAppArgs [lrange $bAppArgs 1 end] } -levels { set levels [lindex $bAppArgs 0] set bAppArgs [lrange $bAppArgs 1 end] } -appenderArgs { set appenderArgs [lindex $bAppArgs 0] set bAppArgs [lrange $bAppArgs 1 end] } default { return -code error [msgcat::mc "Unknown argument: \"%s\" :\nUsage:\ %s" $opt $usage] } } } if {![info exist appender]} { return -code error [msgcat::mc "need to specify -appender"] } applyAppender -appender $appender -serviceCmd $log -levels $levels return $log}package provide logger::utils 1.2# ;;; Local Variables: ***# ;;; mode: tcl ***# ;;; End: ***
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?