Skip to content

Commit 0ccc052

Browse files
authored
Auto detect log format (#1228)
Change the default log format from 'plaintext' to 'autodetect'. Our processor will automatically try to detect the correct log format, which should create a better experience than the default being plaintext. Part of appsignal/integration-guide#174
1 parent 5ea051e commit 0ccc052

7 files changed

Lines changed: 65 additions & 47 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
bump: patch
3+
type: change
4+
---
5+
6+
Detect the log format automatically. We now detect if a log line is in the JSON, Logfmt, or plaintext format. No further config needed when calling our logger, like so:
7+
8+
```javascript
9+
const logger = Appsignal.logger("app");
10+
logger.info("message");
11+
```

src/__tests__/logger.test.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,19 @@ describe("BaseLogger", () => {
5252
).toEqual(6)
5353
})
5454

55-
it("defaults to a plaintext logger format", () => {
56-
expect(logger.format).toEqual(0)
55+
it("defaults to the autodetect logger format", () => {
56+
expect(logger.format).toEqual(3)
5757
expect(client.internalLogger.warn).not.toHaveBeenCalled()
5858
})
5959

60-
it("sets a plaintext format level when the format is unknown and logs a warning", () => {
60+
it("sets the autodetect format level when the format is unknown and logs a warning", () => {
6161
logger = new BaseLogger(
6262
client,
6363
"groupname",
6464
"trace" as LoggerLevel,
6565
"bacon" as LoggerFormat
6666
)
67-
expect(logger.format).toEqual(0)
67+
expect(logger.format).toEqual(3)
6868
expect(client.internalLogger.warn).toHaveBeenCalledWith(
6969
expect.stringContaining(`"bacon"`)
7070
)
@@ -80,6 +80,9 @@ describe("BaseLogger", () => {
8080
expect(new BaseLogger(client, "groupname", "trace", "json").format).toEqual(
8181
2
8282
)
83+
expect(
84+
new BaseLogger(client, "groupname", "trace", "autodetect").format
85+
).toEqual(3)
8386
})
8487

8588
it("logs to the extension if at or above the logger level", () => {
@@ -96,28 +99,28 @@ describe("BaseLogger", () => {
9699
expect(client.extension.log).toHaveBeenCalledWith(
97100
"groupname",
98101
3,
99-
0,
102+
3,
100103
"info message",
101104
attributes
102105
)
103106
expect(client.extension.log).toHaveBeenCalledWith(
104107
"groupname",
105108
4,
106-
0,
109+
3,
107110
"log message",
108111
attributes
109112
)
110113
expect(client.extension.log).toHaveBeenCalledWith(
111114
"groupname",
112115
5,
113-
0,
116+
3,
114117
"warn message",
115118
attributes
116119
)
117120
expect(client.extension.log).toHaveBeenCalledWith(
118121
"groupname",
119122
6,
120-
0,
123+
3,
121124
"error message",
122125
attributes
123126
)

src/__tests__/winston_transport.test.ts

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ describe("BaseLogger", () => {
3535
expect(client.extension.log).toHaveBeenCalledWith(
3636
"groupname",
3737
3,
38-
0,
38+
3,
3939
"some data and some more data",
4040
{ foo: 123, bar: 456 }
4141
)
@@ -47,7 +47,7 @@ describe("BaseLogger", () => {
4747
expect(client.extension.log).toHaveBeenCalledWith(
4848
"childgroup",
4949
3,
50-
0,
50+
3,
5151
"child logger message",
5252
{ child: "foo", argument: 123 }
5353
)
@@ -62,7 +62,7 @@ describe("BaseLogger", () => {
6262
expect(client.extension.log).toHaveBeenCalledWith(
6363
"groupname",
6464
3,
65-
0,
65+
3,
6666
"no nested keys",
6767
{ argument: 123 }
6868
)
@@ -73,7 +73,7 @@ describe("BaseLogger", () => {
7373
expect(client.extension.log).toHaveBeenCalledWith(
7474
"groupname",
7575
3,
76-
0,
76+
3,
7777
"no arrays",
7878
{ argument: 123 }
7979
)
@@ -89,7 +89,7 @@ describe("BaseLogger", () => {
8989
expect(client.extension.log).toHaveBeenCalledWith(
9090
"groupname",
9191
3,
92-
0,
92+
3,
9393
"no color for me",
9494
{ argument: 123 }
9595
)
@@ -104,7 +104,7 @@ describe("BaseLogger", () => {
104104
expect(client.extension.log).toHaveBeenCalledWith(
105105
"groupname",
106106
3,
107-
0,
107+
3,
108108
"no timestamp for me",
109109
{ argument: 123 }
110110
)
@@ -118,7 +118,7 @@ describe("BaseLogger", () => {
118118
expect(client.extension.log).toHaveBeenCalledWith(
119119
"groupname",
120120
3,
121-
0,
121+
3,
122122
"info message",
123123
{}
124124
)
@@ -140,7 +140,7 @@ describe("BaseLogger", () => {
140140
expect(client.extension.log).toHaveBeenCalledWith(
141141
"groupname",
142142
1,
143-
0,
143+
3,
144144
"silly message",
145145
{}
146146
)
@@ -159,7 +159,7 @@ describe("BaseLogger", () => {
159159
expect(client.extension.log).toHaveBeenCalledWith(
160160
"groupname",
161161
3,
162-
0,
162+
3,
163163
"foobar message",
164164
{}
165165
)
@@ -188,35 +188,35 @@ describe("BaseLogger", () => {
188188
expect(client.extension.log).toHaveBeenCalledWith(
189189
"groupname",
190190
1,
191-
0,
191+
3,
192192
"trace message",
193193
{}
194194
)
195195
expect(client.extension.log).toHaveBeenCalledWith(
196196
"groupname",
197197
2,
198-
0,
198+
3,
199199
"debug message",
200200
{}
201201
)
202202
expect(client.extension.log).toHaveBeenCalledWith(
203203
"groupname",
204204
3,
205-
0,
205+
3,
206206
"info message",
207207
{}
208208
)
209209
expect(client.extension.log).toHaveBeenCalledWith(
210210
"groupname",
211211
5,
212-
0,
212+
3,
213213
"warn message",
214214
{}
215215
)
216216
expect(client.extension.log).toHaveBeenCalledWith(
217217
"groupname",
218218
6,
219-
0,
219+
3,
220220
"error message",
221221
{}
222222
)
@@ -240,49 +240,49 @@ describe("BaseLogger", () => {
240240
expect(client.extension.log).toHaveBeenCalledWith(
241241
"groupname",
242242
1,
243-
0,
243+
3,
244244
"silly message",
245245
{}
246246
)
247247
expect(client.extension.log).toHaveBeenCalledWith(
248248
"groupname",
249249
2,
250-
0,
250+
3,
251251
"debug message",
252252
{}
253253
)
254254
expect(client.extension.log).toHaveBeenCalledWith(
255255
"groupname",
256256
2,
257-
0,
257+
3,
258258
"verbose message",
259259
{}
260260
)
261261
expect(client.extension.log).toHaveBeenCalledWith(
262262
"groupname",
263263
3,
264-
0,
264+
3,
265265
"http message",
266266
{}
267267
)
268268
expect(client.extension.log).toHaveBeenCalledWith(
269269
"groupname",
270270
3,
271-
0,
271+
3,
272272
"http message",
273273
{}
274274
)
275275
expect(client.extension.log).toHaveBeenCalledWith(
276276
"groupname",
277277
5,
278-
0,
278+
3,
279279
"warn message",
280280
{}
281281
)
282282
expect(client.extension.log).toHaveBeenCalledWith(
283283
"groupname",
284284
6,
285-
0,
285+
3,
286286
"error message",
287287
{}
288288
)
@@ -308,56 +308,56 @@ describe("BaseLogger", () => {
308308
expect(client.extension.log).toHaveBeenCalledWith(
309309
"groupname",
310310
9,
311-
0,
311+
3,
312312
"emerg message",
313313
{}
314314
)
315315
expect(client.extension.log).toHaveBeenCalledWith(
316316
"groupname",
317317
8,
318-
0,
318+
3,
319319
"alert message",
320320
{}
321321
)
322322
expect(client.extension.log).toHaveBeenCalledWith(
323323
"groupname",
324324
7,
325-
0,
325+
3,
326326
"crit message",
327327
{}
328328
)
329329
expect(client.extension.log).toHaveBeenCalledWith(
330330
"groupname",
331331
6,
332-
0,
332+
3,
333333
"error message",
334334
{}
335335
)
336336
expect(client.extension.log).toHaveBeenCalledWith(
337337
"groupname",
338338
5,
339-
0,
339+
3,
340340
"warning message",
341341
{}
342342
)
343343
expect(client.extension.log).toHaveBeenCalledWith(
344344
"groupname",
345345
4,
346-
0,
346+
3,
347347
"notice message",
348348
{}
349349
)
350350
expect(client.extension.log).toHaveBeenCalledWith(
351351
"groupname",
352352
3,
353-
0,
353+
3,
354354
"info message",
355355
{}
356356
)
357357
expect(client.extension.log).toHaveBeenCalledWith(
358358
"groupname",
359359
2,
360-
0,
360+
3,
361361
"debug message",
362362
{}
363363
)

src/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export class Client {
144144
static logger(
145145
group: string,
146146
level: LoggerLevel = "info",
147-
format: LoggerFormat = "plaintext"
147+
format: LoggerFormat = "autodetect"
148148
): Logger {
149149
if (this.client) {
150150
return this.client.logger(group, level, format)

src/logger.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ function severity(level: LoggerLevel) {
1919
return LOGGER_LEVEL_SEVERITY[level] ?? UNKNOWN_SEVERITY
2020
}
2121

22-
export type LoggerFormat = "plaintext" | "logfmt" | "json"
22+
export type LoggerFormat = "plaintext" | "logfmt" | "json" | "autodetect"
2323

2424
export const LOGGER_FORMAT: Record<LoggerFormat, number> = {
2525
plaintext: 0,
2626
logfmt: 1,
27-
json: 2
27+
json: 2,
28+
autodetect: 3
2829
}
2930

3031
const UNKNOWN_FORMAT = -1
@@ -52,7 +53,7 @@ export class BaseLogger implements Logger {
5253
client: Client,
5354
group: string,
5455
level: LoggerLevel = "info",
55-
format: LoggerFormat = "plaintext"
56+
format: LoggerFormat = "autodetect"
5657
) {
5758
if (typeof group != "string") {
5859
throw new TypeError(
@@ -75,10 +76,10 @@ export class BaseLogger implements Logger {
7576

7677
if (this.format == UNKNOWN_FORMAT) {
7778
this.#client.internalLogger.warn(
78-
`Logger format must be "plaintext", "logfmt", or "json", ` +
79-
`but "${format}" was given. Logger format set to "plaintext".`
79+
`Logger format must be "plaintext", "logfmt", "json", or "autodetect", ` +
80+
`but "${format}" was given. Logger format set to "autodetect".`
8081
)
81-
this.format = 0
82+
this.format = 3
8283
}
8384
}
8485

src/pino_transport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async function sendLogs(extension: Extension, group: string, data: LogData) {
3030
extension.log(
3131
group,
3232
data.severity,
33-
LOGGER_FORMAT.plaintext,
33+
LOGGER_FORMAT.autodetect,
3434
data.message,
3535
data.attributes
3636
)

src/winston_transport.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import Transport, { TransportStreamOptions } from "winston-transport"
22
import { Client } from "./client"
3-
import { LOGGER_LEVEL_SEVERITY as RUST_LOGGER_LEVEL_SECURITY } from "./logger"
3+
import {
4+
LOGGER_LEVEL_SEVERITY as RUST_LOGGER_LEVEL_SECURITY,
5+
LOGGER_FORMAT
6+
} from "./logger"
47

58
const NPM_LOGGER_LEVEL_SEVERITY = {
69
error: 6,
@@ -76,7 +79,7 @@ export class WinstonTransport extends Transport {
7679
client.extension.log(
7780
group || this.#group,
7881
levelSeverity,
79-
0,
82+
LOGGER_FORMAT.autodetect,
8083
message,
8184
attributes
8285
)

0 commit comments

Comments
 (0)