Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

core: add DisableHTMLEscape flag to json_formatter #524

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 15 additions & 2 deletions json_formatter.go
@@ -1,6 +1,7 @@
package logrus

import (
"bytes"
"encoding/json"
"fmt"
)
Expand Down Expand Up @@ -29,6 +30,9 @@ type JSONFormatter struct {
// DisableTimestamp allows disabling automatic timestamps in output
DisableTimestamp bool

// DisableHTMLEscape allows disabling html escaping in output
DisableHTMLEscape bool

// FieldMap allows users to customize the names of keys for various fields.
// As an example:
// formatter := &JSONFormatter{
Expand Down Expand Up @@ -66,9 +70,18 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()

serialized, err := json.Marshal(data)
serialized, err := f.serialize(data)
if err != nil {
return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
}
return append(serialized, '\n'), nil
return serialized, nil
}

func (f *JSONFormatter) serialize(data Fields) ([]byte, error) {
buf := new(bytes.Buffer)
enc := json.NewEncoder(buf)
enc.SetEscapeHTML(!f.DisableHTMLEscape)
err := enc.Encode(data)

return buf.Bytes(), err
}
26 changes: 26 additions & 0 deletions json_formatter_test.go
Expand Up @@ -197,3 +197,29 @@ func TestJSONEnableTimestamp(t *testing.T) {
t.Error("Timestamp not present", s)
}
}

func TestJSONDisableHTMLEscape(t *testing.T) {
formatter := &JSONFormatter{DisableHTMLEscape: true}

b, err := formatter.Format(&Entry{Message: "& < >"})
if err != nil {
t.Fatal("Unable to format entry: ", err)
}
s := string(b)
if !strings.Contains(s, "& < >") {
t.Error("Message should not be HTML escaped", s)
}
}

func TestJSONEnableHTMLEscape(t *testing.T) {
formatter := &JSONFormatter{}

b, err := formatter.Format(&Entry{Message: "& < >"})
if err != nil {
t.Fatal("Unable to format entry: ", err)
}
s := string(b)
if !(strings.Contains(s, "u0026") && strings.Contains(s, "u003e") && strings.Contains(s, "u003c")) {
t.Error("Message should be HTML escaped", s)
}
}