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 syslog friendly formatter
38 type syslogFormatter struct{}
40 // Format converts a log entry into a list of bytes
41 func (sf *syslogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
44 keys := make([]string, 0, len(entry.Data))
45 for k := range entry.Data {
46 keys = append(keys, k)
50 for _, k := range keys {
51 if _, err = buf.WriteString(fmt.Sprintf("[%s]%+v ", k, entry.Data[k])); err != nil {
52 return nil, errors.Wrapf(err, "buf.WriteString %s", k)
55 if _, err = buf.WriteString(entry.Message); err != nil {
56 return nil, errors.Wrap(err, "buf.WriteString message")
58 return buf.Bytes(), nil
61 // NewLogger returns a logger for specified level. Syslog or Windows Events can be turned on.
62 func NewLogger(level string, syslog bool) (*logrus.Logger, error) {
63 var logger *logrus.Logger
64 logLevel, err := logrus.ParseLevel(level)
66 return nil, errors.Wrap(err, "logrus.ParseLevel")
70 syslogHook, err := logrus_syslog.NewSyslogHook("", "", logsyslog.LOG_INFO, "GoVPN")
72 return nil, errors.Wrap(err, "logrus_syslog.NewSyslogHook")
74 logger = &logrus.Logger{
75 Formatter: &syslogFormatter{},
76 Hooks: make(logrus.LevelHooks),
78 logger.Hooks.Add(syslogHook)
80 logger = &logrus.Logger{
81 Formatter: &logrus.TextFormatter{
84 DisableTimestamp: false,
86 TimestampFormat: time.RFC3339Nano,
87 DisableSorting: false,
89 Hooks: make(logrus.LevelHooks),
92 logger.Out = os.Stderr
93 logger.Level = logLevel
94 logger.WithFields(logrus.Fields{
95 "version": VersionGet(),
96 "level": logLevel.String(),
97 }).Info("Initialize logging")
101 // ExtendLogFields adds batch of log Fields to existing fields ones
102 func ExtendLogFields(input *logrus.Fields, add logrus.Fields) {
104 for k, v := range add {
109 // MergeLogFields combines multiple log fields into a single one
110 func MergeLogFields(fields ...logrus.Fields) (output logrus.Fields) {
111 output = logrus.Fields{}
112 for _, f := range fields {
113 ExtendLogFields(&output, f)