Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions go/extractor/cli/go-autobuilder/go-autobuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,8 @@ func installDependenciesAndBuild() {
}

func main() {
util.SetLogLevel()

if len(os.Args) == 1 {
installDependenciesAndBuild()
} else if len(os.Args) == 2 && os.Args[1] == "--identify-environment" {
Expand Down
1 change: 1 addition & 0 deletions go/extractor/cli/go-extractor/BUILD.bazel

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions go/extractor/cli/go-extractor/go-extractor.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (

"github.com/github/codeql-go/extractor"
"github.com/github/codeql-go/extractor/diagnostics"
"github.com/github/codeql-go/extractor/util"
)

var cpuprofile, memprofile string
Expand Down Expand Up @@ -96,6 +97,8 @@ func parseFlags(args []string, mimic bool, extractTests bool) ([]string, []strin
}

func main() {
util.SetLogLevel()

extractTestsDefault := os.Getenv("CODEQL_EXTRACTOR_GO_OPTION_EXTRACT_TESTS") == "true"
buildFlags, patterns, extractTests := parseFlags(os.Args[1:], false, extractTestsDefault)

Expand Down
2 changes: 2 additions & 0 deletions go/extractor/util/BUILD.bazel

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

45 changes: 45 additions & 0 deletions go/extractor/util/logging.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package util

import (
"log/slog"
"os"
"strings"
)

// Mirrors the verbosity definitions in the CodeQL CLI, which are passed to us
// in the `CODEQL_VERBOSITY` environment variable.
type Verbosity string

const (
// Only print error messages.
Errors Verbosity = "errors"
// Print warnings and error messages.
Warnings Verbosity = "warnings"
// Default verbosity.
Progress Verbosity = "progress"
// More details of normal operations.
Details Verbosity = "progress+"
// Debug level set by e.g. the CodeQL Action.
Spammy Verbosity = "progress++"
// The most detailed.
Spammier Verbosity = "progress+++"
)

func parseLogLevel(value string) slog.Level {
value = strings.ToLower(value)
if strings.HasPrefix(value, string(Details)) {
return slog.LevelDebug
} else if value == string(Errors) {
return slog.LevelError
} else if value == string(Warnings) {
return slog.LevelWarn
} else {
// Default
return slog.LevelInfo
}
}

// Sets the log level for the default `slog` logger, based on `CODEQL_VERBOSITY`.
func SetLogLevel() {
slog.SetLogLoggerLevel(parseLogLevel(os.Getenv("CODEQL_VERBOSITY")))
}
33 changes: 33 additions & 0 deletions go/extractor/util/logging_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package util

import (
"log/slog"
"strings"
"testing"
)

func assertLogLevel(t *testing.T, value string, level slog.Level) {
actual := parseLogLevel(value)
if actual != level {
t.Errorf("Expected %s to parse as %s, but got %s", value, level, actual)
}
}

func TestParseLogLevel(t *testing.T) {
// Known verbosity levels.
assertLogLevel(t, string(Errors), slog.LevelError)
assertLogLevel(t, string(Warnings), slog.LevelWarn)
assertLogLevel(t, string(Progress), slog.LevelInfo)
assertLogLevel(t, string(Details), slog.LevelDebug)
assertLogLevel(t, string(Spammy), slog.LevelDebug)
assertLogLevel(t, string(Spammier), slog.LevelDebug)

// Ignore case
assertLogLevel(t, strings.ToUpper(string(Spammier)), slog.LevelDebug)
assertLogLevel(t, strings.ToUpper(string(Errors)), slog.LevelError)

// Other values default to LevelInfo
assertLogLevel(t, "", slog.LevelInfo)
assertLogLevel(t, "unknown", slog.LevelInfo)
assertLogLevel(t, "none", slog.LevelInfo)
}