logs.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package client
  2. import (
  3. "encoding/json"
  4. "net/url"
  5. "time"
  6. "github.com/docker/docker/api/types"
  7. Cli "github.com/docker/docker/cli"
  8. flag "github.com/docker/docker/pkg/mflag"
  9. "github.com/docker/docker/pkg/timeutils"
  10. )
  11. // CmdLogs fetches the logs of a given container.
  12. //
  13. // docker logs [OPTIONS] CONTAINER
  14. func (cli *DockerCli) CmdLogs(args ...string) error {
  15. cmd := Cli.Subcmd("logs", []string{"CONTAINER"}, "Fetch the logs of a container", true)
  16. follow := cmd.Bool([]string{"f", "-follow"}, false, "Follow log output")
  17. since := cmd.String([]string{"-since"}, "", "Show logs since timestamp")
  18. times := cmd.Bool([]string{"t", "-timestamps"}, false, "Show timestamps")
  19. tail := cmd.String([]string{"-tail"}, "all", "Number of lines to show from the end of the logs")
  20. cmd.Require(flag.Exact, 1)
  21. cmd.ParseFlags(args, true)
  22. name := cmd.Arg(0)
  23. serverResp, err := cli.call("GET", "/containers/"+name+"/json", nil, nil)
  24. if err != nil {
  25. return err
  26. }
  27. var c types.ContainerJSON
  28. if err := json.NewDecoder(serverResp.body).Decode(&c); err != nil {
  29. return err
  30. }
  31. v := url.Values{}
  32. v.Set("stdout", "1")
  33. v.Set("stderr", "1")
  34. if *since != "" {
  35. v.Set("since", timeutils.GetTimestamp(*since, time.Now()))
  36. }
  37. if *times {
  38. v.Set("timestamps", "1")
  39. }
  40. if *follow {
  41. v.Set("follow", "1")
  42. }
  43. v.Set("tail", *tail)
  44. sopts := &streamOpts{
  45. rawTerminal: c.Config.Tty,
  46. out: cli.out,
  47. err: cli.err,
  48. }
  49. _, err = cli.stream("GET", "/containers/"+name+"/logs?"+v.Encode(), sopts)
  50. return err
  51. }