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) {
42 buf := bytes.NewBuffer(nil)
47 keys := make([]string, len(entry.Data))
48 for k := range entry.Data {
54 for index = range keys {
57 if _, err = buf.WriteString(fmt.Sprintf("[%s]%+v ", k, v)); err != nil {
58 return nil, errors.Wrapf(err, "buf.WriteString %s", k)
61 if _, err = buf.WriteString(entry.Message); err != nil {
62 return nil, errors.Wrap(err, "buf.WriteString message")
64 return buf.Bytes(), nil
67 // NewLogger returns a logger for specified level. Syslog or Windows Events can be turned on.
68 func NewLogger(level string, syslog bool) (*logrus.Logger, error) {
69 var logger *logrus.Logger
70 logLevel, err := logrus.ParseLevel(level)
72 return nil, errors.Wrap(err, "logrus.ParseLevel")
76 syslogHook, err := logrus_syslog.NewSyslogHook("", "", logsyslog.LOG_INFO, "GoVPN")
78 return nil, errors.Wrap(err, "logrus_syslog.NewSyslogHook")
80 logger = &logrus.Logger{
81 Formatter: &syslogFormatter{},
82 Hooks: make(logrus.LevelHooks),
84 logger.Hooks.Add(syslogHook)
86 logger = &logrus.Logger{
87 Formatter: &logrus.TextFormatter{
90 DisableTimestamp: false,
92 TimestampFormat: time.RFC3339Nano,
93 DisableSorting: false,
95 Hooks: make(logrus.LevelHooks),
98 logger.Out = os.Stderr
99 logger.Level = logLevel
100 logger.WithFields(logrus.Fields{
101 "version": VersionGet(),
102 "level": logLevel.String(),
103 }).Info("Initialize logging")
107 // ExtendLogFields adds batch of log Fields to existing fields ones
108 func ExtendLogFields(input *logrus.Fields, add logrus.Fields) {
110 for k, v := range add {
115 // MergeLogFields combines multiple log fields into a single one
116 func MergeLogFields(fields ...logrus.Fields) (output logrus.Fields) {
117 output = logrus.Fields{}
118 for _, f := range fields {
119 ExtendLogFields(&output, f)