github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/realtime/log_hook.go (about)

     1  package realtime
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/cozy/cozy-stack/pkg/prefixer"
     7  	"github.com/sirupsen/logrus"
     8  )
     9  
    10  type log struct {
    11  	LogID   string                 `json:"_id"`
    12  	Time    time.Time              `json:"time"`
    13  	Message string                 `json:"message"`
    14  	Level   string                 `json:"level"`
    15  	Data    map[string]interface{} `json:"data"`
    16  
    17  	docType string
    18  }
    19  
    20  func (l *log) DocType() string   { return l.docType }
    21  func (l *log) ID() string        { return l.LogID }
    22  func (l *log) Rev() string       { return "" }
    23  func (l *log) SetID(id string)   { l.LogID = id }
    24  func (l *log) SetRev(rev string) {}
    25  
    26  type logHook struct {
    27  	Hub
    28  	db      prefixer.Prefixer
    29  	docType string
    30  	docID   string
    31  }
    32  
    33  // LogHook creates a hook that transmits logs through redis pubsub
    34  // messaging.
    35  func LogHook(db prefixer.Prefixer, hub Hub, parentDocType, documentID string) logrus.Hook {
    36  	return &logHook{
    37  		Hub:     hub,
    38  		db:      db,
    39  		docType: parentDocType + ".logs",
    40  		docID:   documentID,
    41  	}
    42  }
    43  
    44  func (r *logHook) Levels() []logrus.Level {
    45  	return logrus.AllLevels
    46  }
    47  
    48  func (r *logHook) Fire(entry *logrus.Entry) error {
    49  	doc := &log{
    50  		LogID:   r.docID,
    51  		Time:    entry.Time,
    52  		Message: entry.Message,
    53  		Level:   entry.Level.String(),
    54  		Data:    entry.Data,
    55  		docType: r.docType,
    56  	}
    57  	r.Hub.Publish(r.db, EventCreate, doc, nil)
    58  	return nil
    59  }