| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // Copyright 2017 Google Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
-
- package pipoint
-
- import (
- "compress/gzip"
- "fmt"
- "log"
- "os"
- "time"
- )
-
- // EventLogger is a async event logger.
- type EventLogger struct {
- logger *log.Logger
- sink *os.File
- zip *gzip.Writer
- msgs chan []byte
- }
-
- // NewEventLogger creates a new event logger that writes to the given
- // base name.
- func NewEventLogger(name string) *EventLogger {
- now := time.Now().Format(time.RFC3339)
- fname := fmt.Sprintf("%s-%s.txt.gz", name, now)
- sink, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
-
- if err != nil {
- log.Panicln(err)
- }
-
- zip := gzip.NewWriter(sink)
-
- msgs := make(chan []byte, 10)
-
- el := &EventLogger{
- sink: sink,
- zip: zip,
- msgs: msgs,
- }
-
- el.logger = log.New(el, "", log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
-
- go el.run()
-
- return el
- }
-
- func (el *EventLogger) run() {
- tick := time.Tick(3 * time.Second)
-
- for {
- select {
- case p := <-el.msgs:
- el.zip.Write(p)
- case <-tick:
- el.zip.Flush()
- break
- }
- }
- }
-
- func (el *EventLogger) Write(p []byte) (n int, err error) {
- buf := make([]byte, len(p))
- copy(buf, p)
- el.msgs <- buf
- return len(p), nil
- }
|