// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package vlog

type LoggingOpts interface {
	LoggingOpt()
}

type AutoFlush bool
type AlsoLogToStderr bool
type LogDir string
type LogToStderr bool
type OverridePriorConfiguration bool
type MaxStackBufSize int

// If true, logs are written to standard error as well as to files.
func (_ AlsoLogToStderr) LoggingOpt() {}

// Enable V-leveled logging at the specified level.
func (_ Level) LoggingOpt() {}

// log files will be written to this directory instead of the
// default temporary directory.
func (_ LogDir) LoggingOpt() {}

// If true, logs are written to standard error instead of to files.
func (_ LogToStderr) LoggingOpt() {}

// Set the max size (bytes) of the byte buffer to use for stack
// traces. The default max is 4M; use powers of 2 since the
// stack size will be grown exponentially until it exceeds the max.
// A min of 128K is enforced and any attempts to reduce this will
// be silently ignored.
func (_ MaxStackBufSize) LoggingOpt() {}

// The syntax of the argument is a comma-separated list of pattern=N,
// where pattern is a literal file name (minus the ".go" suffix) or
// "glob" pattern and N is a V level. For instance,
//	-gopher*=3
// sets the V level to 3 in all Go files whose names begin "gopher".
func (_ ModuleSpec) LoggingOpt() {}

// Log events at or above this severity are logged to standard
// error as well as to files.
func (_ StderrThreshold) LoggingOpt() {}

// When set to a file and line number holding a logging statement, such as
//	gopherflakes.go:234
// a stack trace will be written to the Info log whenever execution
// hits that statement. (Unlike with -vmodule, the ".go" must be
// present.)
func (_ TraceLocation) LoggingOpt() {}

// If true, enables automatic flushing of log output on every call
func (_ AutoFlush) LoggingOpt() {}

// If true, allows this call to ConfigureLogger to override a prior configuration.
func (_ OverridePriorConfiguration) LoggingOpt() {}
