/ vendor / github.com / prometheus / common / log / eventlog_formatter.go
eventlog_formatter.go
 1  // Copyright 2015 The Prometheus Authors
 2  // Licensed under the Apache License, Version 2.0 (the "License");
 3  // you may not use this file except in compliance with the License.
 4  // You may obtain a copy of the License at
 5  //
 6  // http://www.apache.org/licenses/LICENSE-2.0
 7  //
 8  // Unless required by applicable law or agreed to in writing, software
 9  // distributed under the License is distributed on an "AS IS" BASIS,
10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  // See the License for the specific language governing permissions and
12  // limitations under the License.
13  
14  // +build windows
15  
16  package log
17  
18  import (
19  	"fmt"
20  	"os"
21  
22  	"golang.org/x/sys/windows/svc/eventlog"
23  
24  	"github.com/sirupsen/logrus"
25  )
26  
27  func init() {
28  	setEventlogFormatter = func(l logger, name string, debugAsInfo bool) error {
29  		if name == "" {
30  			return fmt.Errorf("missing name parameter")
31  		}
32  
33  		fmter, err := newEventlogger(name, debugAsInfo, l.entry.Logger.Formatter)
34  		if err != nil {
35  			fmt.Fprintf(os.Stderr, "error creating eventlog formatter: %v\n", err)
36  			l.Errorf("can't connect logger to eventlog: %v", err)
37  			return err
38  		}
39  		l.entry.Logger.Formatter = fmter
40  		return nil
41  	}
42  }
43  
44  type eventlogger struct {
45  	log         *eventlog.Log
46  	debugAsInfo bool
47  	wrap        logrus.Formatter
48  }
49  
50  func newEventlogger(name string, debugAsInfo bool, fmter logrus.Formatter) (*eventlogger, error) {
51  	logHandle, err := eventlog.Open(name)
52  	if err != nil {
53  		return nil, err
54  	}
55  	return &eventlogger{log: logHandle, debugAsInfo: debugAsInfo, wrap: fmter}, nil
56  }
57  
58  func (s *eventlogger) Format(e *logrus.Entry) ([]byte, error) {
59  	data, err := s.wrap.Format(e)
60  	if err != nil {
61  		fmt.Fprintf(os.Stderr, "eventlogger: can't format entry: %v\n", err)
62  		return data, err
63  	}
64  
65  	switch e.Level {
66  	case logrus.PanicLevel:
67  		fallthrough
68  	case logrus.FatalLevel:
69  		fallthrough
70  	case logrus.ErrorLevel:
71  		err = s.log.Error(102, e.Message)
72  	case logrus.WarnLevel:
73  		err = s.log.Warning(101, e.Message)
74  	case logrus.InfoLevel:
75  		err = s.log.Info(100, e.Message)
76  	case logrus.DebugLevel:
77  		if s.debugAsInfo {
78  			err = s.log.Info(100, e.Message)
79  		}
80  	default:
81  		err = s.log.Info(100, e.Message)
82  	}
83  
84  	if err != nil {
85  		fmt.Fprintf(os.Stderr, "eventlogger: can't send log to eventlog: %v\n", err)
86  	}
87  
88  	return data, err
89  }