github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/cli/command/container/logs.go (about)

     1  package container
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/docker/docker/api/types"
     7  	"github.com/docker/docker/cli"
     8  	"github.com/docker/docker/cli/command"
     9  	"github.com/docker/docker/pkg/stdcopy"
    10  	"github.com/spf13/cobra"
    11  	"golang.org/x/net/context"
    12  )
    13  
    14  type logsOptions struct {
    15  	follow     bool
    16  	since      string
    17  	timestamps bool
    18  	details    bool
    19  	tail       string
    20  
    21  	container string
    22  }
    23  
    24  // NewLogsCommand creates a new cobra.Command for `docker logs`
    25  func NewLogsCommand(dockerCli *command.DockerCli) *cobra.Command {
    26  	var opts logsOptions
    27  
    28  	cmd := &cobra.Command{
    29  		Use:   "logs [OPTIONS] CONTAINER",
    30  		Short: "Fetch the logs of a container",
    31  		Args:  cli.ExactArgs(1),
    32  		RunE: func(cmd *cobra.Command, args []string) error {
    33  			opts.container = args[0]
    34  			return runLogs(dockerCli, &opts)
    35  		},
    36  	}
    37  
    38  	flags := cmd.Flags()
    39  	flags.BoolVarP(&opts.follow, "follow", "f", false, "Follow log output")
    40  	flags.StringVar(&opts.since, "since", "", "Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)")
    41  	flags.BoolVarP(&opts.timestamps, "timestamps", "t", false, "Show timestamps")
    42  	flags.BoolVar(&opts.details, "details", false, "Show extra details provided to logs")
    43  	flags.StringVar(&opts.tail, "tail", "all", "Number of lines to show from the end of the logs")
    44  	return cmd
    45  }
    46  
    47  func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
    48  	ctx := context.Background()
    49  
    50  	options := types.ContainerLogsOptions{
    51  		ShowStdout: true,
    52  		ShowStderr: true,
    53  		Since:      opts.since,
    54  		Timestamps: opts.timestamps,
    55  		Follow:     opts.follow,
    56  		Tail:       opts.tail,
    57  		Details:    opts.details,
    58  	}
    59  	responseBody, err := dockerCli.Client().ContainerLogs(ctx, opts.container, options)
    60  	if err != nil {
    61  		return err
    62  	}
    63  	defer responseBody.Close()
    64  
    65  	c, err := dockerCli.Client().ContainerInspect(ctx, opts.container)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	if c.Config.Tty {
    71  		_, err = io.Copy(dockerCli.Out(), responseBody)
    72  	} else {
    73  		_, err = stdcopy.StdCopy(dockerCli.Out(), dockerCli.Err(), responseBody)
    74  	}
    75  	return err
    76  }