| /* |
| * |
| * Copyright 2020 gRPC authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| |
| // Package binarylog implementation binary logging as defined in |
| // https://github.com/grpc/proposal/blob/master/A16-binary-logging.md. |
| // |
| // Notice: All APIs in this package are experimental. |
| package binarylog |
| |
| import ( |
| "fmt" |
| "io/ioutil" |
| |
| pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" |
| iblog "google.golang.org/grpc/internal/binarylog" |
| ) |
| |
| // SetSink sets the destination for the binary log entries. |
| // |
| // NOTE: this function must only be called during initialization time (i.e. in |
| // an init() function), and is not thread-safe. |
| func SetSink(s Sink) { |
| if iblog.DefaultSink != nil { |
| iblog.DefaultSink.Close() |
| } |
| iblog.DefaultSink = s |
| } |
| |
| // Sink represents the destination for the binary log entries. |
| type Sink interface { |
| // Write marshals the log entry and writes it to the destination. The format |
| // is not specified, but should have sufficient information to rebuild the |
| // entry. Some options are: proto bytes, or proto json. |
| // |
| // Note this function needs to be thread-safe. |
| Write(*pb.GrpcLogEntry) error |
| // Close closes this sink and cleans up resources (e.g. the flushing |
| // goroutine). |
| Close() error |
| } |
| |
| // NewTempFileSink creates a temp file and returns a Sink that writes to this |
| // file. |
| func NewTempFileSink() (Sink, error) { |
| // Two other options to replace this function: |
| // 1. take filename as input. |
| // 2. export NewBufferedSink(). |
| tempFile, err := ioutil.TempFile("/tmp", "grpcgo_binarylog_*.txt") |
| if err != nil { |
| return nil, fmt.Errorf("failed to create temp file: %v", err) |
| } |
| return iblog.NewBufferedSink(tempFile), nil |
| } |