opentofu/log.go
Fatih Arslan 0090c063e8 log: support for user defined log levels
This PR brings support for better log level handling. Terraform logs
are already written in the form which can be understood by the module
https://github.com/hashicorp/logutils .

The TF_LOG environment variable now accepts a log level. Users can pass
levels in the form of "info", "Info" or "INFO" If an invalid log level is
passed, we print a warning but still continue, for backward compatibility
with the old TF_LOG=1 style.
2015-10-11 10:29:00 -07:00

67 lines
1.4 KiB
Go

package main
import (
"io"
"log"
"os"
"strings"
"github.com/hashicorp/logutils"
)
// These are the environmental variables that determine if we log, and if
// we log whether or not the log should go to a file.
const (
EnvLog = "TF_LOG" // Set to True
EnvLogFile = "TF_LOG_PATH" // Set to a file
)
var validLevels = []logutils.LogLevel{"TRACE", "DEBUG", "INFO", "WARN", "ERROR"}
// logOutput determines where we should send logs (if anywhere) and the log level.
func logOutput() (logOutput io.Writer, err error) {
logOutput = nil
envLevel := os.Getenv(EnvLog)
if envLevel == "" {
return
}
logOutput = os.Stderr
if logPath := os.Getenv(EnvLogFile); logPath != "" {
var err error
logOutput, err = os.Create(logPath)
if err != nil {
return nil, err
}
}
// This was the default since the beginning
logLevel := logutils.LogLevel("TRACE")
if isValidLogLevel(envLevel) {
// allow following for better ux: info, Info or INFO
logLevel = logutils.LogLevel(strings.ToUpper(envLevel))
} else {
log.Printf("[WARN] Invalid log level: %q. Defaulting to level: TRACE. Valid levels are: %+v",
envLevel, validLevels)
}
logOutput = &logutils.LevelFilter{
Levels: validLevels,
MinLevel: logLevel,
Writer: logOutput,
}
return
}
func isValidLogLevel(level string) bool {
for _, l := range validLevels {
if strings.ToUpper(level) == string(l) {
return true
}
}
return false
}