gitee.com/leisunstar/runtime@v0.0.0-20200521203717-5cef3e7b53f9/pkg/katautils/logger.go (about)

     1  // Copyright (c) 2018 Intel Corporation
     2  // Copyright (c) 2018 HyperHQ Inc.
     3  //
     4  // SPDX-License-Identifier: Apache-2.0
     5  //
     6  
     7  package katautils
     8  
     9  import (
    10  	"context"
    11  	"log/syslog"
    12  	"time"
    13  
    14  	"github.com/sirupsen/logrus"
    15  	lSyslog "github.com/sirupsen/logrus/hooks/syslog"
    16  )
    17  
    18  // Default our log level to 'Warn', rather than the logrus default
    19  // of 'Info', which is rather noisy.
    20  var originalLoggerLevel = logrus.WarnLevel
    21  var kataUtilsLogger = logrus.NewEntry(logrus.New())
    22  
    23  // SetLogger sets the logger for the factory.
    24  func SetLogger(ctx context.Context, logger *logrus.Entry, level logrus.Level) {
    25  	fields := logrus.Fields{
    26  		"source": "katautils",
    27  	}
    28  
    29  	originalLoggerLevel = level
    30  	kataUtilsLogger = logger.WithFields(fields)
    31  }
    32  
    33  // sysLogHook wraps a syslog logrus hook and a formatter to be used for all
    34  // syslog entries.
    35  //
    36  // This is necessary to allow the main logger (for "--log=") to use a custom
    37  // formatter ("--log-format=") whilst allowing the system logger to use a
    38  // different formatter.
    39  type sysLogHook struct {
    40  	shook     *lSyslog.SyslogHook
    41  	formatter logrus.Formatter
    42  }
    43  
    44  func (h *sysLogHook) Levels() []logrus.Level {
    45  	return h.shook.Levels()
    46  }
    47  
    48  // Fire is responsible for adding a log entry to the system log. It switches
    49  // formatter before adding the system log entry, then reverts the original log
    50  // formatter.
    51  func (h *sysLogHook) Fire(e *logrus.Entry) (err error) {
    52  	formatter := e.Logger.Formatter
    53  
    54  	e.Logger.Formatter = h.formatter
    55  
    56  	err = h.shook.Fire(e)
    57  
    58  	e.Logger.Formatter = formatter
    59  
    60  	return err
    61  }
    62  
    63  func newSystemLogHook(network, raddr string) (*sysLogHook, error) {
    64  	hook, err := lSyslog.NewSyslogHook(network, raddr, syslog.LOG_INFO, name)
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  
    69  	return &sysLogHook{
    70  		formatter: &logrus.TextFormatter{
    71  			TimestampFormat: time.RFC3339Nano,
    72  		},
    73  		shook: hook,
    74  	}, nil
    75  }
    76  
    77  // handleSystemLog sets up the system-level logger.
    78  func handleSystemLog(network, raddr string) error {
    79  	hook, err := newSystemLogHook(network, raddr)
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	kataUtilsLogger.Logger.Hooks.Add(hook)
    85  
    86  	return nil
    87  }