logadmin - ActiveState ActiveGo 1.8
...

Package logadmin

import "cloud.google.com/go/logging/logadmin"
Overview
Index
Examples

Overview ▾

Package logadmin contains a Stackdriver Logging client that can be used for reading logs and working with sinks, metrics and monitored resources. For a client that can write logs, see package cloud.google.com/go/logging.

The client uses Logging API v2. See https://cloud.google.com/logging/docs/api/v2/ for an introduction to the API.

Note: This package is in beta. Some backwards-incompatible changes may occur.

Index ▾

type Client
    func NewClient(ctx context.Context, projectID string, opts ...option.ClientOption) (*Client, error)
    func (c *Client) Close() error
    func (c *Client) CreateMetric(ctx context.Context, m *Metric) error
    func (c *Client) CreateSink(ctx context.Context, sink *Sink) (*Sink, error)
    func (c *Client) DeleteLog(ctx context.Context, logID string) error
    func (c *Client) DeleteMetric(ctx context.Context, metricID string) error
    func (c *Client) DeleteSink(ctx context.Context, sinkID string) error
    func (c *Client) Entries(ctx context.Context, opts ...EntriesOption) *EntryIterator
    func (c *Client) Logs(ctx context.Context) *LogIterator
    func (c *Client) Metric(ctx context.Context, metricID string) (*Metric, error)
    func (c *Client) Metrics(ctx context.Context) *MetricIterator
    func (c *Client) ResourceDescriptors(ctx context.Context) *ResourceDescriptorIterator
    func (c *Client) Sink(ctx context.Context, sinkID string) (*Sink, error)
    func (c *Client) Sinks(ctx context.Context) *SinkIterator
    func (c *Client) UpdateMetric(ctx context.Context, m *Metric) error
    func (c *Client) UpdateSink(ctx context.Context, sink *Sink) (*Sink, error)
type EntriesOption
    func Filter(f string) EntriesOption
    func NewestFirst() EntriesOption
    func ProjectIDs(pids []string) EntriesOption
type EntryIterator
    func (it *EntryIterator) Next() (*logging.Entry, error)
    func (it *EntryIterator) PageInfo() *iterator.PageInfo
type LogIterator
    func (it *LogIterator) Next() (string, error)
    func (it *LogIterator) PageInfo() *iterator.PageInfo
type Metric
type MetricIterator
    func (it *MetricIterator) Next() (*Metric, error)
    func (it *MetricIterator) PageInfo() *iterator.PageInfo
type ResourceDescriptorIterator
    func (it *ResourceDescriptorIterator) Next() (*mrpb.MonitoredResourceDescriptor, error)
    func (it *ResourceDescriptorIterator) PageInfo() *iterator.PageInfo
type Sink
type SinkIterator
    func (it *SinkIterator) Next() (*Sink, error)
    func (it *SinkIterator) PageInfo() *iterator.PageInfo

Package files

logadmin.go metrics.go resources.go sinks.go

type Client

Client is a Logging client. A Client is associated with a single Cloud project.

type Client struct {
    // contains filtered or unexported fields
}

func NewClient

func NewClient(ctx context.Context, projectID string, opts ...option.ClientOption) (*Client, error)

NewClient returns a new logging client associated with the provided project ID.

By default NewClient uses AdminScope. To use a different scope, call NewClient using a WithScopes option (see https://godoc.org/google.golang.org/api/option#WithScopes).

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
// Use client to manage logs, metrics and sinks.
// Close the client when finished.
if err := client.Close(); err != nil {
    // TODO: Handle error.
}

func (*Client) Close

func (c *Client) Close() error

Close closes the client.

func (*Client) CreateMetric

func (c *Client) CreateMetric(ctx context.Context, m *Metric) error

CreateMetric creates a logs-based metric.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
err = client.CreateMetric(ctx, &logadmin.Metric{
    ID:          "severe-errors",
    Description: "entries at ERROR or higher severities",
    Filter:      "severity >= ERROR",
})
if err != nil {
    // TODO: Handle error.
}

func (*Client) CreateSink

func (c *Client) CreateSink(ctx context.Context, sink *Sink) (*Sink, error)

CreateSink creates a Sink. It returns an error if the Sink already exists. Requires AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
sink, err := client.CreateSink(ctx, &logadmin.Sink{
    ID:          "severe-errors-to-gcs",
    Destination: "storage.googleapis.com/my-bucket",
    Filter:      "severity >= ERROR",
})
if err != nil {
    // TODO: Handle error.
}
fmt.Println(sink)

func (*Client) DeleteLog

func (c *Client) DeleteLog(ctx context.Context, logID string) error

DeleteLog deletes a log and all its log entries. The log will reappear if it receives new entries. logID identifies the log within the project. An example log ID is "syslog". Requires AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
err = client.DeleteLog(ctx, "my-log")
if err != nil {
    // TODO: Handle error.
}

func (*Client) DeleteMetric

func (c *Client) DeleteMetric(ctx context.Context, metricID string) error

DeleteMetric deletes a log-based metric. The provided metric ID is the metric identifier. For example, "severe_errors".

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
if err := client.DeleteMetric(ctx, "severe-errors"); err != nil {
    // TODO: Handle error.
}

func (*Client) DeleteSink

func (c *Client) DeleteSink(ctx context.Context, sinkID string) error

DeleteSink deletes a sink. The provided sinkID is the sink's identifier, such as "my-severe-errors-to-pubsub". Requires AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
if err := client.DeleteSink(ctx, "severe-errors-to-gcs"); err != nil {
    // TODO: Handle error.
}

func (*Client) Entries

func (c *Client) Entries(ctx context.Context, opts ...EntriesOption) *EntryIterator

Entries returns an EntryIterator for iterating over log entries. By default, the log entries will be restricted to those from the project passed to NewClient. This may be overridden by passing a ProjectIDs option. Requires ReadScope or AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.Entries(ctx, logadmin.Filter(`logName = "projects/my-project/logs/my-log"`))
_ = it // TODO: iterate using Next or iterator.Pager.

Example (Pagination)

Code:

package logadmin_test

import (
    "bytes"
    "flag"
    "fmt"
    "html/template"
    "log"
    "net/http"

    "cloud.google.com/go/logging"
    "cloud.google.com/go/logging/logadmin"
    "golang.org/x/net/context"
    "google.golang.org/api/iterator"
)

var (
    client    *logadmin.Client
    projectID = flag.String("project-id", "", "ID of the project to use")
)

func ExampleClient_Entries_pagination() {
    // This example demonstrates how to iterate through items a page at a time
    // even if each successive page is fetched by a different process. It is a
    // complete web server that displays pages of log entries. To run it as a
    // standalone program, rename both the package and this function to "main".
    ctx := context.Background()
    flag.Parse()
    if *projectID == "" {
        log.Fatal("-project-id missing")
    }
    var err error
    client, err = logadmin.NewClient(ctx, *projectID)
    if err != nil {
        log.Fatalf("creating logging client: %v", err)
    }

    http.HandleFunc("/entries", handleEntries)
    log.Print("listening on 8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

var pageTemplate = template.Must(template.New("").Parse(`
<table>
  {{range .Entries}}
    <tr><td>{{.}}</td></tr>
  {{end}}
</table>
{{if .Next}}
  <a href="/entries?pageToken={{.Next}}">Next Page</a>
{{end}}
`))

func handleEntries(w http.ResponseWriter, r *http.Request) {
    ctx := context.Background()
    filter := fmt.Sprintf(`logName = "projects/%s/logs/testlog"`, *projectID)
    it := client.Entries(ctx, logadmin.Filter(filter))
    var entries []*logging.Entry
    nextTok, err := iterator.NewPager(it, 5, r.URL.Query().Get("pageToken")).NextPage(&entries)
    if err != nil {
        http.Error(w, fmt.Sprintf("problem getting the next page: %v", err), http.StatusInternalServerError)
        return
    }
    data := struct {
        Entries []*logging.Entry
        Next    string
    }{
        entries,
        nextTok,
    }
    var buf bytes.Buffer
    if err := pageTemplate.Execute(&buf, data); err != nil {
        http.Error(w, fmt.Sprintf("problem executing page template: %v", err), http.StatusInternalServerError)
    }
    if _, err := buf.WriteTo(w); err != nil {
        log.Printf("writing response: %v", err)
    }
}

func (*Client) Logs

func (c *Client) Logs(ctx context.Context) *LogIterator

Logs lists the logs owned by the parent resource of the client.

func (*Client) Metric

func (c *Client) Metric(ctx context.Context, metricID string) (*Metric, error)

Metric gets a logs-based metric. The provided metric ID is the metric identifier. For example, "severe_errors". Requires ReadScope or AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
m, err := client.Metric(ctx, "severe-errors")
if err != nil {
    // TODO: Handle error.
}
fmt.Println(m)

func (*Client) Metrics

func (c *Client) Metrics(ctx context.Context) *MetricIterator

Metrics returns a MetricIterator for iterating over all Metrics in the Client's project. Requires ReadScope or AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.Metrics(ctx)
_ = it // TODO: iterate using Next or iterator.Pager.

func (*Client) ResourceDescriptors

func (c *Client) ResourceDescriptors(ctx context.Context) *ResourceDescriptorIterator

ResourceDescriptors returns a ResourceDescriptorIterator for iterating over MonitoredResourceDescriptors. Requires ReadScope or AdminScope. See https://cloud.google.com/logging/docs/api/v2/#monitored-resources for an explanation of monitored resources. See https://cloud.google.com/logging/docs/api/v2/resource-list for a list of monitored resources.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.ResourceDescriptors(ctx)
_ = it // TODO: iterate using Next or iterator.Pager.

func (*Client) Sink

func (c *Client) Sink(ctx context.Context, sinkID string) (*Sink, error)

Sink gets a sink. The provided sinkID is the sink's identifier, such as "my-severe-errors-to-pubsub". Requires ReadScope or AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
s, err := client.Sink(ctx, "severe-errors-to-gcs")
if err != nil {
    // TODO: Handle error.
}
fmt.Println(s)

func (*Client) Sinks

func (c *Client) Sinks(ctx context.Context) *SinkIterator

Sinks returns a SinkIterator for iterating over all Sinks in the Client's project. Requires ReadScope or AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.Sinks(ctx)
_ = it // TODO: iterate using Next or iterator.Pager.

func (*Client) UpdateMetric

func (c *Client) UpdateMetric(ctx context.Context, m *Metric) error

UpdateMetric creates a logs-based metric if it does not exist, or updates an existing one.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
err = client.UpdateMetric(ctx, &logadmin.Metric{
    ID:          "severe-errors",
    Description: "entries at high severities",
    Filter:      "severity > ERROR",
})
if err != nil {
    // TODO: Handle error.
}

func (*Client) UpdateSink

func (c *Client) UpdateSink(ctx context.Context, sink *Sink) (*Sink, error)

UpdateSink updates an existing Sink, or creates a new one if the Sink doesn't exist. Requires AdminScope.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
sink, err := client.UpdateSink(ctx, &logadmin.Sink{
    ID:          "severe-errors-to-gcs",
    Destination: "storage.googleapis.com/my-other-bucket",
    Filter:      "severity >= ERROR",
})
if err != nil {
    // TODO: Handle error.
}
fmt.Println(sink)

type EntriesOption

An EntriesOption is an option for listing log entries.

type EntriesOption interface {
    // contains filtered or unexported methods
}

func Filter

func Filter(f string) EntriesOption

Filter sets an advanced logs filter for listing log entries (see https://cloud.google.com/logging/docs/view/advanced_filters). The filter is compared against all log entries in the projects specified by ProjectIDs. Only entries that match the filter are retrieved. An empty filter (the default) matches all log entries.

In the filter string, log names must be written in their full form, as "projects/PROJECT-ID/logs/LOG-ID". Forward slashes in LOG-ID must be replaced by %2F before calling Filter.

Timestamps in the filter string must be written in RFC 3339 format. See the timestamp example.

Example (Timestamp)

Code:

// This example demonstrates how to list the last 24 hours of log entries.
ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
oneDayAgo := time.Now().Add(-24 * time.Hour)
t := oneDayAgo.Format(time.RFC3339) // Logging API wants timestamps in RFC 3339 format.
it := client.Entries(ctx, logadmin.Filter(fmt.Sprintf(`timestamp > "%s"`, t)))
_ = it // TODO: iterate using Next or iterator.Pager.

func NewestFirst

func NewestFirst() EntriesOption

NewestFirst causes log entries to be listed from most recent (newest) to least recent (oldest). By default, they are listed from oldest to newest.

func ProjectIDs

func ProjectIDs(pids []string) EntriesOption

ProjectIDs sets the project IDs or project numbers from which to retrieve log entries. Examples of a project ID: "my-project-1A", "1234567890".

type EntryIterator

An EntryIterator iterates over log entries.

type EntryIterator struct {
    // contains filtered or unexported fields
}

func (*EntryIterator) Next

func (it *EntryIterator) Next() (*logging.Entry, error)

Next returns the next result. Its second return value is iterator.Done (https://godoc.org/google.golang.org/api/iterator) if there are no more results. Once Next returns Done, all subsequent calls will return Done.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.Entries(ctx)
for {
    entry, err := it.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        // TODO: Handle error.
    }
    fmt.Println(entry)
}

func (*EntryIterator) PageInfo

func (it *EntryIterator) PageInfo() *iterator.PageInfo

PageInfo supports pagination. See https://godoc.org/google.golang.org/api/iterator package for details.

type LogIterator

A LogIterator iterates over logs.

type LogIterator struct {
    // contains filtered or unexported fields
}

func (*LogIterator) Next

func (it *LogIterator) Next() (string, error)

Next returns the next result. Its second return value is iterator.Done (https://godoc.org/google.golang.org/api/iterator) if there are no more results. Once Next returns Done, all subsequent calls will return Done.

func (*LogIterator) PageInfo

func (it *LogIterator) PageInfo() *iterator.PageInfo

PageInfo supports pagination. See https://godoc.org/google.golang.org/api/iterator package for details.

type Metric

Metric describes a logs-based metric. The value of the metric is the number of log entries that match a logs filter.

Metrics are a feature of Stackdriver Monitoring. See https://cloud.google.com/monitoring/api/v3/metrics for more about them.

type Metric struct {
    // ID is a client-assigned metric identifier. Example:
    // "severe_errors".  Metric identifiers are limited to 1000
    // characters and can include only the following characters: A-Z,
    // a-z, 0-9, and the special characters _-.,+!*',()%/\.  The
    // forward-slash character (/) denotes a hierarchy of name pieces,
    // and it cannot be the first character of the name.
    ID string

    // Description describes this metric. It is used in documentation.
    Description string

    // Filter is an advanced logs filter (see
    // https://cloud.google.com/logging/docs/view/advanced_filters).
    // Example: "logName:syslog AND severity>=ERROR".
    Filter string
}

type MetricIterator

A MetricIterator iterates over Metrics.

type MetricIterator struct {
    // contains filtered or unexported fields
}

func (*MetricIterator) Next

func (it *MetricIterator) Next() (*Metric, error)

Next returns the next result. Its second return value is Done if there are no more results. Once Next returns Done, all subsequent calls will return Done.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.Metrics(ctx)
for {
    metric, err := it.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        // TODO: Handle error.
    }
    fmt.Println(metric)
}

func (*MetricIterator) PageInfo

func (it *MetricIterator) PageInfo() *iterator.PageInfo

PageInfo supports pagination. See the google.golang.org/api/iterator package for details.

type ResourceDescriptorIterator

ResourceDescriptorIterator is an iterator over MonitoredResourceDescriptors.

type ResourceDescriptorIterator struct {
    // contains filtered or unexported fields
}

func (*ResourceDescriptorIterator) Next

func (it *ResourceDescriptorIterator) Next() (*mrpb.MonitoredResourceDescriptor, error)

Next returns the next result. Its second return value is Done if there are no more results. Once Next returns Done, all subsequent calls will return Done.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.ResourceDescriptors(ctx)
for {
    rdesc, err := it.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        // TODO: Handle error.
    }
    fmt.Println(rdesc)
}

func (*ResourceDescriptorIterator) PageInfo

func (it *ResourceDescriptorIterator) PageInfo() *iterator.PageInfo

PageInfo supports pagination. See the google.golang.org/api/iterator package for details.

type Sink

Sink describes a sink used to export log entries outside Stackdriver Logging. Incoming log entries matching a filter are exported to a destination (a Cloud Storage bucket, BigQuery dataset or Cloud Pub/Sub topic).

For more information, see https://cloud.google.com/logging/docs/export/using_exported_logs. (The Sinks in this package are what the documentation refers to as "project sinks".)

type Sink struct {
    // ID is a client-assigned sink identifier. Example:
    // "my-severe-errors-to-pubsub".
    // Sink identifiers are limited to 1000 characters
    // and can include only the following characters: A-Z, a-z,
    // 0-9, and the special characters "_-.".
    ID string

    // Destination is the export destination. See
    // https://cloud.google.com/logging/docs/api/tasks/exporting-logs.
    // Examples: "storage.googleapis.com/a-bucket",
    // "bigquery.googleapis.com/projects/a-project-id/datasets/a-dataset".
    Destination string

    // Filter optionally specifies an advanced logs filter (see
    // https://cloud.google.com/logging/docs/view/advanced_filters) that
    // defines the log entries to be exported. Example: "logName:syslog AND
    // severity>=ERROR". If omitted, all entries are returned.
    Filter string
}

type SinkIterator

A SinkIterator iterates over Sinks.

type SinkIterator struct {
    // contains filtered or unexported fields
}

func (*SinkIterator) Next

func (it *SinkIterator) Next() (*Sink, error)

Next returns the next result. Its second return value is Done if there are no more results. Once Next returns Done, all subsequent calls will return Done.

Example

Code:

ctx := context.Background()
client, err := logadmin.NewClient(ctx, "my-project")
if err != nil {
    // TODO: Handle error.
}
it := client.Sinks(ctx)
for {
    sink, err := it.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        // TODO: Handle error.
    }
    fmt.Println(sink)
}

func (*SinkIterator) PageInfo

func (it *SinkIterator) PageInfo() *iterator.PageInfo

PageInfo supports pagination. See the google.golang.org/api/iterator package for details.