File: xotcl-logger.tcl

package info (click to toggle)
tcllib 1.20%2Bdfsg-1
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 68,064 kB
  • sloc: tcl: 216,842; ansic: 14,250; sh: 2,846; xml: 1,766; yacc: 1,145; pascal: 881; makefile: 107; perl: 84; f90: 84; python: 33; ruby: 13; php: 11
file content (140 lines) | stat: -rwxr-xr-x 3,759 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
################################################################################
#     Logger Utilities - XOTcl wrapper for logger
#     
#     A XOTcl class to wrap logger
#     
#     (c) 2005 Michael Schlenker <mic42@users.sourceforge.net>
#
#         with enhancements by Gustaf Neumann, to be more idiomatic xotcl
#
#     $Id: xotcl-logger.tcl,v 1.3 2008/05/29 19:16:03 mic42 Exp $
#
#################################################################################

package require XOTcl 1.6
package require logger

namespace eval ::logger::xotcl {
 namespace import ::xotcl::*

 ::xotcl::Class create Logger -slots {
   #
   # Define Attributes of the Logger
   #
   # Attribute servicename
   #
   Attribute loggertoken -default ""

   #
   # Attribute servicename
   #
   # When the attribute is set, perform some optional cleanup
   # and the either create a new logger service or attach to
   # an existing one
   #
   Attribute servicename \
       -default {[namespace tail [self]]} \
       -proc assign {domain var value} {
         $domain instvar loggertoken servicename loglevel

         if {$loggertoken ne ""} {
           ${loggertoken}::delete
           set loggertoken ""
         } 

         if {$value ne ""} {
           #
           # If a logging service with this name exists already,
           # attach the logger to it. Otherwise create a service
           # with the specified name
           #
           if {[lsearch -exact [logger::services] $value] == -1} {
             set loggertoken [logger::init $value]
             set servicename $value
           } else {
             set loggertoken [logger::servicecmd $value]
             set servicename $value
           }

           if {[info exists loglevel]} {
             ${loggertoken}::setlevel $loglevel
           }

         }
         return $value
       }

   #
   # Attribute loglevel
   #
   # When the attribute is set, forward the change to the logger command
   # setlevel. For the getter, use the logger command currentloglevel.
   #
   Attribute loglevel \
       -proc assign {domain var value} {
         $domain instvar loggertoken
         if {$loggertoken ne ""} {
           ${loggertoken}::setlevel $value
         }
       } \
       -proc get {domain var} {
         $domain instvar loggertoken
         if {$loggertoken ne ""} {
           return [${loggertoken}::currentloglevel]
         }
       }
 }

 Logger instproc destroy {args} {
   if {[my loggertoken] ne ""} {
     [my loggertoken]::delete
   }
   next
 }

 #
 # provide a few methods to delegate methods to the logger
 # identified by the loggertoken
 #
 Logger instproc loggercmd {subcmd} {
   return [my loggertoken]::$subcmd
 }
 Logger instforward services {%my loggercmd services}
 Logger instforward delproc  {%my loggercmd delproc}
 Logger instforward logproc  {%my loggercmd logproc}

 #
 # since for the log method, the argument has to be foldeded
 # into the command name, we use the plain tcl approach to
 # construct and evaluate the command
 #
 Logger instproc log {level args} {
   eval [linsert $args 0 [my loggertoken]::${level}]   
 }

}

# Usage cases:
#
# 1) Create a logger named 'mylog', which creates 
#    a logging service with the same name
#
#       logger::xotcl::Logger mylog
#       mylog log info "hi there"
#
# 2) Create a logger named 'l1', which creates 
#    a logging service 'global'
# 
#       logger::xotcl::Logger l1 -servicename global
#       l1 log info hello1
#
# 3) Create first a tcl logger 'myservice' and use later 
#    the tcl logger form the wrapper class 'l2'
#
#       set log [logger::init myservice]

#       logger::xotcl::Logger l2 -servicename myservice
#       l2 log info hello2
#
package provide ::logger::xotcl 0.2