diff --git a/cmd/root.go b/cmd/root.go index c33b230a..449be025 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -2,12 +2,12 @@ package cmd import ( "fmt" + "log/slog" "os" "strings" "github.com/mikefarah/yq/v4/pkg/yqlib" "github.com/spf13/cobra" - logging "gopkg.in/op/go-logging.v1" ) type runeValue rune @@ -68,30 +68,21 @@ yq -P -oy sample.json }, PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { cmd.SetOut(cmd.OutOrStdout()) - level := logging.WARNING - stringFormat := `[%{level}] %{color}%{time:15:04:05}%{color:reset} %{message}` // when NO_COLOR environment variable presents and not an empty string the coloured output should be disabled; // refer to no-color.org forceNoColor = forceNoColor || os.Getenv("NO_COLOR") != "" - if verbose && forceNoColor { - level = logging.DEBUG - stringFormat = `[%{level:5.5s}] %{time:15:04:05} %{shortfile:-33s} %{shortfunc:-25s} %{message}` - } else if verbose { - level = logging.DEBUG - stringFormat = `[%{level:5.5s}] %{color}%{time:15:04:05}%{color:bold} %{shortfile:-33s} %{shortfunc:-25s}%{color:reset} %{message}` - } else if forceNoColor { - stringFormat = `[%{level}] %{time:15:04:05} %{message}` + level := slog.LevelWarn + if verbose { + level = slog.LevelDebug } - var format = logging.MustStringFormatter(stringFormat) - var backend = logging.AddModuleLevel( - logging.NewBackendFormatter(logging.NewLogBackend(os.Stderr, "", 0), format)) + yqlib.GetLogger().SetLevel(level) + opts := &slog.HandlerOptions{Level: level, AddSource: verbose} + handler := slog.NewTextHandler(os.Stderr, opts) + yqlib.GetLogger().SetSlogger(slog.New(handler)) - backend.SetLevel(level, "") - - logging.SetBackend(backend) yqlib.InitExpressionParser() return nil diff --git a/cmd/utils.go b/cmd/utils.go index 9dfd4e4d..553fc994 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -3,12 +3,12 @@ package cmd import ( "fmt" "io" + "log/slog" "os" "strings" "github.com/mikefarah/yq/v4/pkg/yqlib" "github.com/spf13/cobra" - "gopkg.in/op/go-logging.v1" ) func isAutomaticOutputFormat() bool { @@ -104,8 +104,8 @@ func configureFormats(args []string) error { return err } - yqlib.GetLogger().Debug("Using input format %v", inputFormat) - yqlib.GetLogger().Debug("Using output format %v", outputFormat) + yqlib.GetLogger().Debugf("Using input format %v", inputFormat) + yqlib.GetLogger().Debugf("Using output format %v", outputFormat) return nil } @@ -117,7 +117,7 @@ func configureInputFormat(inputFilename string) error { _, err := yqlib.FormatFromString(inputFormat) if err != nil { // unknown file type, default to yaml - yqlib.GetLogger().Debug("Unknown file format extension '%v', defaulting to yaml", inputFormat) + yqlib.GetLogger().Debugf("Unknown file format extension '%v', defaulting to yaml", inputFormat) inputFormat = "yaml" if isAutomaticOutputFormat() { outputFormat = "yaml" @@ -132,7 +132,7 @@ func configureInputFormat(inputFilename string) error { // outputFormat = yqlib.FormatStringFromFilename(inputFilename) if inputFilename != "-" { - yqlib.GetLogger().Warning("yq default output is now 'auto' (based on the filename extension). Normally yq would output '%v', but for backwards compatibility 'yaml' has been set. Please use -oy to specify yaml, or drop the -p flag.", outputFormat) + yqlib.GetLogger().Warningf("yq default output is now 'auto' (based on the filename extension). Normally yq would output '%v', but for backwards compatibility 'yaml' has been set. Please use -oy to specify yaml, or drop the -p flag.", outputFormat) } outputFormat = "yaml" } @@ -235,7 +235,7 @@ func maybeFile(str string) bool { yqlib.GetLogger().Debugf("checking '%v' is a file", str) stat, err := os.Stat(str) // #nosec result := err == nil && !stat.IsDir() - if yqlib.GetLogger().IsEnabledFor(logging.DEBUG) { + if yqlib.GetLogger().IsEnabledFor(slog.LevelDebug) { if err != nil { yqlib.GetLogger().Debugf("error: %v", err) } else { @@ -280,7 +280,7 @@ func processArgs(originalArgs []string) (string, []string, error) { if expressionFile == "" && maybeFirstArgIsAFile && strings.HasSuffix(args[0], ".yq") { // lets check if an expression file was given - yqlib.GetLogger().Debug("Assuming arg %v is an expression file", args[0]) + yqlib.GetLogger().Debugf("Assuming arg %v is an expression file", args[0]) expressionFile = args[0] args = args[1:] } @@ -296,7 +296,7 @@ func processArgs(originalArgs []string) (string, []string, error) { yqlib.GetLogger().Debugf("processed args: %v", args) if expression == "" && len(args) > 0 && args[0] != "-" && !maybeFile(args[0]) { - yqlib.GetLogger().Debug("assuming expression is '%v'", args[0]) + yqlib.GetLogger().Debugf("assuming expression is '%v'", args[0]) expression = args[0] args = args[1:] } diff --git a/go.mod b/go.mod index 13b0d631..e032f4ae 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,6 @@ require ( golang.org/x/mod v0.34.0 golang.org/x/net v0.52.0 golang.org/x/text v0.35.0 - gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 ) require ( diff --git a/go.sum b/go.sum index b566a353..74b06308 100644 --- a/go.sum +++ b/go.sum @@ -84,7 +84,5 @@ golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= -gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/yqlib/candidate_node.go b/pkg/yqlib/candidate_node.go index 974898dc..92321527 100644 --- a/pkg/yqlib/candidate_node.go +++ b/pkg/yqlib/candidate_node.go @@ -323,11 +323,11 @@ func (n *CandidateNode) guessTagFromCustomType() string { dataBucket, errorReading := parseSnippet(n.Value) if errorReading != nil { - log.Debug("guessTagFromCustomType: could not guess underlying tag type %v", errorReading) + log.Debugf("guessTagFromCustomType: could not guess underlying tag type %v", errorReading) return n.Tag } guessedTag := dataBucket.Tag - log.Info("im guessing the tag %v is a %v", n.Tag, guessedTag) + log.Infof("im guessing the tag %v is a %v", n.Tag, guessedTag) return guessedTag } @@ -445,7 +445,7 @@ func (n *CandidateNode) UpdateFrom(other *CandidateNode, prefs assignPreferences } func (n *CandidateNode) UpdateAttributesFrom(other *CandidateNode, prefs assignPreferences) { - log.Debug("UpdateAttributesFrom: n: %v other: %v", NodeToString(n), NodeToString(other)) + log.Debugf("UpdateAttributesFrom: n: %v other: %v", NodeToString(n), NodeToString(other)) if n.Kind != other.Kind { // clear out the contents when switching to a different type // e.g. map to array diff --git a/pkg/yqlib/candidate_node_goccy_yaml.go b/pkg/yqlib/candidate_node_goccy_yaml.go index 3e861b83..f8874286 100644 --- a/pkg/yqlib/candidate_node_goccy_yaml.go +++ b/pkg/yqlib/candidate_node_goccy_yaml.go @@ -36,13 +36,13 @@ func (o *CandidateNode) UnmarshalGoccyYAML(node ast.Node, cm yaml.CommentMap, an switch commentMapComment.Position { case yaml.CommentHeadPosition: o.HeadComment = comment.String() - log.Debug("its a head comment %v", comment.String()) + log.Debugf("its a head comment %v", comment.String()) case yaml.CommentLinePosition: o.LineComment = comment.String() - log.Debug("its a line comment %v", comment.String()) + log.Debugf("its a line comment %v", comment.String()) case yaml.CommentFootPosition: o.FootComment = comment.String() - log.Debug("its a foot comment %v", comment.String()) + log.Debugf("its a foot comment %v", comment.String()) } } } @@ -93,8 +93,8 @@ func (o *CandidateNode) UnmarshalGoccyYAML(node ast.Node, cm yaml.CommentMap, an log.Debugf("folded Type %v", astLiteral.Start.Type) o.Style = FoldedStyle } - log.Debug("start value: %v ", node.(*ast.LiteralNode).Start.Value) - log.Debug("start value: %v ", node.(*ast.LiteralNode).Start.Type) + log.Debugf("start value: %v ", node.(*ast.LiteralNode).Start.Value) + log.Debugf("start value: %v ", node.(*ast.LiteralNode).Start.Type) // TODO: here I could put the original value with line breaks // to solve the multiline > problem o.Value = astLiteral.Value.Value @@ -187,7 +187,7 @@ func (o *CandidateNode) UnmarshalGoccyYAML(node ast.Node, cm yaml.CommentMap, an } func (o *CandidateNode) goccyProcessMappingValueNode(mappingEntry *ast.MappingValueNode, cm yaml.CommentMap, anchorMap map[string]*CandidateNode) error { - log.Debug("UnmarshalYAML MAP KEY entry %v", mappingEntry.Key) + log.Debugf("UnmarshalYAML MAP KEY entry %v", mappingEntry.Key) // AddKeyValueFirst because it clones the nodes, and we want to have the real refs when Unmarshalling // particularly for the anchorMap @@ -197,7 +197,7 @@ func (o *CandidateNode) goccyProcessMappingValueNode(mappingEntry *ast.MappingVa return err } - log.Debug("UnmarshalYAML MAP VALUE entry %v", mappingEntry.Value) + log.Debugf("UnmarshalYAML MAP VALUE entry %v", mappingEntry.Value) if err := valueNode.UnmarshalGoccyYAML(mappingEntry.Value, cm, anchorMap); err != nil { return err } diff --git a/pkg/yqlib/candidate_node_json.go b/pkg/yqlib/candidate_node_json.go index f1ce277e..04ad24b8 100644 --- a/pkg/yqlib/candidate_node_json.go +++ b/pkg/yqlib/candidate_node_json.go @@ -120,7 +120,7 @@ func (o *CandidateNode) UnmarshalJSON(data []byte) error { if err != nil { return err } - log.Debug("UnmarshalJSON - scalar is %v", scalar) + log.Debugf("UnmarshalJSON - scalar is %v", scalar) return o.setScalarFromJson(scalar) diff --git a/pkg/yqlib/candidate_node_yaml.go b/pkg/yqlib/candidate_node_yaml.go index 03b137a4..416f307e 100644 --- a/pkg/yqlib/candidate_node_yaml.go +++ b/pkg/yqlib/candidate_node_yaml.go @@ -55,13 +55,13 @@ func (o *CandidateNode) copyFromYamlNode(node *yaml.Node, anchorMap map[string]* if o.Anchor != "" { anchorMap[o.Anchor] = o - log.Debug("set anchor %v to %v", o.Anchor, NodeToString(o)) + log.Debugf("set anchor %v to %v", o.Anchor, NodeToString(o)) } // its a single alias if node.Alias != nil && node.Alias.Anchor != "" { o.Alias = anchorMap[node.Alias.Anchor] - log.Debug("set alias to %v", NodeToString(anchorMap[node.Alias.Anchor])) + log.Debugf("set alias to %v", NodeToString(anchorMap[node.Alias.Anchor])) } o.HeadComment = node.HeadComment o.LineComment = node.LineComment @@ -106,7 +106,7 @@ func (o *CandidateNode) UnmarshalYAML(node *yaml.Node, anchorMap map[string]*Can log.Debugf("UnmarshalYAML %v", node.Tag) switch node.Kind { case yaml.AliasNode: - log.Debug("UnmarshalYAML - alias from yaml: %v", o.Tag) + log.Debugf("UnmarshalYAML - alias from yaml: %v", o.Tag) o.Kind = AliasNode o.copyFromYamlNode(node, anchorMap) return nil @@ -176,15 +176,15 @@ func (o *CandidateNode) UnmarshalYAML(node *yaml.Node, anchorMap map[string]*Can } func (o *CandidateNode) MarshalYAML() (*yaml.Node, error) { - log.Debug("MarshalYAML to yaml: %v", o.Tag) + log.Debugf("MarshalYAML to yaml: %v", o.Tag) switch o.Kind { case AliasNode: - log.Debug("MarshalYAML - alias to yaml: %v", o.Tag) + log.Debugf("MarshalYAML - alias to yaml: %v", o.Tag) target := &yaml.Node{Kind: yaml.AliasNode} o.copyToYamlNode(target) return target, nil case ScalarNode: - log.Debug("MarshalYAML - scalar: %v", o.Value) + log.Debugf("MarshalYAML - scalar: %v", o.Value) target := &yaml.Node{Kind: yaml.ScalarNode} o.copyToYamlNode(target) return target, nil diff --git a/pkg/yqlib/chown_linux.go b/pkg/yqlib/chown_linux.go index 174a7948..a8e3a78c 100644 --- a/pkg/yqlib/chown_linux.go +++ b/pkg/yqlib/chown_linux.go @@ -18,7 +18,7 @@ func changeOwner(info fs.FileInfo, file *os.File) error { // this happens with snap confinement // not really a big issue as users can chown // the file themselves if required. - log.Info("Skipping chown: %v", err) + log.Infof("Skipping chown: %v", err) } } return nil diff --git a/pkg/yqlib/context.go b/pkg/yqlib/context.go index aaa80da6..eddf1364 100644 --- a/pkg/yqlib/context.go +++ b/pkg/yqlib/context.go @@ -3,9 +3,8 @@ package yqlib import ( "container/list" "fmt" + "log/slog" "time" - - logging "gopkg.in/op/go-logging.v1" ) type Context struct { @@ -75,7 +74,7 @@ func (n *Context) ChildContext(results *list.List) Context { } func (n *Context) ToString() string { - if !log.IsEnabledFor(logging.DEBUG) { + if !log.IsEnabledFor(slog.LevelDebug) { return "" } result := fmt.Sprintf("Context\nDontAutoCreate: %v\n", n.DontAutoCreate) diff --git a/pkg/yqlib/context_test.go b/pkg/yqlib/context_test.go index 0dadd2fd..1998a0fb 100644 --- a/pkg/yqlib/context_test.go +++ b/pkg/yqlib/context_test.go @@ -2,11 +2,11 @@ package yqlib import ( "container/list" + "log/slog" "strings" "testing" "github.com/mikefarah/yq/v4/test" - logging "gopkg.in/op/go-logging.v1" ) func TestChildContext(t *testing.T) { @@ -155,8 +155,8 @@ func TestToString(t *testing.T) { test.AssertResultComplex(t, "", result) // Test with debug logging enabled - logging.SetLevel(logging.DEBUG, "") - defer logging.SetLevel(logging.INFO, "") // Reset to default + GetLogger().SetLevel(slog.LevelDebug) + defer GetLogger().SetLevel(slog.LevelWarn) // Reset to default result2 := context.ToString() test.AssertResultComplex(t, true, len(result2) > 0) diff --git a/pkg/yqlib/data_tree_navigator.go b/pkg/yqlib/data_tree_navigator.go index 05e1cba4..8dda12fd 100644 --- a/pkg/yqlib/data_tree_navigator.go +++ b/pkg/yqlib/data_tree_navigator.go @@ -2,8 +2,7 @@ package yqlib import ( "fmt" - - logging "gopkg.in/op/go-logging.v1" + "log/slog" ) type DataTreeNavigator interface { @@ -55,7 +54,7 @@ func (d *dataTreeNavigator) GetMatchingNodes(context Context, expressionNode *Ex return context, nil } log.Debugf("Processing Op: %v", expressionNode.Operation.toString()) - if log.IsEnabledFor(logging.DEBUG) { + if log.IsEnabledFor(slog.LevelDebug) { for el := context.MatchingNodes.Front(); el != nil; el = el.Next() { log.Debug(NodeToString(el.Value.(*CandidateNode))) } diff --git a/pkg/yqlib/decoder_test.go b/pkg/yqlib/decoder_test.go index d71e8e8c..1b2a333e 100644 --- a/pkg/yqlib/decoder_test.go +++ b/pkg/yqlib/decoder_test.go @@ -68,7 +68,7 @@ func mustProcessFormatScenario(s formatScenario, decoder Decoder, encoder Encode result, err := processFormatScenario(s, decoder, encoder) if err != nil { - log.Error("Bad scenario %v: %w", s.description, err) + log.Errorf("Bad scenario %v: %v", s.description, err) return fmt.Sprintf("Bad scenario %v: %v", s.description, err.Error()) } return result diff --git a/pkg/yqlib/decoder_toml.go b/pkg/yqlib/decoder_toml.go index dac720bb..cf3a9d31 100644 --- a/pkg/yqlib/decoder_toml.go +++ b/pkg/yqlib/decoder_toml.go @@ -106,7 +106,7 @@ func (dec *tomlDecoder) decodeKeyValuesIntoMap(rootMap *CandidateNode, tomlNode for dec.parser.NextExpression() { nextItem := dec.parser.Expression() - log.Debug("decodeKeyValuesIntoMap -- next exp, its a %v", nextItem.Kind) + log.Debugf("decodeKeyValuesIntoMap -- next exp, its a %v", nextItem.Kind) switch nextItem.Kind { case toml.KeyValue: @@ -118,7 +118,7 @@ func (dec *tomlDecoder) decodeKeyValuesIntoMap(rootMap *CandidateNode, tomlNode dec.pendingComments = append(dec.pendingComments, string(nextItem.Data)) default: // run out of key values - log.Debug("done in decodeKeyValuesIntoMap, gota a %v", nextItem.Kind) + log.Debugf("done in decodeKeyValuesIntoMap, gota a %v", nextItem.Kind) return true, nil } } @@ -271,7 +271,7 @@ func (dec *tomlDecoder) Decode() (*CandidateNode, error) { currentNode := dec.parser.Expression() - log.Debug("currentNode: %v ", currentNode.Kind) + log.Debugf("currentNode: %v ", currentNode.Kind) runAgainstCurrentExp, err = dec.processTopLevelNode(currentNode) if err != nil { return dec.rootMap, err @@ -298,7 +298,7 @@ func (dec *tomlDecoder) Decode() (*CandidateNode, error) { func (dec *tomlDecoder) processTopLevelNode(currentNode *toml.Node) (bool, error) { var runAgainstCurrentExp bool var err error - log.Debug("processTopLevelNode: Going to process %v state is current %v", currentNode.Kind, NodeToString(dec.rootMap)) + log.Debugf("processTopLevelNode: Going to process %v state is current %v", currentNode.Kind, NodeToString(dec.rootMap)) switch currentNode.Kind { case toml.Comment: // Collect comment to attach to next element @@ -326,7 +326,7 @@ func (dec *tomlDecoder) processTopLevelNode(currentNode *toml.Node) (bool, error runAgainstCurrentExp, err = dec.decodeKeyValuesIntoMap(dec.rootMap, currentNode) } - log.Debug("processTopLevelNode: DONE Processing state is now %v", NodeToString(dec.rootMap)) + log.Debugf("processTopLevelNode: DONE Processing state is now %v", NodeToString(dec.rootMap)) return runAgainstCurrentExp, err } @@ -334,7 +334,7 @@ func (dec *tomlDecoder) processTable(currentNode *toml.Node) (bool, error) { log.Debug("Enter processTable") child := currentNode.Child() fullPath := dec.getFullPath(child) - log.Debug("fullpath: %v", fullPath) + log.Debugf("fullpath: %v", fullPath) c := Context{} c = c.SingleChildContext(dec.rootMap) @@ -402,7 +402,7 @@ func (dec *tomlDecoder) processTable(currentNode *toml.Node) (bool, error) { } func (dec *tomlDecoder) arrayAppend(context Context, path []interface{}, rhsNode *CandidateNode) error { - log.Debug("arrayAppend to path: %v,%v", path, NodeToString(rhsNode)) + log.Debugf("arrayAppend to path: %v,%v", path, NodeToString(rhsNode)) rhsCandidateNode := &CandidateNode{ Kind: SequenceNode, Tag: "!!seq", @@ -427,7 +427,7 @@ func (dec *tomlDecoder) processArrayTable(currentNode *toml.Node) (bool, error) log.Debug("Enter processArrayTable") child := currentNode.Child() fullPath := dec.getFullPath(child) - log.Debug("Fullpath: %v", fullPath) + log.Debugf("Fullpath: %v", fullPath) c := Context{} c = c.SingleChildContext(dec.rootMap) diff --git a/pkg/yqlib/decoder_xml.go b/pkg/yqlib/decoder_xml.go index febf112f..841519b0 100644 --- a/pkg/yqlib/decoder_xml.go +++ b/pkg/yqlib/decoder_xml.go @@ -64,7 +64,7 @@ func (dec *xmlDecoder) processComment(c string) string { } func (dec *xmlDecoder) createMap(n *xmlNode) (*CandidateNode, error) { - log.Debug("createMap: headC: %v, lineC: %v, footC: %v", n.HeadComment, n.LineComment, n.FootComment) + log.Debugf("createMap: headC: %v, lineC: %v, footC: %v", n.HeadComment, n.LineComment, n.FootComment) yamlNode := &CandidateNode{Kind: MappingNode, Tag: "!!map"} if len(n.Data) > 0 { @@ -92,7 +92,7 @@ func (dec *xmlDecoder) createMap(n *xmlNode) (*CandidateNode, error) { log.Debugf("label=%v, i=%v, keyValuePair.FootComment: %v", label, i, keyValuePair.FootComment) labelNode.FootComment = dec.processComment(keyValuePair.FootComment) - log.Debug("len of children in %v is %v", label, len(children)) + log.Debugf("len of children in %v is %v", label, len(children)) if len(children) > 1 { valueNode, err = dec.createSequence(children) if err != nil { @@ -105,7 +105,7 @@ func (dec *xmlDecoder) createMap(n *xmlNode) (*CandidateNode, error) { if len(children[0].Children) == 0 && children[0].HeadComment != "" { if len(children[0].Data) > 0 { - log.Debug("scalar comment hack, currentlabel [%v]", labelNode.HeadComment) + log.Debugf("scalar comment hack, currentlabel [%v]", labelNode.HeadComment) labelNode.HeadComment = joinComments([]string{labelNode.HeadComment, strings.TrimSpace(children[0].HeadComment)}, "\n") children[0].HeadComment = "" } else { @@ -151,7 +151,7 @@ func (dec *xmlDecoder) convertToYamlNode(n *xmlNode) (*CandidateNode, error) { scalar := dec.createValueNodeFromData(n.Data) - log.Debug("scalar (%v), headC: %v, lineC: %v, footC: %v", scalar.Tag, n.HeadComment, n.LineComment, n.FootComment) + log.Debugf("scalar (%v), headC: %v, lineC: %v, footC: %v", scalar.Tag, n.HeadComment, n.LineComment, n.FootComment) scalar.HeadComment = dec.processComment(n.HeadComment) scalar.LineComment = dec.processComment(n.LineComment) if scalar.Tag == "!!seq" { @@ -211,17 +211,17 @@ func (n *xmlNode) AddChild(s string, c *xmlNode) { if n.Children == nil { n.Children = make([]*xmlChildrenKv, 0) } - log.Debug("looking for %s", s) + log.Debugf("looking for %s", s) // see if we can find an existing entry to add to for _, childEntry := range n.Children { if childEntry.K == s { - log.Debug("found it, appending an entry%s", s) + log.Debugf("found it, appending an entry%s", s) childEntry.V = append(childEntry.V, c) - log.Debug("yay len of children in %v is %v", s, len(childEntry.V)) + log.Debugf("yay len of children in %v is %v", s, len(childEntry.V)) return } } - log.Debug("not there, making a new one %s", s) + log.Debugf("not there, making a new one %s", s) n.Children = append(n.Children, &xmlChildrenKv{K: s, V: []*xmlNode{c}}) } @@ -267,7 +267,7 @@ func (dec *xmlDecoder) decodeXML(root *xmlNode) error { switch se := t.(type) { case xml.StartElement: - log.Debug("start element %v", se.Name.Local) + log.Debugf("start element %v", se.Name.Local) elem.state = "started" // Build new a new current element and link it to its parent var label = se.Name.Local @@ -302,14 +302,14 @@ func (dec *xmlDecoder) decodeXML(root *xmlNode) error { if len(newBit) > 0 { elem.n.Data = append(elem.n.Data, newBit) elem.state = "chardata" - log.Debug("chardata [%v] for %v", elem.n.Data, elem.label) + log.Debugf("chardata [%v] for %v", elem.n.Data, elem.label) } case xml.EndElement: if elem == nil { log.Debug("no element, probably bad xml") continue } - log.Debug("end element %v", elem.label) + log.Debugf("end element %v", elem.label) elem.state = "finished" // And add it to its parent list if elem.parent != nil { @@ -326,10 +326,10 @@ func (dec *xmlDecoder) decodeXML(root *xmlNode) error { applyFootComment(elem, commentStr) case "chardata": - log.Debug("got a line comment for (%v) %v: [%v]", elem.state, elem.label, commentStr) + log.Debugf("got a line comment for (%v) %v: [%v]", elem.state, elem.label, commentStr) elem.n.LineComment = joinComments([]string{elem.n.LineComment, commentStr}, " ") default: - log.Debug("got a head comment for (%v) %v: [%v]", elem.state, elem.label, commentStr) + log.Debugf("got a head comment for (%v) %v: [%v]", elem.state, elem.label, commentStr) elem.n.HeadComment = joinComments([]string{elem.n.HeadComment, commentStr}, " ") } @@ -354,7 +354,7 @@ func applyFootComment(elem *element, commentStr string) { if len(elem.n.Children) > 0 { lastChildIndex := len(elem.n.Children) - 1 childKv := elem.n.Children[lastChildIndex] - log.Debug("got a foot comment, putting on last child for %v: [%v]", childKv.K, commentStr) + log.Debugf("got a foot comment, putting on last child for %v: [%v]", childKv.K, commentStr) // if it's an array of scalars, put the foot comment on the scalar itself if len(childKv.V) > 0 && len(childKv.V[0].Children) == 0 { nodeToUpdate := childKv.V[len(childKv.V)-1] @@ -363,7 +363,7 @@ func applyFootComment(elem *element, commentStr string) { childKv.FootComment = joinComments([]string{elem.n.FootComment, commentStr}, " ") } } else { - log.Debug("got a foot comment for %v: [%v]", elem.label, commentStr) + log.Debugf("got a foot comment for %v: [%v]", elem.label, commentStr) elem.n.FootComment = joinComments([]string{elem.n.FootComment, commentStr}, " ") } } diff --git a/pkg/yqlib/encoder_kyaml.go b/pkg/yqlib/encoder_kyaml.go index 86f9ebf8..a4492e27 100644 --- a/pkg/yqlib/encoder_kyaml.go +++ b/pkg/yqlib/encoder_kyaml.go @@ -32,7 +32,7 @@ func (ke *kyamlEncoder) PrintLeadingContent(writer io.Writer, content string) er } func (ke *kyamlEncoder) Encode(writer io.Writer, node *CandidateNode) error { - log.Debug("encoderKYaml - going to print %v", NodeToString(node)) + log.Debugf("encoderKYaml - going to print %v", NodeToString(node)) if node.Kind == ScalarNode && ke.prefs.UnwrapScalar { return writeString(writer, node.Value+"\n") } diff --git a/pkg/yqlib/encoder_xml.go b/pkg/yqlib/encoder_xml.go index d33e2acc..652d574f 100644 --- a/pkg/yqlib/encoder_xml.go +++ b/pkg/yqlib/encoder_xml.go @@ -59,7 +59,7 @@ func (e *xmlEncoder) Encode(writer io.Writer, node *CandidateNode) error { return err } if _, err := e.writer.Write([]byte("\n")); err != nil { - log.Warning("Unable to write newline, skipping: %w", err) + log.Warningf("Unable to write newline, skipping: %v", err) } } } @@ -131,7 +131,7 @@ func (e *xmlEncoder) encodeTopLevelMap(encoder *xml.Encoder, node *CandidateNode return err } if _, err := e.writer.Write([]byte("\n")); err != nil { - log.Warning("Unable to write newline, skipping: %w", err) + log.Warningf("Unable to write newline, skipping: %v", err) } } else if key.Value == e.prefs.DirectiveName { var directive xml.Directive = []byte(value.Value) @@ -139,7 +139,7 @@ func (e *xmlEncoder) encodeTopLevelMap(encoder *xml.Encoder, node *CandidateNode return err } if _, err := e.writer.Write([]byte("\n")); err != nil { - log.Warning("Unable to write newline, skipping: %w", err) + log.Warningf("Unable to write newline, skipping: %v", err) } } else { diff --git a/pkg/yqlib/encoder_yaml.go b/pkg/yqlib/encoder_yaml.go index 6c7869fa..b46ae444 100644 --- a/pkg/yqlib/encoder_yaml.go +++ b/pkg/yqlib/encoder_yaml.go @@ -29,7 +29,7 @@ func (ye *yamlEncoder) PrintLeadingContent(writer io.Writer, content string) err } func (ye *yamlEncoder) Encode(writer io.Writer, node *CandidateNode) error { - log.Debug("encoderYaml - going to print %v", NodeToString(node)) + log.Debugf("encoderYaml - going to print %v", NodeToString(node)) // Detect line ending style from LeadingContent lineEnding := "\n" if strings.Contains(node.LeadingContent, "\r\n") { diff --git a/pkg/yqlib/expression_parser.go b/pkg/yqlib/expression_parser.go index eaa5b1c1..54e28721 100644 --- a/pkg/yqlib/expression_parser.go +++ b/pkg/yqlib/expression_parser.go @@ -26,7 +26,7 @@ func newExpressionParser() ExpressionParserInterface { } func (p *expressionParserImpl) ParseExpression(expression string) (*ExpressionNode, error) { - log.Debug("Parsing expression: [%v]", expression) + log.Debugf("Parsing expression: [%v]", expression) tokens, err := p.pathTokeniser.Tokenise(expression) if err != nil { return nil, err diff --git a/pkg/yqlib/expression_postfix.go b/pkg/yqlib/expression_postfix.go index 6972999b..c5101548 100644 --- a/pkg/yqlib/expression_postfix.go +++ b/pkg/yqlib/expression_postfix.go @@ -3,8 +3,7 @@ package yqlib import ( "errors" "fmt" - - logging "gopkg.in/op/go-logging.v1" + "log/slog" ) type expressionPostFixer interface { @@ -134,7 +133,7 @@ func (p *expressionPostFixerImpl) ConvertToPostfix(infixTokens []*token) ([]*Ope return nil, fmt.Errorf("bad expression - probably missing close bracket on %v", opStack[len(opStack)-1].toString(false)) } - if log.IsEnabledFor(logging.DEBUG) { + if log.IsEnabledFor(slog.LevelDebug) { log.Debugf("PostFix Result:") for _, currentToken := range result { log.Debugf("> %v", currentToken.toString()) diff --git a/pkg/yqlib/file_utils.go b/pkg/yqlib/file_utils.go index a3f06698..72d435cf 100644 --- a/pkg/yqlib/file_utils.go +++ b/pkg/yqlib/file_utils.go @@ -30,7 +30,7 @@ func tryRenameFile(from string, to string) error { } func tryRemoveTempFile(filename string) { - log.Debug("Removing temp file: %v", filename) + log.Debugf("Removing temp file: %v", filename) removeErr := os.Remove(filename) if removeErr != nil { log.Errorf("Failed to remove temp file: %v", filename) @@ -68,8 +68,7 @@ func SafelyCloseReader(reader io.Reader) { func safelyCloseFile(file *os.File) { err := file.Close() if err != nil { - log.Error("Error closing file!") - log.Error(err.Error()) + log.Errorf("Error closing file %v: %v", file.Name(), err) } } diff --git a/pkg/yqlib/front_matter.go b/pkg/yqlib/front_matter.go index e192f443..4c56aabd 100644 --- a/pkg/yqlib/front_matter.go +++ b/pkg/yqlib/front_matter.go @@ -58,7 +58,7 @@ func (f *frontMatterHandlerImpl) Split() error { return err } f.yamlFrontMatterFilename = yamlTempFile.Name() - log.Debug("yamlTempFile: %v", yamlTempFile.Name()) + log.Debugf("yamlTempFile: %v", yamlTempFile.Name()) lineCount := 0 diff --git a/pkg/yqlib/lexer.go b/pkg/yqlib/lexer.go index 509d07b0..04212fce 100644 --- a/pkg/yqlib/lexer.go +++ b/pkg/yqlib/lexer.go @@ -105,7 +105,7 @@ func handleToken(tokens []*token, index int, postProcessedTokens []*token) (toke skipNextToken = false currentToken := tokens[index] - log.Debug("processing %v", currentToken.toString(true)) + log.Debugf("processing %v", currentToken.toString(true)) if currentToken.TokenType == traverseArrayCollect { // `.[exp]`` works by creating a traversal array of [self, exp] and piping that into the traverse array operator diff --git a/pkg/yqlib/lexer_participle.go b/pkg/yqlib/lexer_participle.go index b99f6e37..866b736c 100644 --- a/pkg/yqlib/lexer_participle.go +++ b/pkg/yqlib/lexer_participle.go @@ -283,7 +283,7 @@ func pathToken(wrapped bool) yqAction { if wrapped { value = unwrap(value) } - log.Debug("PathToken %v", value) + log.Debugf("PathToken %v", value) op := &Operation{OperationType: traversePathOpType, Value: value, StringValue: value, Preferences: prefs} return &token{TokenType: operationToken, Operation: op, CheckForPostTraverse: true}, nil } @@ -336,7 +336,7 @@ func flattenWithDepth() yqAction { func assignAllCommentsOp(updateAssign bool) yqAction { return func(rawToken lexer.Token) (*token, error) { - log.Debug("assignAllCommentsOp %v", rawToken.Value) + log.Debugf("assignAllCommentsOp %v", rawToken.Value) value := rawToken.Value op := &Operation{ OperationType: assignCommentOpType, @@ -351,7 +351,7 @@ func assignAllCommentsOp(updateAssign bool) yqAction { func assignOpToken(updateAssign bool) yqAction { return func(rawToken lexer.Token) (*token, error) { - log.Debug("assignOpToken %v", rawToken.Value) + log.Debugf("assignOpToken %v", rawToken.Value) value := rawToken.Value prefs := assignPreferences{DontOverWriteAnchor: true} if strings.Contains(value, "c") { @@ -376,9 +376,9 @@ func nullValue() yqAction { func stringValue() yqAction { return func(rawToken lexer.Token) (*token, error) { - log.Debug("rawTokenvalue: %v", rawToken.Value) + log.Debugf("rawTokenvalue: %v", rawToken.Value) value := unwrap(rawToken.Value) - log.Debug("unwrapped: %v", value) + log.Debugf("unwrapped: %v", value) value = processEscapeCharacters(value) return &token{TokenType: operationToken, Operation: &Operation{ OperationType: stringInterpolationOpType, diff --git a/pkg/yqlib/lib.go b/pkg/yqlib/lib.go index 95dae458..b051983c 100644 --- a/pkg/yqlib/lib.go +++ b/pkg/yqlib/lib.go @@ -4,11 +4,10 @@ package yqlib import ( "container/list" "fmt" + "log/slog" "math" "strconv" "strings" - - logging "gopkg.in/op/go-logging.v1" ) var ExpressionParser ExpressionParserInterface @@ -19,12 +18,12 @@ func InitExpressionParser() { } } -var log = logging.MustGetLogger("yq-lib") +var log = newLogger() var PrettyPrintExp = `(... | (select(tag != "!!str"), select(tag == "!!str") | select(test("(?i)^(y|yes|n|no|on|off)$") | not)) ) style=""` // GetLogger returns the yq logger instance. -func GetLogger() *logging.Logger { +func GetLogger() *Logger { return log } @@ -251,7 +250,7 @@ func processEscapeCharacters(original string) string { value := result.String() if value != original { - log.Debug("processEscapeCharacters from [%v] to [%v]", original, value) + log.Debugf("processEscapeCharacters from [%v] to [%v]", original, value) } return value } @@ -274,7 +273,7 @@ func footComment(node *CandidateNode) string { // use for debugging only func NodesToString(collection *list.List) string { - if !log.IsEnabledFor(logging.DEBUG) { + if !log.IsEnabledFor(slog.LevelDebug) { return "" } @@ -286,7 +285,7 @@ func NodesToString(collection *list.List) string { } func NodeToString(node *CandidateNode) string { - if !log.IsEnabledFor(logging.DEBUG) { + if !log.IsEnabledFor(slog.LevelDebug) { return "" } if node == nil { @@ -304,7 +303,7 @@ func NodeToString(node *CandidateNode) string { } func NodeContentToString(node *CandidateNode, depth int) string { - if !log.IsEnabledFor(logging.DEBUG) { + if !log.IsEnabledFor(slog.LevelDebug) { return "" } var sb strings.Builder diff --git a/pkg/yqlib/logger.go b/pkg/yqlib/logger.go new file mode 100644 index 00000000..d0194159 --- /dev/null +++ b/pkg/yqlib/logger.go @@ -0,0 +1,77 @@ +package yqlib + +import ( + "fmt" + "log/slog" + "os" +) + +// Logger wraps log/slog providing a printf-style interface used throughout yq. +type Logger struct { + levelVar slog.LevelVar + slogger *slog.Logger +} + +func newLogger() *Logger { + l := &Logger{} + l.levelVar.Set(slog.LevelWarn) + handler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: &l.levelVar}) + l.slogger = slog.New(handler) + return l +} + +// SetLevel sets the minimum log level. +func (l *Logger) SetLevel(level slog.Level) { + l.levelVar.Set(level) +} + +// GetLevel returns the current log level. +func (l *Logger) GetLevel() slog.Level { + return l.levelVar.Level() +} + +// IsEnabledFor returns true if the given level is enabled. +func (l *Logger) IsEnabledFor(level slog.Level) bool { + return l.levelVar.Level() <= level +} + +// SetSlogger replaces the underlying slog.Logger (e.g. to configure output format). +func (l *Logger) SetSlogger(logger *slog.Logger) { + l.slogger = logger +} + +func (l *Logger) Debug(msg string) { + if l.IsEnabledFor(slog.LevelDebug) { + l.slogger.Debug(msg) + } +} + +func (l *Logger) Debugf(format string, args ...interface{}) { + if l.IsEnabledFor(slog.LevelDebug) { + l.slogger.Debug(fmt.Sprintf(format, args...)) + } +} + +func (l *Logger) Info(msg string) { + l.slogger.Info(msg) +} + +func (l *Logger) Infof(format string, args ...interface{}) { + l.slogger.Info(fmt.Sprintf(format, args...)) +} + +func (l *Logger) Warning(msg string) { + l.slogger.Warn(msg) +} + +func (l *Logger) Warningf(format string, args ...interface{}) { + l.slogger.Warn(fmt.Sprintf(format, args...)) +} + +func (l *Logger) Error(msg string) { + l.slogger.Error(msg) +} + +func (l *Logger) Errorf(format string, args ...interface{}) { + l.slogger.Error(fmt.Sprintf(format, args...)) +} diff --git a/pkg/yqlib/operation.go b/pkg/yqlib/operation.go index 5d790df1..f36054ee 100644 --- a/pkg/yqlib/operation.go +++ b/pkg/yqlib/operation.go @@ -25,7 +25,7 @@ var valueToStringFunc = func(p *Operation) string { } func createValueOperation(value interface{}, stringValue string) *Operation { - log.Debug("creating value op for string %v", stringValue) + log.Debugf("creating value op for string %v", stringValue) var node = createScalarNode(value, stringValue) return &Operation{ diff --git a/pkg/yqlib/operator_add.go b/pkg/yqlib/operator_add.go index 2d7fa8de..538b858c 100644 --- a/pkg/yqlib/operator_add.go +++ b/pkg/yqlib/operator_add.go @@ -195,9 +195,9 @@ func addMaps(target *CandidateNode, lhsC *CandidateNode, rhsC *CandidateNode) { for index := 0; index < len(rhs.Content); index = index + 2 { key := rhs.Content[index] value := rhs.Content[index+1] - log.Debug("finding %v", key.Value) + log.Debugf("finding %v", key.Value) indexInLHS := findKeyInMap(target, key) - log.Debug("indexInLhs %v", indexInLHS) + log.Debugf("indexInLhs %v", indexInLHS) if indexInLHS < 0 { // not in there, append it target.AddKeyValueChild(key, value) diff --git a/pkg/yqlib/operator_anchors_aliases.go b/pkg/yqlib/operator_anchors_aliases.go index 8dd4f84f..788469f8 100644 --- a/pkg/yqlib/operator_anchors_aliases.go +++ b/pkg/yqlib/operator_anchors_aliases.go @@ -256,7 +256,7 @@ func explodeNode(node *CandidateNode, context Context) error { node.Value = node.Alias.Value node.Alias = nil } - log.Debug("now I'm %v", NodeToString(node)) + log.Debugf("now I'm %v", NodeToString(node)) return nil case MappingNode: // //check the map has an alias in it @@ -304,7 +304,7 @@ func applyAlias(node *CandidateNode, alias *CandidateNode, aliasIndex int, newCo if alias == nil { return nil } - log.Debug("alias: %v", NodeToString(alias)) + log.Debugf("alias: %v", NodeToString(alias)) if alias.Kind != MappingNode { return fmt.Errorf("can only use merge anchors with maps (!!map) or sequences (!!seq) of maps, but got sequence containing %v", alias.Tag) } diff --git a/pkg/yqlib/operator_assign.go b/pkg/yqlib/operator_assign.go index c9ed2f5b..4edb2786 100644 --- a/pkg/yqlib/operator_assign.go +++ b/pkg/yqlib/operator_assign.go @@ -37,7 +37,7 @@ func assignUpdateOperator(d *dataTreeNavigator, context Context, expressionNode prefs := getAssignPreferences(expressionNode.Operation.Preferences) - log.Debug("assignUpdateOperator prefs: %v", prefs) + log.Debugf("assignUpdateOperator prefs: %v", prefs) if !expressionNode.Operation.UpdateAssign { // this works because we already ran against LHS with an editable context. diff --git a/pkg/yqlib/operator_booleans.go b/pkg/yqlib/operator_booleans.go index 13f50260..79347791 100644 --- a/pkg/yqlib/operator_booleans.go +++ b/pkg/yqlib/operator_booleans.go @@ -142,7 +142,7 @@ func notOperator(_ *dataTreeNavigator, context Context, _ *ExpressionNode) (Cont for el := context.MatchingNodes.Front(); el != nil; el = el.Next() { candidate := el.Value.(*CandidateNode) - log.Debug("notOperation checking %v", candidate) + log.Debugf("notOperation checking %v", candidate) truthy := isTruthyNode(candidate) result := createBooleanCandidate(candidate, !truthy) results.PushBack(result) diff --git a/pkg/yqlib/operator_datetime.go b/pkg/yqlib/operator_datetime.go index 65a1acb2..9312d14e 100644 --- a/pkg/yqlib/operator_datetime.go +++ b/pkg/yqlib/operator_datetime.go @@ -80,7 +80,7 @@ func formatDateTime(d *dataTreeNavigator, context Context, expressionNode *Expre node, errorReading := parseSnippet(formattedTimeStr) if errorReading != nil { - log.Debugf("could not parse %v - lets just leave it as a string: %w", formattedTimeStr, errorReading) + log.Debugf("could not parse %v - lets just leave it as a string: %v", formattedTimeStr, errorReading) node = &CandidateNode{ Kind: ScalarNode, Tag: "!!str", diff --git a/pkg/yqlib/operator_delete.go b/pkg/yqlib/operator_delete.go index 16ee77d5..b0a2f14e 100644 --- a/pkg/yqlib/operator_delete.go +++ b/pkg/yqlib/operator_delete.go @@ -45,7 +45,7 @@ func removeFromContext(context Context, candidate *CandidateNode) (Context, erro if nodeInContext != candidate { newResults.PushBack(nodeInContext) } else { - log.Info("Need to delete this %v", NodeToString(nodeInContext)) + log.Infof("Need to delete this %v", NodeToString(nodeInContext)) } } return context.ChildContext(newResults), nil diff --git a/pkg/yqlib/operator_encoder_decoder.go b/pkg/yqlib/operator_encoder_decoder.go index 35336573..4724fdbc 100644 --- a/pkg/yqlib/operator_encoder_decoder.go +++ b/pkg/yqlib/operator_encoder_decoder.go @@ -33,7 +33,7 @@ func configureEncoder(format *Format, indent int) Encoder { func encodeToString(candidate *CandidateNode, prefs encoderPreferences) (string, error) { var output bytes.Buffer - log.Debug("printing with indent: %v", prefs.indent) + log.Debugf("printing with indent: %v", prefs.indent) encoder := configureEncoder(prefs.format, prefs.indent) if encoder == nil { diff --git a/pkg/yqlib/operator_entries.go b/pkg/yqlib/operator_entries.go index b4ccb907..764fceca 100644 --- a/pkg/yqlib/operator_entries.go +++ b/pkg/yqlib/operator_entries.go @@ -157,10 +157,10 @@ func withEntriesOperator(d *dataTreeNavigator, context Context, expressionNode * if err != nil { return Context{}, err } - log.Debug("candidate %v", NodeToString(candidate)) - log.Debug("candidate leading content: %v", candidate.LeadingContent) + log.Debugf("candidate %v", NodeToString(candidate)) + log.Debugf("candidate leading content: %v", candidate.LeadingContent) collected.LeadingContent = candidate.LeadingContent - log.Debug("candidate FootComment: [%v]", candidate.FootComment) + log.Debugf("candidate FootComment: [%v]", candidate.FootComment) collected.HeadComment = candidate.HeadComment collected.FootComment = candidate.FootComment diff --git a/pkg/yqlib/operator_env.go b/pkg/yqlib/operator_env.go index 868ab94c..65a2510f 100644 --- a/pkg/yqlib/operator_env.go +++ b/pkg/yqlib/operator_env.go @@ -21,7 +21,7 @@ func envOperator(_ *dataTreeNavigator, context Context, expressionNode *Expressi return Context{}, fmt.Errorf("env operations have been disabled") } envName := expressionNode.Operation.CandidateNode.Value - log.Debug("EnvOperator, env name:", envName) + log.Debugf("EnvOperator, env name: %v", envName) rawValue := os.Getenv(envName) @@ -49,9 +49,9 @@ func envOperator(_ *dataTreeNavigator, context Context, expressionNode *Expressi } } - log.Debug("ENV tag", node.Tag) - log.Debug("ENV value", node.Value) - log.Debug("ENV Kind", node.Kind) + log.Debugf("ENV tag: %v", node.Tag) + log.Debugf("ENV value: %v", node.Value) + log.Debugf("ENV Kind: %v", node.Kind) return context.SingleChildContext(node), nil } @@ -78,7 +78,7 @@ func envsubstOperator(_ *dataTreeNavigator, context Context, expressionNode *Exp for el := context.MatchingNodes.Front(); el != nil; el = el.Next() { node := el.Value.(*CandidateNode) if node.Tag != "!!str" { - log.Warning("EnvSubstOperator, env name:", node.Tag, node.Value) + log.Warningf("EnvSubstOperator, env name: %v %v", node.Tag, node.Value) return Context{}, fmt.Errorf("cannot substitute with %v, can only substitute strings. Hint: Most often you'll want to use '|=' over '=' for this operation", node.Tag) } diff --git a/pkg/yqlib/operator_map.go b/pkg/yqlib/operator_map.go index bbbd8afe..0d98ddcd 100644 --- a/pkg/yqlib/operator_map.go +++ b/pkg/yqlib/operator_map.go @@ -47,8 +47,8 @@ func mapOperator(d *dataTreeNavigator, context Context, expressionNode *Expressi } result, err := d.GetMatchingNodes(splatted, expressionNode.RHS) - log.Debug("expressionNode.Rhs %v", expressionNode.RHS.Operation.OperationType) - log.Debug("result %v", result) + log.Debugf("expressionNode.Rhs %v", expressionNode.RHS.Operation.OperationType) + log.Debugf("result %v", result) if err != nil { return Context{}, err } diff --git a/pkg/yqlib/operator_slice.go b/pkg/yqlib/operator_slice.go index e4c3906c..42606134 100644 --- a/pkg/yqlib/operator_slice.go +++ b/pkg/yqlib/operator_slice.go @@ -19,8 +19,8 @@ func getSliceNumber(d *dataTreeNavigator, context Context, node *CandidateNode, func sliceArrayOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { log.Debug("slice array operator!") - log.Debug("lhs: %v", expressionNode.LHS.Operation.toString()) - log.Debug("rhs: %v", expressionNode.RHS.Operation.toString()) + log.Debugf("lhs: %v", expressionNode.LHS.Operation.toString()) + log.Debugf("rhs: %v", expressionNode.RHS.Operation.toString()) results := list.New() @@ -49,7 +49,7 @@ func sliceArrayOperator(d *dataTreeNavigator, context Context, expressionNode *E relativeSecondNumber = len(lhsNode.Content) } - log.Debug("calculateIndicesToTraverse: slice from %v to %v", relativeFirstNumber, relativeSecondNumber) + log.Debugf("calculateIndicesToTraverse: slice from %v to %v", relativeFirstNumber, relativeSecondNumber) var newResults []*CandidateNode for i := relativeFirstNumber; i < relativeSecondNumber; i++ { diff --git a/pkg/yqlib/operator_sort.go b/pkg/yqlib/operator_sort.go index 43df7818..2bcf2157 100644 --- a/pkg/yqlib/operator_sort.go +++ b/pkg/yqlib/operator_sort.go @@ -142,12 +142,12 @@ func (a sortableNodeArray) compare(lhs *CandidateNode, rhs *CandidateNode, dateT } else if isDateTime { lhsTime, err := parseDateTime(layout, lhs.Value) if err != nil { - log.Warningf("Could not parse time %v with layout %v for sort, sorting by string instead: %w", lhs.Value, layout, err) + log.Warningf("Could not parse time %v with layout %v for sort, sorting by string instead: %v", lhs.Value, layout, err) return strings.Compare(lhs.Value, rhs.Value) } rhsTime, err := parseDateTime(layout, rhs.Value) if err != nil { - log.Warningf("Could not parse time %v with layout %v for sort, sorting by string instead: %w", rhs.Value, layout, err) + log.Warningf("Could not parse time %v with layout %v for sort, sorting by string instead: %v", rhs.Value, layout, err) return strings.Compare(lhs.Value, rhs.Value) } if lhsTime.Equal(rhsTime) { diff --git a/pkg/yqlib/operator_strings.go b/pkg/yqlib/operator_strings.go index 090325cf..3ab79b0d 100644 --- a/pkg/yqlib/operator_strings.go +++ b/pkg/yqlib/operator_strings.go @@ -220,7 +220,7 @@ func getSubstituteParameters(d *dataTreeNavigator, block *ExpressionNode, contex regEx = regExNodes.MatchingNodes.Front().Value.(*CandidateNode).Value } - log.Debug("regEx %v", regEx) + log.Debugf("regEx %v", regEx) replacementNodes, err := d.GetMatchingNodes(context, block.RHS) if err != nil { @@ -318,7 +318,7 @@ func getMatches(matchPrefs matchPreferences, regEx *regexp.Regexp, value string) allIndices = [][]int{regEx.FindStringSubmatchIndex(value)} } - log.Debug("allMatches, %v", allMatches) + log.Debugf("allMatches, %v", allMatches) return allMatches, allIndices } @@ -423,7 +423,7 @@ func extractMatchArguments(d *dataTreeNavigator, context Context, expressionNode if regExNodes.MatchingNodes.Front() != nil { regExStr = regExNodes.MatchingNodes.Front().Value.(*CandidateNode).Value } - log.Debug("regEx %v", regExStr) + log.Debugf("regEx %v", regExStr) regEx, err := regexp.Compile(regExStr) return regEx, matchPrefs, err } @@ -564,7 +564,7 @@ func split(value string, spltStr string) (Kind, string, []*CandidateNode) { var contents []*CandidateNode if value != "" { - log.Debug("going to spltStr[%v]", spltStr) + log.Debugf("going to spltStr[%v]", spltStr) var newStrings = strings.Split(value, spltStr) contents = make([]*CandidateNode, len(newStrings)) diff --git a/pkg/yqlib/operator_style.go b/pkg/yqlib/operator_style.go index a65d95bd..805b0657 100644 --- a/pkg/yqlib/operator_style.go +++ b/pkg/yqlib/operator_style.go @@ -26,7 +26,7 @@ func parseStyle(customStyle string) (Style, error) { func assignStyleOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { - log.Debugf("AssignStyleOperator: %v") + log.Debugf("AssignStyleOperator") var style Style if !expressionNode.Operation.UpdateAssign { rhs, err := d.GetMatchingNodes(context.ReadOnlyClone(), expressionNode.RHS) diff --git a/pkg/yqlib/operator_tag.go b/pkg/yqlib/operator_tag.go index 81b5eaf1..b95f78f0 100644 --- a/pkg/yqlib/operator_tag.go +++ b/pkg/yqlib/operator_tag.go @@ -6,7 +6,7 @@ import ( func assignTagOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { - log.Debugf("AssignTagOperator: %v") + log.Debugf("AssignTagOperator") tag := "" if !expressionNode.Operation.UpdateAssign { diff --git a/pkg/yqlib/operator_traverse_path.go b/pkg/yqlib/operator_traverse_path.go index 28ca09a9..da981252 100644 --- a/pkg/yqlib/operator_traverse_path.go +++ b/pkg/yqlib/operator_traverse_path.go @@ -37,7 +37,7 @@ func traversePathOperator(_ *dataTreeNavigator, context Context, expressionNode } func traverse(context Context, matchingNode *CandidateNode, operation *Operation) (*list.List, error) { - log.Debug("Traversing %v", NodeToString(matchingNode)) + log.Debugf("Traversing %v", NodeToString(matchingNode)) if matchingNode.Tag == "!!null" && operation.Value != "[]" && !context.DontAutoCreate { log.Debugf("Guessing kind") @@ -55,11 +55,11 @@ func traverse(context Context, matchingNode *CandidateNode, operation *Operation switch matchingNode.Kind { case MappingNode: - log.Debug("its a map with %v entries", len(matchingNode.Content)/2) + log.Debugf("its a map with %v entries", len(matchingNode.Content)/2) return traverseMap(context, matchingNode, createStringScalarNode(operation.StringValue), operation.Preferences.(traversePreferences), false) case SequenceNode: - log.Debug("its a sequence of %v things!", len(matchingNode.Content)) + log.Debugf("its a sequence of %v things!", len(matchingNode.Content)) return traverseArray(matchingNode, operation, operation.Preferences.(traversePreferences)) case AliasNode: @@ -158,7 +158,7 @@ func traverseMapWithIndices(context Context, candidate *CandidateNode, indices [ var matchingNodeMap = list.New() for _, indexNode := range indices { - log.Debug("traverseMapWithIndices: %v", indexNode.Value) + log.Debugf("traverseMapWithIndices: %v", indexNode.Value) newNodes, err := traverseMap(context, candidate, indexNode, prefs, false) if err != nil { return nil, err @@ -183,7 +183,7 @@ func traverseArrayWithIndices(node *CandidateNode, indices []*CandidateNode, pre } for _, indexNode := range indices { - log.Debug("traverseArrayWithIndices: '%v'", indexNode.Value) + log.Debugf("traverseArrayWithIndices: '%v'", indexNode.Value) index, err := parseInt(indexNode.Value) if err != nil && prefs.OptionalTraverse { continue @@ -366,7 +366,7 @@ func traverseMergeAnchor(newMatches *orderedmap.OrderedMap, merge *CandidateNode } func traverseArray(candidate *CandidateNode, operation *Operation, prefs traversePreferences) (*list.List, error) { - log.Debug("operation Value %v", operation.Value) + log.Debugf("operation Value %v", operation.Value) indices := []*CandidateNode{{Value: operation.StringValue}} return traverseArrayWithIndices(candidate, indices, prefs) } diff --git a/pkg/yqlib/operator_union.go b/pkg/yqlib/operator_union.go index 7190504c..a9976e6e 100644 --- a/pkg/yqlib/operator_union.go +++ b/pkg/yqlib/operator_union.go @@ -4,21 +4,21 @@ import "container/list" func unionOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { log.Debug("unionOperator--") - log.Debug("unionOperator: context: %v", NodesToString(context.MatchingNodes)) + log.Debugf("unionOperator: context: %v", NodesToString(context.MatchingNodes)) lhs, err := d.GetMatchingNodes(context, expressionNode.LHS) if err != nil { return Context{}, err } - log.Debug("unionOperator: lhs: %v", NodesToString(lhs.MatchingNodes)) - log.Debug("unionOperator: rhs input: %v", NodesToString(context.MatchingNodes)) - log.Debug("unionOperator: rhs: %v", expressionNode.RHS.Operation.toString()) + log.Debugf("unionOperator: lhs: %v", NodesToString(lhs.MatchingNodes)) + log.Debugf("unionOperator: rhs input: %v", NodesToString(context.MatchingNodes)) + log.Debugf("unionOperator: rhs: %v", expressionNode.RHS.Operation.toString()) rhs, err := d.GetMatchingNodes(context, expressionNode.RHS) if err != nil { return Context{}, err } - log.Debug("unionOperator: lhs: %v", lhs.ToString()) - log.Debug("unionOperator: rhs: %v", rhs.ToString()) + log.Debugf("unionOperator: lhs: %v", lhs.ToString()) + log.Debugf("unionOperator: rhs: %v", rhs.ToString()) results := lhs.ChildContext(list.New()) for el := lhs.MatchingNodes.Front(); el != nil; el = el.Next() { @@ -33,11 +33,11 @@ func unionOperator(d *dataTreeNavigator, context Context, expressionNode *Expres for el := rhs.MatchingNodes.Front(); el != nil; el = el.Next() { node := el.Value.(*CandidateNode) - log.Debug("union operator rhs: processing %v", NodeToString(node)) + log.Debugf("union operator rhs: processing %v", NodeToString(node)) results.MatchingNodes.PushBack(node) } } - log.Debug("union operator: all together: %v", results.ToString()) + log.Debugf("union operator: all together: %v", results.ToString()) return results, nil } diff --git a/pkg/yqlib/operator_value.go b/pkg/yqlib/operator_value.go index 65438e82..e3e3cd86 100644 --- a/pkg/yqlib/operator_value.go +++ b/pkg/yqlib/operator_value.go @@ -7,7 +7,7 @@ func referenceOperator(_ *dataTreeNavigator, context Context, expressionNode *Ex } func valueOperator(_ *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { - log.Debug("value = %v", expressionNode.Operation.CandidateNode.Value) + log.Debugf("value = %v", expressionNode.Operation.CandidateNode.Value) if context.MatchingNodes.Len() == 0 { clone := expressionNode.Operation.CandidateNode.Copy() return context.SingleChildContext(clone), nil diff --git a/pkg/yqlib/operator_variables.go b/pkg/yqlib/operator_variables.go index d1c9c20f..0ba1bd62 100644 --- a/pkg/yqlib/operator_variables.go +++ b/pkg/yqlib/operator_variables.go @@ -7,7 +7,7 @@ import ( func getVariableOperator(_ *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { variableName := expressionNode.Operation.StringValue - log.Debug("getVariableOperator %v", variableName) + log.Debugf("getVariableOperator %v", variableName) result := context.GetVariable(variableName) if result == nil { result = list.New() @@ -67,7 +67,7 @@ func variableLoopSingleChild(d *dataTreeNavigator, context Context, originalExp // now we loop over lhs, set variable to each result and calculate originalExp.Rhs for el := lhs.MatchingNodes.Front(); el != nil; el = el.Next() { - log.Debug("PROCESSING VARIABLE: ", NodeToString(el.Value.(*CandidateNode))) + log.Debugf("PROCESSING VARIABLE: %v", NodeToString(el.Value.(*CandidateNode))) var variableValue = list.New() if prefs.IsReference { variableValue.PushBack(el.Value) @@ -83,7 +83,7 @@ func variableLoopSingleChild(d *dataTreeNavigator, context Context, originalExp if err != nil { return Context{}, err } - log.Debug("PROCESSING VARIABLE DONE, got back: ", rhs.MatchingNodes.Len()) + log.Debugf("PROCESSING VARIABLE DONE, got back: %v", rhs.MatchingNodes.Len()) results.PushBackList(rhs.MatchingNodes) } diff --git a/pkg/yqlib/operators.go b/pkg/yqlib/operators.go index 293ac4a3..35afe06d 100644 --- a/pkg/yqlib/operators.go +++ b/pkg/yqlib/operators.go @@ -3,9 +3,9 @@ package yqlib import ( "container/list" "fmt" + "log/slog" "github.com/jinzhu/copier" - logging "gopkg.in/op/go-logging.v1" ) type operatorHandler func(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) @@ -88,7 +88,7 @@ func resultsForRHS(d *dataTreeNavigator, context Context, lhsCandidate *Candidat for rightEl := rhs.MatchingNodes.Front(); rightEl != nil; rightEl = rightEl.Next() { rhsCandidate := rightEl.Value.(*CandidateNode) - if !log.IsEnabledFor(logging.DEBUG) { + if !log.IsEnabledFor(slog.LevelDebug) { log.Debugf("Applying lhs: %v, rhsCandidate, %v", NodeToString(lhsCandidate), NodeToString(rhsCandidate)) } resultCandidate, err := prefs.Calculation(d, context, lhsCandidate, rhsCandidate) diff --git a/pkg/yqlib/operators_test.go b/pkg/yqlib/operators_test.go index c2d3bb39..1646fb9b 100644 --- a/pkg/yqlib/operators_test.go +++ b/pkg/yqlib/operators_test.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "io/fs" + "log/slog" "os" "sort" "strings" @@ -14,7 +15,6 @@ import ( "time" "github.com/mikefarah/yq/v4/test" - logging "gopkg.in/op/go-logging.v1" ) type expressionScenario struct { @@ -38,9 +38,9 @@ var goccyTesting = false var testingDecoder = NewYamlDecoder(ConfiguredYamlPreferences) func TestMain(m *testing.M) { - logging.SetLevel(logging.WARNING, "") + GetLogger().SetLevel(slog.LevelWarn) if os.Getenv("DEBUG") == "true" { - logging.SetLevel(logging.DEBUG, "") + GetLogger().SetLevel(slog.LevelDebug) } ConfiguredYamlPreferences.ColorsEnabled = false ConfiguredJSONPreferences.ColorsEnabled = false diff --git a/pkg/yqlib/printer.go b/pkg/yqlib/printer.go index 55af72ba..19b66e18 100644 --- a/pkg/yqlib/printer.go +++ b/pkg/yqlib/printer.go @@ -70,7 +70,7 @@ func removeLastEOL(b *bytes.Buffer) { } func (p *resultsPrinter) PrintResults(matchingNodes *list.List) error { - log.Debug("PrintResults for %v matches", matchingNodes.Len()) + log.Debugf("PrintResults for %v matches", matchingNodes.Len()) if matchingNodes.Len() == 0 { log.Debug("no matching results, nothing to print") @@ -97,8 +97,8 @@ func (p *resultsPrinter) PrintResults(matchingNodes *list.List) error { for el := matchingNodes.Front(); el != nil; el = el.Next() { mappedDoc := el.Value.(*CandidateNode) - log.Debug("print sep logic: p.firstTimePrinting: %v, previousDocIndex: %v", p.firstTimePrinting, p.previousDocIndex) - log.Debug("%v", NodeToString(mappedDoc)) + log.Debugf("print sep logic: p.firstTimePrinting: %v, previousDocIndex: %v", p.firstTimePrinting, p.previousDocIndex) + log.Debugf("%v", NodeToString(mappedDoc)) writer, errorWriting := p.printerWriter.GetWriter(mappedDoc) if errorWriting != nil { return errorWriting diff --git a/pkg/yqlib/write_in_place_handler.go b/pkg/yqlib/write_in_place_handler.go index 83d42134..1ca2d5db 100644 --- a/pkg/yqlib/write_in_place_handler.go +++ b/pkg/yqlib/write_in_place_handler.go @@ -38,13 +38,13 @@ func (w *writeInPlaceHandlerImpl) CreateTempFile() (*os.File, error) { if err = changeOwner(info, file); err != nil { return nil, err } - log.Debug("WriteInPlaceHandler: writing to tempfile: %v", file.Name()) + log.Debugf("WriteInPlaceHandler: writing to tempfile: %v", file.Name()) w.tempFile = file return file, err } func (w *writeInPlaceHandlerImpl) FinishWriteInPlace(evaluatedSuccessfully bool) error { - log.Debug("Going to write in place, evaluatedSuccessfully=%v, target=%v", evaluatedSuccessfully, w.inputFilename) + log.Debugf("Going to write in place, evaluatedSuccessfully=%v, target=%v", evaluatedSuccessfully, w.inputFilename) safelyCloseFile(w.tempFile) if evaluatedSuccessfully { log.Debug("Moving temp file to target") diff --git a/project-words.txt b/project-words.txt index 9449a4e7..86c85e01 100644 --- a/project-words.txt +++ b/project-words.txt @@ -109,6 +109,7 @@ hostpath hotdog howdy incase +Infof inlinetables inplace ints