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