github.com/DaoCloud/dao@v0.0.0-20161212064103-c3dbfd13ee36/api/client/container/logs.go (about) 1 package container 2 3 import ( 4 "fmt" 5 "io" 6 7 "golang.org/x/net/context" 8 9 "github.com/docker/docker/api/client" 10 "github.com/docker/docker/cli" 11 "github.com/docker/docker/pkg/stdcopy" 12 "github.com/docker/engine-api/types" 13 "github.com/spf13/cobra" 14 ) 15 16 var validDrivers = map[string]bool{ 17 "json-file": true, 18 "journald": true, 19 } 20 21 type logsOptions struct { 22 follow bool 23 since string 24 timestamps bool 25 details bool 26 tail string 27 28 container string 29 } 30 31 // NewLogsCommand creats a new cobra.Command for `docker logs` 32 func NewLogsCommand(dockerCli *client.DockerCli) *cobra.Command { 33 var opts logsOptions 34 35 cmd := &cobra.Command{ 36 Use: "logs [OPTIONS] CONTAINER", 37 Short: "获取一个容器的运行日志", 38 Args: cli.ExactArgs(1), 39 RunE: func(cmd *cobra.Command, args []string) error { 40 opts.container = args[0] 41 return runLogs(dockerCli, &opts) 42 }, 43 } 44 45 flags := cmd.Flags() 46 flags.BoolVarP(&opts.follow, "follow", "f", false, "跟踪容器日志输出") 47 flags.StringVar(&opts.since, "since", "", "从某一个时间戳开始获取日志") 48 flags.BoolVarP(&opts.timestamps, "timestamps", "t", false, "显示日志的时间戳") 49 flags.BoolVar(&opts.details, "details", false, "显示提供给日志的额外细节") 50 flags.StringVar(&opts.tail, "tail", "all", "从日志尾部往上显示制定数量行数的日志,all代表显示所有日志") 51 return cmd 52 } 53 54 func runLogs(dockerCli *client.DockerCli, opts *logsOptions) error { 55 ctx := context.Background() 56 57 c, err := dockerCli.Client().ContainerInspect(ctx, opts.container) 58 if err != nil { 59 return err 60 } 61 62 if !validDrivers[c.HostConfig.LogConfig.Type] { 63 return fmt.Errorf("\"logs\" 命令只支持\"json-file\"和\"journald\"日志驱动(当前日志驱动为: %s)", c.HostConfig.LogConfig.Type) 64 } 65 66 options := types.ContainerLogsOptions{ 67 ShowStdout: true, 68 ShowStderr: true, 69 Since: opts.since, 70 Timestamps: opts.timestamps, 71 Follow: opts.follow, 72 Tail: opts.tail, 73 Details: opts.details, 74 } 75 responseBody, err := dockerCli.Client().ContainerLogs(ctx, opts.container, options) 76 if err != nil { 77 return err 78 } 79 defer responseBody.Close() 80 81 if c.Config.Tty { 82 _, err = io.Copy(dockerCli.Out(), responseBody) 83 } else { 84 _, err = stdcopy.StdCopy(dockerCli.Out(), dockerCli.Err(), responseBody) 85 } 86 return err 87 }