// Copyright (C) 2015 The Android Open Source Project
//
// 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 log provides a hierarchical logger interface and implementations of the interface.
package log

// Logger is the interface for types that implement a hierarchical message logger.
type Logger interface {
	// Info writes an information message to the logger. These message types are intented to be used
	// for non-critial, expected events. Arguments are handled in the manner of fmt.Printf.
	Info(msg string, args ...interface{})

	// Warning writes a warning message to the logger. This is intented to be used for unexpected but
	// non-critical events. Arguments are handled in the manner of fmt.Printf.
	Warning(msg string, args ...interface{})

	// Error writes an error message to the logger. This is intented to be used for unexpected and
	// critical error events. Arguments are handled in the manner of fmt.Printf.
	Error(msg string, args ...interface{})

	// Enter creates a new logger scoped within the existing logger. This can be used to produce
	// hierarchical log messages.
	Enter(name string) Logger

	// Fork creates a new logger with the same scope as the existing logger, but with a new context
	// identifier. It is good practice to fork logs before passing to another goroutine so that
	// messages can be associated with their goroutine of execution.
	Fork() Logger

	// Flush ensures that any pending messages are written by the logger.
	Flush()
}
