github.com/projectatomic/docker@v1.8.2/daemon/logger/logger.go (about)

     1  package logger
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"github.com/docker/docker/pkg/timeutils"
     8  )
     9  
    10  // ErrReadLogsNotSupported is returned when the logger does not support reading logs
    11  var ErrReadLogsNotSupported = errors.New("configured logging reader does not support reading")
    12  
    13  const (
    14  	// TimeFormat is the time format used for timestamps sent to log readers
    15  	TimeFormat           = timeutils.RFC3339NanoFixed
    16  	logWatcherBufferSize = 4096
    17  )
    18  
    19  // Message is datastructure that represents record from some container
    20  type Message struct {
    21  	ContainerID string
    22  	Line        []byte
    23  	Source      string
    24  	Timestamp   time.Time
    25  }
    26  
    27  // Logger is the interface for docker logging drivers
    28  type Logger interface {
    29  	Log(*Message) error
    30  	Name() string
    31  	Close() error
    32  }
    33  
    34  // ReadConfig is the configuration passed into ReadLogs
    35  type ReadConfig struct {
    36  	Since  time.Time
    37  	Tail   int
    38  	Follow bool
    39  }
    40  
    41  // LogReader is the interface for reading log messages for loggers that support reading
    42  type LogReader interface {
    43  	// Read logs from underlying logging backend
    44  	ReadLogs(ReadConfig) *LogWatcher
    45  }
    46  
    47  // LogWatcher is used when consuming logs read from the LogReader interface
    48  type LogWatcher struct {
    49  	// For sending log messages to a reader
    50  	Msg chan *Message
    51  	// For sending error messages that occur while while reading logs
    52  	Err           chan error
    53  	closeNotifier chan struct{}
    54  }
    55  
    56  // NewLogWatcher returns a new LogWatcher.
    57  func NewLogWatcher() *LogWatcher {
    58  	return &LogWatcher{
    59  		Msg:           make(chan *Message, logWatcherBufferSize),
    60  		Err:           make(chan error, 1),
    61  		closeNotifier: make(chan struct{}),
    62  	}
    63  }
    64  
    65  // Close notifies the underlying log reader to stop
    66  func (w *LogWatcher) Close() {
    67  	// only close if not already closed
    68  	select {
    69  	case <-w.closeNotifier:
    70  	default:
    71  		close(w.closeNotifier)
    72  	}
    73  }
    74  
    75  // WatchClose returns a channel receiver that receives notification when the watcher has been closed
    76  // This should only be called from one goroutine
    77  func (w *LogWatcher) WatchClose() <-chan struct{} {
    78  	return w.closeNotifier
    79  }