Skip to content

Commit

Permalink
fix(logger): concat messages when formatting for json
Browse files Browse the repository at this point in the history
  • Loading branch information
eysi09 committed Aug 29, 2019
1 parent 431e8b4 commit 92dcb93
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 17 deletions.
6 changes: 4 additions & 2 deletions garden-service/src/logger/renderers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,10 +197,12 @@ export function cleanWhitespace(str) {
return str.replace(/\s+/g, " ")
}

export function formatForJSON(entry: LogEntry): JsonLogEntry {
// TODO: Include individual message states with timestamp
export function formatForJson(entry: LogEntry): JsonLogEntry {
const { data } = entry
const { section } = entry.getMessageState()
const metadata = entry.getMetadata()
const { msg, section } = entry.getMessageState()
const msg = chainMessages(entry.getMessageStates() || [])
return {
msg: cleanForJSON(msg),
data,
Expand Down
4 changes: 2 additions & 2 deletions garden-service/src/logger/writers/json-terminal-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { LogLevel } from "../log-node"
import { LogEntry, LogEntryMetadata } from "../log-entry"
import { Logger } from "../logger"
import { Writer } from "./base"
import { formatForJSON } from "../renderers"
import { formatForJson } from "../renderers"

export interface JsonLogEntry {
msg: string,
Expand All @@ -26,7 +26,7 @@ export class JsonTerminalWriter extends Writer {
render(entry: LogEntry, logger: Logger): string | null {
const level = this.level || logger.level
if (level >= entry.level) {
const jsonEntry = formatForJSON(entry)
const jsonEntry = formatForJson(entry)
const empty = !(jsonEntry.msg || jsonEntry.data)
return empty ? null : JSON.stringify(jsonEntry)
}
Expand Down
20 changes: 10 additions & 10 deletions garden-service/test/unit/src/logger/log-entry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ describe("LogEntry", () => {
}
it("should update entry state", () => {
const timestamp = freezeTime().valueOf()
const taskMetaData: TaskMetadata = {
const taskMetadata: TaskMetadata = {
type: "a",
key: "a",
status: "active",
Expand All @@ -88,7 +88,7 @@ describe("LogEntry", () => {
section: "caesar",
symbol: "info",
status: "done",
metadata: { task: taskMetaData },
metadata: { task: taskMetadata },
})

expect(entry.getMessageStates()).to.eql([{
Expand All @@ -100,7 +100,7 @@ describe("LogEntry", () => {
append: undefined,
timestamp,
}])
expect(entry.getMetadata()).to.eql({ task: taskMetaData })
expect(entry.getMetadata()).to.eql({ task: taskMetadata })
})
it("should overwrite previous values", () => {
const timestamp = freezeTime().valueOf()
Expand Down Expand Up @@ -176,27 +176,27 @@ describe("LogEntry", () => {
})
it("should update the metadata property", () => {
const timestamp = freezeTime().valueOf()
const taskMetaDataA: TaskMetadata = {
const taskMetadataA: TaskMetadata = {
type: "a",
key: "a",
status: "active",
uid: "1",
versionString: "123",
}
const taskMetaDataB: TaskMetadata = {
...taskMetaDataA,
const taskMetadataB: TaskMetadata = {
...taskMetadataA,
status: "error",
}
const entry = logger.placeholder()
entry.setState({ metadata: { task: taskMetaDataA } })
expect(entry.getMetadata()).to.eql({ task: taskMetaDataA })
entry.setState({ metadata: { task: taskMetadataA } })
expect(entry.getMetadata()).to.eql({ task: taskMetadataA })
// Message states should not change
expect(entry.getMessageStates()).to.eql([
{ ...emptyState, timestamp },
])

entry.setState({ metadata: { task: taskMetaDataB } })
expect(entry.getMetadata()).to.eql({ task: taskMetaDataB })
entry.setState({ metadata: { task: taskMetadataB } })
expect(entry.getMetadata()).to.eql({ task: taskMetadataB })
expect(entry.getMessageStates()).to.eql([
{ ...emptyState, timestamp },
{ ...emptyState, timestamp },
Expand Down
49 changes: 49 additions & 0 deletions garden-service/test/unit/src/logger/renderers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ import {
formatForTerminal,
chainMessages,
renderError,
formatForJson,
} from "../../../../src/logger/renderers"
import { GardenError } from "../../../../src/exceptions"
import dedent = require("dedent")
import { TaskMetadata } from "../../../../src/logger/log-entry"

const logger = getLogger()

Expand Down Expand Up @@ -108,4 +110,51 @@ describe("renderers", () => {
expect(formatForTerminal(entry)).to.equal("")
})
})
describe("formatForJson", () => {
it("should return a JSON representation of a log entry", () => {
const taskMetadata: TaskMetadata = {
type: "a",
key: "a",
status: "active",
uid: "1",
versionString: "123",
}
const entry = logger.info({
msg: "hello",
emoji: "haircut",
symbol: "info",
status: "done",
section: "c",
data: { foo: "bar" },
metadata: { task: taskMetadata },
})
expect(formatForJson(entry)).to.eql({
msg: "hello",
section: "c",
data: { foo: "bar" },
metadata: { task: taskMetadata },
})
})
it("should append messages if applicable", () => {
const entry = logger.info({
msg: "hello",
})
entry.setState({ msg: "world", append: true })
expect(formatForJson(entry)).to.eql({
msg: "hello - world",
section: "",
data: undefined,
metadata: undefined,
})
})
it("should handle undefined messages", () => {
const entry = logger.placeholder()
expect(formatForJson(entry)).to.eql({
msg: "",
section: "",
data: undefined,
metadata: undefined,
})
})
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { expect } from "chai"
import { LogLevel } from "../../../../../src/logger/log-node"
import { JsonTerminalWriter } from "../../../../../src/logger/writers/json-terminal-writer"
import { getLogger } from "../../../../../src/logger/logger"
import { formatForJSON } from "../../../../../src/logger/renderers"

const logger = getLogger()

Expand All @@ -17,7 +16,14 @@ describe("JsonTerminalWriter", () => {
const writer = new JsonTerminalWriter()
const entry = logger.info("hello logger")
const out = writer.render(entry, logger)
expect(out).to.eql(JSON.stringify(formatForJSON(entry)))
expect(out).to.eql('{"msg":"hello logger","section":""}')
})
it("should chain messages with 'append' set to true", () => {
const writer = new JsonTerminalWriter()
const entry = logger.info("hello logger")
entry.setState({ msg: "hello again", append: true })
const out = writer.render(entry, logger)
expect(out).to.eql('{"msg":"hello logger - hello again","section":""}')
})
it("should return null if message is an empty string", () => {
const writer = new JsonTerminalWriter()
Expand All @@ -41,7 +47,7 @@ describe("JsonTerminalWriter", () => {
const writer = new JsonTerminalWriter({ level: LogLevel.verbose })
const entry = logger.verbose("cormorant")
const out = writer.render(entry, logger)
expect(out).to.eql(JSON.stringify(formatForJSON(entry)))
expect(out).to.eql('{"msg":"cormorant","section":""}')
})
})
})

0 comments on commit 92dcb93

Please sign in to comment.