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