code: func (hook *GraylogHook) Fire(entry *logrus.Entry) error {
  	hook.mu.RLock() // Claim the mutex as a RLock - allowing multiple go routines to log simultaneously
  	defer hook.mu.RUnlock()
  
  	var file string
  	var line int
  
  	if entry.Caller != nil {
  		file = entry.Caller.File
  		line = entry.Caller.Line
  	}
  
  	newData := make(map[string]interface{})
  	for k, v := range entry.Data {
  		newData[k] = v
  	}
  
  	newEntry := &logrus.Entry{
  		Logger:  entry.Logger,
  		Data:    newData,
  		Time:    entry.Time,
  		Level:   entry.Level,
  		Caller:  entry.Caller,
  		Message: entry.Message,
  	}
  	gEntry := graylogEntry{newEntry, file, line}
  
  	if hook.synchronous {
  		hook.sendEntry(gEntry)
  	} else {
  		hook.wg.Add(1)
  		hook.buf <- gEntry
  	}
  
  	return nil
  }
docs: // Fire is called when a log event is fired.
  // We assume the entry will be altered by another hook,
  // otherwise we might logging something wrong to Graylog