sadlil
sadlil

Reputation: 3163

Kubernetes go client api for log of a particular pod

I am using kube go client with kube api to access kube data. I am currently not finding any api call for logs of a particular pod.

kubectl logs pod-name

returns the logs for a particular pod. How do I do this using go client? I am using v1.0.6 of kubernetes.

I can get the pod by using

client.Pods("namespace").Get("pod-name")

Upvotes: 15

Views: 16377

Answers (2)

Alex Robinson
Alex Robinson

Reputation: 13377

Client Go has offered a function GetLogs for this, which has been answered in How to get logs from kubernetes using Go?


Looking at how kubectl implements its commands can be helpful when getting a feel for how to use the client library. In this case, kubectl's implementation of the logs command looks like this:

    req := client.RESTClient.Get().
        Namespace(namespace).
        Name(podID).
        Resource("pods").
        SubResource("log").
        Param("follow", strconv.FormatBool(logOptions.Follow)).
        Param("container", logOptions.Container).
        Param("previous", strconv.FormatBool(logOptions.Previous)).
        Param("timestamps", strconv.FormatBool(logOptions.Timestamps))

    if logOptions.SinceSeconds != nil {
        req.Param("sinceSeconds", strconv.FormatInt(*logOptions.SinceSeconds, 10))
    }
    if logOptions.SinceTime != nil {
        req.Param("sinceTime", logOptions.SinceTime.Format(time.RFC3339))
    }
    if logOptions.LimitBytes != nil {
        req.Param("limitBytes", strconv.FormatInt(*logOptions.LimitBytes, 10))
    }
    if logOptions.TailLines != nil {
        req.Param("tailLines", strconv.FormatInt(*logOptions.TailLines, 10))
    }
    readCloser, err := req.Stream()
    if err != nil {
        return err
    }

    defer readCloser.Close()
    _, err = io.Copy(out, readCloser)
    return err

Upvotes: 30

z.x
z.x

Reputation: 2507

type Pipe struct {
    InReader  *io.PipeReader
    InWriter  *io.PipeWriter
    OutReader *io.PipeReader
    OutWriter *io.PipeWriter
}


req := client.RESTClient().Get().Resource("pods").
    Name(option.Name).Namespace(option.Namespace).SubResource("log")

opt := &coreV1.PodLogOptions{
    Follow:       option.Follow,
    Previous:     option.Previous,
    SinceSeconds: option.SinceSeconds,
    Timestamps:   option.Timestamps,
    TailLines:    option.TailLines,
    LimitBytes:   option.LimitBytes,
}
if option.Container != "" {
    opt.Container = option.Container
}

req.VersionedParams(
    opt,
    scheme.ParameterCodec,
)

exec, err := remotecommand.NewSPDYExecutor(k.cli.kubeConfig, http.MethodGet, req.URL())
if err != nil {
    return err
}

err = exec.Stream(remotecommand.StreamOptions{
    Stdin:  pipe.InReader,
    Stdout: pipe.OutWriter,
    Stderr: pipe.OutWriter,
    Tty:    true,
})
if err != nil {
    return err
}
return nil

Upvotes: 0

Related Questions