4 GoVPN -- simple secure free software virtual private network daemon
5 Copyright (C) 2014-2017 Sergey Matveev <stargrave@stargrave.org>
6 2016-2017 Bruno Clermont <bruno@robotinfra.com>
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
27 logsyslog "log/syslog"
32 "github.com/Sirupsen/logrus"
33 "github.com/Sirupsen/logrus/hooks/syslog"
34 "github.com/pkg/errors"
37 // syslogFormatter is a formatter that is syslog friendly
38 type syslogFormatter struct {
41 // Format convert a log entry into a list of bytes
42 func (sf *syslogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
43 buf := bytes.NewBuffer(nil)
48 keys := make([]string, len(entry.Data))
49 for k := range entry.Data {
55 for index = range keys {
58 if _, err = buf.WriteString(fmt.Sprintf("[%s]%+v ", k, v)); err != nil {
59 return nil, errors.Wrapf(err, "buf.WriteString %s", k)
62 if _, err = buf.WriteString(entry.Message); err != nil {
63 return nil, errors.Wrap(err, "buf.WriteString message")
65 return buf.Bytes(), nil
68 // NewLogger return a logger for specified level. Syslog or Windows Events can be turned on.
69 func NewLogger(level string, syslog bool) (*logrus.Logger, error) {
70 var logger *logrus.Logger
71 logLevel, err := logrus.ParseLevel(level)
73 return nil, errors.Wrap(err, "logrus.ParseLevel")
77 syslogHook, err := logrus_syslog.NewSyslogHook("", "", logsyslog.LOG_INFO, "GoVPN")
79 return nil, errors.Wrap(err, "logrus_syslog.NewSyslogHook")
81 logger = &logrus.Logger{
82 Formatter: &syslogFormatter{},
83 Hooks: make(logrus.LevelHooks),
85 logger.Hooks.Add(syslogHook)
87 logger = &logrus.Logger{
88 Formatter: &logrus.TextFormatter{
91 DisableTimestamp: false,
93 TimestampFormat: time.RFC3339Nano,
94 DisableSorting: false,
96 Hooks: make(logrus.LevelHooks),
99 logger.Out = os.Stderr
100 logger.Level = logLevel
101 logger.WithFields(logrus.Fields{
102 "version": VersionGet(),
103 "level": logLevel.String(),
104 }).Info("Initialize logging")
108 // ExtendLogFields add to existing fields a new batch of log Fields
109 func ExtendLogFields(input *logrus.Fields, add logrus.Fields) {
111 for k, v := range add {
116 // MergeLogFields combine multiple log fields into a single one
117 func MergeLogFields(fields ...logrus.Fields) (output logrus.Fields) {
118 output = logrus.Fields{}
119 for _, f := range fields {
120 ExtendLogFields(&output, f)