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 }