* * Copyright 2018 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.
package binarylog

import (
	
	

	
	
)
Logger is the global binary logger. It can be used to get binary logger for each method.
type Logger interface {
	getMethodLogger(methodName string) *MethodLogger
}
binLogger is the global binary logger for the binary. One of this should be built at init time from the configuration (environment variable or flags). It is used to get a methodLogger for each individual method.
SetLogger sets the binarg logger. Only call this at init time.
func ( Logger) {
	binLogger = 
}
GetMethodLogger returns the methodLogger for the given methodName. methodName should be in the format of "/service/method". Each methodLogger returned by this method is a new instance. This is to generate sequence id within the call.
func ( string) *MethodLogger {
	if binLogger == nil {
		return nil
	}
	return binLogger.getMethodLogger()
}

func () {
	const  = "GRPC_BINARY_LOG_FILTER"
	 := os.Getenv()
	binLogger = NewLoggerFromConfigString()
}

Max length of header and message.
newEmptyLogger creates an empty logger. The map fields need to be filled in using the set* functions.
func () *logger {
	return &logger{}
}
Set method logger for "*".
func ( *logger) ( *methodLoggerConfig) error {
	if .all != nil {
		return fmt.Errorf("conflicting global rules found")
	}
	.all = 
	return nil
}
Set method logger for "service". New methodLogger with same service overrides the old one.
func ( *logger) ( string,  *methodLoggerConfig) error {
	if ,  := .services[];  {
		return fmt.Errorf("conflicting service rules for service %v found", )
	}
	if .services == nil {
		.services = make(map[string]*methodLoggerConfig)
	}
	.services[] = 
	return nil
}
Set method logger for "service/method". New methodLogger with same method overrides the old one.
func ( *logger) ( string,  *methodLoggerConfig) error {
	if ,  := .blacklist[];  {
		return fmt.Errorf("conflicting blacklist rules for method %v found", )
	}
	if ,  := .methods[];  {
		return fmt.Errorf("conflicting method rules for method %v found", )
	}
	if .methods == nil {
		.methods = make(map[string]*methodLoggerConfig)
	}
	.methods[] = 
	return nil
}
Set blacklist method for "-service/method".
func ( *logger) ( string) error {
	if ,  := .blacklist[];  {
		return fmt.Errorf("conflicting blacklist rules for method %v found", )
	}
	if ,  := .methods[];  {
		return fmt.Errorf("conflicting method rules for method %v found", )
	}
	if .blacklist == nil {
		.blacklist = make(map[string]struct{})
	}
	.blacklist[] = struct{}{}
	return nil
}
getMethodLogger returns the methodLogger for the given methodName. methodName should be in the format of "/service/method". Each methodLogger returned by this method is a new instance. This is to generate sequence id within the call.
func ( *logger) ( string) *MethodLogger {
	, ,  := grpcutil.ParseMethod()
	if  != nil {
		grpclogLogger.Infof("binarylogging: failed to parse %q: %v", , )
		return nil
	}
	if ,  := .methods[+"/"+];  {
		return newMethodLogger(.hdr, .msg)
	}
	if ,  := .blacklist[+"/"+];  {
		return nil
	}
	if ,  := .services[];  {
		return newMethodLogger(.hdr, .msg)
	}
	if .all == nil {
		return nil
	}
	return newMethodLogger(.all.hdr, .all.msg)