src/amp/logging/logging.go |
| ... | ... | @@ -45,6 +45,12 @@ var ( |
| 45 | 45 | ConsoleFilters = make([]Filter, 0) |
| 46 | 46 | ) |
| 47 | 47 | |
| 48 | +var ( |
| 49 | + checker = make(chan int, 1) |
| 50 | + waiter = make(chan int, 1) |
| 51 | + waitable = false |
| 52 | +) |
| 53 | + |
| 48 | 54 | type Filter func(record *Record) (write bool, data []interface{}) |
| 49 | 55 | |
| 50 | 56 | type ConsoleLogger struct { |
| ... | ... | @@ -123,7 +129,8 @@ func (logger *FileLogger) log() { |
| 123 | 129 | } |
| 124 | 130 | fmt.Fprintf(logger.file, "%v", Now) |
| 125 | 131 | for i := 0; i < argLength; i++ { |
| 126 | | - fmt.Fprintf(logger.file, "\xfe%v", record.Items[i]) |
| 132 | + message := strconv.Quote(fmt.Sprint(record.Items[i])) |
| 133 | + fmt.Fprintf(logger.file, "\xfe%s", message[0:len(message)-1]) |
| 127 | 134 | } |
| 128 | 135 | logger.file.Write(endOfLogRecord) |
| 129 | 136 | } |
| ... | ... | @@ -140,9 +147,18 @@ func (logger *ConsoleLogger) log() { |
| 140 | 147 | var write bool |
| 141 | 148 | |
| 142 | 149 | for { |
| 143 | | - record = <-logger.receiver |
| 144 | | - items = record.Items |
| 145 | | - write = true |
| 150 | + select { |
| 151 | + case record = <-logger.receiver: |
| 152 | + items = record.Items |
| 153 | + write = true |
| 154 | + case <-checker: |
| 155 | + if len(logger.receiver) > 0 { |
| 156 | + checker <- 1 |
| 157 | + continue |
| 158 | + } |
| 159 | + waiter <- 1 |
| 160 | + continue |
| 161 | + } |
| 146 | 162 | for _, filter := range ConsoleFilters { |
| 147 | 163 | write, data := filter(record) |
| 148 | 164 | if !write { |
| ... | ... | @@ -183,11 +199,7 @@ func Info(message string, v ...interface{}) { |
| 183 | 199 | if len(v) > 0 { |
| 184 | 200 | message = fmt.Sprintf(message, v...) |
| 185 | 201 | } |
| 186 | | - message = strconv.Quote(message) |
| 187 | | - items := make([]interface{}, 2) |
| 188 | | - items[0] = "m" |
| 189 | | - items[1] = message[1 : len(message)-1] |
| 190 | | - record := &Record{false, items} |
| 202 | + record := &Record{false, []interface{}{"m", message}} |
| 191 | 203 | for _, receiver := range InfoReceivers { |
| 192 | 204 | receiver <- record |
| 193 | 205 | } |
| ... | ... | @@ -204,11 +216,7 @@ func Error(message string, v ...interface{}) { |
| 204 | 216 | if len(v) > 0 { |
| 205 | 217 | message = fmt.Sprintf(message, v...) |
| 206 | 218 | } |
| 207 | | - message = strconv.Quote(message) |
| 208 | | - items := make([]interface{}, 2) |
| 209 | | - items[0] = "m" |
| 210 | | - items[1] = message[1 : len(message)-1] |
| 211 | | - record := &Record{true, items} |
| 219 | + record := &Record{true, []interface{}{"m", message}} |
| 212 | 220 | for _, receiver := range ErrorReceivers { |
| 213 | 221 | receiver <- record |
| 214 | 222 | } |
| ... | ... | @@ -258,12 +266,11 @@ func FixUpLog(filename string) (pointer int) { |
| 258 | 266 | } |
| 259 | 267 | |
| 260 | 268 | func AddFileLogger(name string, directory string, rotate int, logType int) (logger *FileLogger, err os.Error) { |
| 261 | | - receiver := make(chan *Record, 100) |
| 262 | 269 | logger = &FileLogger{ |
| 263 | 270 | name: name, |
| 264 | 271 | directory: directory, |
| 265 | 272 | rotate: rotate, |
| 266 | | - receiver: receiver, |
| 273 | + receiver: make(chan *Record, 100), |
| 267 | 274 | } |
| 268 | 275 | filename := logger.GetFilename(UTC) |
| 269 | 276 | pointer := FixUpLog(filename) |
| ... | ... | @@ -282,9 +289,9 @@ func AddFileLogger(name string, directory string, rotate int, logType int) (logg |
| 282 | 289 | } |
| 283 | 290 | |
| 284 | 291 | func AddConsoleLogger() { |
| 285 | | - stdReceiver := make(chan *Record, 100) |
| 292 | + waitable = true |
| 286 | 293 | console := &ConsoleLogger{ |
| 287 | | - receiver: stdReceiver, |
| 294 | + receiver: make(chan *Record, 100), |
| 288 | 295 | } |
| 289 | 296 | go console.log() |
| 290 | 297 | AddReceiver(console.receiver, MixedLog) |
| ... | ... | @@ -303,6 +310,13 @@ func AddConsoleFilter(filter Filter) { |
| 303 | 310 | ConsoleFilters = append(ConsoleFilters, filter) |
| 304 | 311 | } |
| 305 | 312 | |
| 313 | +func Wait() { |
| 314 | + if waitable { |
| 315 | + checker <- 1 |
| 316 | + <-waiter |
| 317 | + } |
| 318 | +} |
| 319 | + |
| 306 | 320 | func init() { |
| 307 | 321 | |
| 308 | 322 | go func() { |