in logger/awslogs/logger.go [89:141]
func (la *LoggerArgs) RunLogDriver(ctx context.Context, config *logging.Config, ready func() error) error {
defer debug.DeferFuncForRunLogDriver()
loggerConfig := getAWSLogsConfig(la.args)
if err := validateLogOptCompatability(loggerConfig); err != nil {
debug.ErrLogger = fmt.Errorf("incompatible logger options: %w", err)
return debug.ErrLogger
}
info := logger.NewInfo(
la.globalArgs.ContainerID,
la.globalArgs.ContainerName,
logger.WithConfig(loggerConfig),
)
stream, err := dockerawslogs.New(*info)
if err != nil {
debug.ErrLogger = fmt.Errorf("unable to create stream: %w", err)
return debug.ErrLogger
}
l, err := logger.NewLogger(
logger.WithStdout(config.Stdout),
logger.WithStderr(config.Stderr),
logger.WithInfo(info),
logger.WithStream(stream),
logger.WithBufferSizeInBytes(maximumBytesPerEvent),
)
if err != nil {
debug.ErrLogger = fmt.Errorf("unable to create awslogs driver: %w", err)
return debug.ErrLogger
}
if la.globalArgs.Mode == logger.NonBlockingMode {
debug.SendEventsToLog(logger.DaemonName, "Starting log streaming for non-blocking mode awslogs driver",
debug.INFO, 0)
l = logger.NewBufferedLogger(l, defaultAwsBufSizeInBytes, la.globalArgs.MaxBufferSize, la.globalArgs.ContainerID)
}
// Start awslogs driver
debug.SendEventsToLog(logger.DaemonName, "Starting log streaming for awslogs driver", debug.INFO, 0)
err = l.Start(ctx, la.globalArgs.CleanupTime, ready)
if err != nil {
debug.ErrLogger = fmt.Errorf("failed to run awslogs driver: %w", err)
// Do not return error if log driver has issue sending logs to destination, because if error
// returned here, containerd will identify this error and kill shim process, which will kill
// the container process accordingly.
// Note: the container will continue to run if shim logger exits after.
// Reference: https://github.com/containerd/containerd/blob/release/1.3/runtime/v2/logging/logging.go
return nil
}
debug.SendEventsToLog(logger.DaemonName, "Logging finished", debug.INFO, 1)
return nil
}