Skip to content

Commit 3aad001

Browse files
committed
Support all native log levels
1 parent 7a5d766 commit 3aad001

File tree

8 files changed

+117
-67
lines changed

8 files changed

+117
-67
lines changed

packages/bunyan/src/bunyan.test.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ async function testLevel(
6565
}
6666

6767
describe("Bunyan tests", () => {
68+
it("should log at the 'trace' level", async done => {
69+
return testLevel("trace", LogLevel.Trace, done);
70+
});
71+
6872
it("should log at the 'debug' level", async done => {
6973
return testLevel("debug", LogLevel.Debug, done);
7074
});
@@ -82,16 +86,18 @@ describe("Bunyan tests", () => {
8286
});
8387

8488
it("should log at the 'fatal' level", async done => {
85-
return testLevel("fatal", LogLevel.Error, done);
89+
return testLevel("fatal", LogLevel.Fatal, done);
8690
});
8791

8892
it("should log using number levels", async done => {
8993
// Fixtures
9094
const levels: LevelTest[] = [
91-
[25, LogLevel.Debug, "debug"],
92-
[35, LogLevel.Info, "info"],
93-
[45, LogLevel.Warn, "warn"],
94-
[55, LogLevel.Error, "error"]
95+
[10, LogLevel.Trace, "trace"],
96+
[20, LogLevel.Debug, "debug"],
97+
[30, LogLevel.Info, "info"],
98+
[40, LogLevel.Warn, "warn"],
99+
[50, LogLevel.Error, "error"],
100+
[60, LogLevel.Fatal, "fatal"]
95101
];
96102

97103
const logtail = new Logtail("test", {

packages/bunyan/src/bunyan.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,7 @@ export class LogtailStream extends Writable {
4747
.forEach(key => (meta[key] = log[key]));
4848

4949
// Determine the log level
50-
let level: LogLevel;
51-
52-
try {
53-
level = getLogLevel(log.level);
54-
} catch (_) {
55-
return next();
56-
}
50+
const level = getLogLevel(log.level);
5751

5852
// Log to Logtail
5953
void this._logtail.log(log.msg, level, meta, stackContextHint as StackContextHint);

packages/bunyan/src/helpers.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ export function getLogLevel(level: number | string): LogLevel {
88
// Are we dealing with a string log level?
99
if (typeof level === "string") {
1010
switch (level.toLowerCase()) {
11-
// Trace is ignored
12-
case "trace":
13-
throw new Error();
11+
// Fatal
12+
case "fatal":
13+
return LogLevel.Fatal;
1414

1515
// Error
16-
case "fatal":
1716
case "error":
1817
return LogLevel.Error;
1918

@@ -24,11 +23,16 @@ export function getLogLevel(level: number | string): LogLevel {
2423
// Debug
2524
case "debug":
2625
return LogLevel.Debug;
26+
27+
// Trace
28+
case "trace":
29+
return LogLevel.Trace;
30+
2731
}
2832
} else if (typeof level === "number") {
29-
// If level <=, consider it 'tracing' and move on
33+
// Trace
3034
if (level <= 10) {
31-
throw new Error();
35+
return LogLevel.Trace;
3236
}
3337

3438
// Debug
@@ -46,8 +50,13 @@ export function getLogLevel(level: number | string): LogLevel {
4650
return LogLevel.Warn;
4751
}
4852

49-
// Everything above this level is considered an error
50-
return LogLevel.Error;
53+
// Error
54+
if (level <= 50) {
55+
return LogLevel.Error;
56+
}
57+
58+
// Everything above this level is considered fatal
59+
return LogLevel.Fatal;
5160
}
5261

5362
// By default, return info

packages/pino/src/helpers.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import { LogLevel } from "@logtail/types";
55
* @param level number - Pino log level
66
*/
77
export function getLogLevel(level: number): LogLevel {
8-
9-
// TODO: Trace 10
8+
// Trace 10
109
if (level <= 10) {
11-
return LogLevel.Debug;
10+
return LogLevel.Trace;
1211
}
1312

1413
// Debug
@@ -26,7 +25,10 @@ export function getLogLevel(level: number): LogLevel {
2625
return LogLevel.Warn;
2726
}
2827

29-
// Everything above this level is considered an error
30-
// TODO: Fatal 60 (Error 50)
31-
return LogLevel.Error;
28+
// Error
29+
if (level <= 50) {
30+
return LogLevel.Error;
31+
}
32+
// Everything above this level is considered fatal
33+
return LogLevel.Fatal;
3234
}

packages/types/src/types.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,18 @@ export interface ILogtailOptions {
4747
}
4848

4949
export enum LogLevel {
50-
Debug = "debug",
51-
Info = "info",
50+
// core log levels - available as functions
51+
Error = "error",
5252
Warn = "warn",
53-
Error = "error"
53+
Info = "info",
54+
Debug = "debug",
55+
56+
// extra log levels - recognized when passed from logging frameworks
57+
Fatal = "fatal",
58+
Http = "http",
59+
Verbose = "verbose",
60+
Silly = "silly",
61+
Trace = "trace",
5462
}
5563

5664
/**

packages/winston/src/helpers.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import {LogLevel} from "@logtail/types";
2+
3+
/**
4+
* Return a Logtail `LogLevel` based on the Winston level
5+
* @param level string - Winston log level
6+
*/
7+
export function getLogLevel(level: string): LogLevel {
8+
switch (level.toLowerCase()) {
9+
// Fatal
10+
case "fatal":
11+
return LogLevel.Fatal;
12+
13+
// Error
14+
case "error":
15+
return LogLevel.Error;
16+
17+
// Warn
18+
case "warn":
19+
return LogLevel.Warn;
20+
21+
// Info
22+
case "info":
23+
return LogLevel.Info;
24+
25+
// Http
26+
case "http":
27+
return LogLevel.Http;
28+
29+
// Verbose
30+
case "verbose":
31+
return LogLevel.Verbose;
32+
33+
// Debug
34+
case "debug":
35+
return LogLevel.Debug;
36+
37+
// Silly
38+
case "silly":
39+
return LogLevel.Silly;
40+
41+
// Trace
42+
case "trace":
43+
return LogLevel.Trace;
44+
}
45+
// By default, return info
46+
return LogLevel.Info;
47+
}

packages/winston/src/winston.test.ts

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ const message = "Something to do with something";
1111
* Test a Winston level vs. Logtail level
1212
* @param level - Winston log level
1313
* @param logLevel LogLevel - Logtail log level
14+
* @param levels Use custom log levels
1415
*/
15-
async function testLevel(level: string, logLevel: LogLevel) {
16+
async function testLevel(level: string, logLevel: LogLevel, levels?: {[key:string]: number}) {
1617
// Sample log
1718
const log: LogEntry = {
1819
level,
@@ -31,7 +32,9 @@ async function testLevel(level: string, logLevel: LogLevel) {
3132
// Create a Winston logger
3233
const logger = winston.createLogger({
3334
level,
34-
transports: [new LogtailTransport(logtail)]
35+
transports: [new LogtailTransport(logtail)],
36+
// use custom levels if passed
37+
levels: levels || winston.config.npm.levels,
3538
});
3639

3740
// Log it!
@@ -45,29 +48,27 @@ async function testLevel(level: string, logLevel: LogLevel) {
4548
// Message should match
4649
expect(logs[0].message).toBe(log.message);
4750

48-
// Log level should be 'info'
51+
// Log level should be 'logLevel'
4952
expect(logs[0].level).toBe(logLevel);
5053
}
5154

5255
describe("Winston logging tests", () => {
53-
it("should log at the 'debug' level", async () => {
54-
return testLevel("debug", LogLevel.Debug);
55-
});
56-
57-
it("should log at the 'info' level", async () => {
58-
return testLevel("info", LogLevel.Info);
59-
});
60-
61-
it("should log at the 'warn' level", async () => {
62-
return testLevel("warn", LogLevel.Warn);
63-
});
64-
65-
it("should log at the 'error' level", async () => {
66-
return testLevel("error", LogLevel.Error);
67-
});
56+
const levels: { [key:string]: LogLevel } = {
57+
"silly": LogLevel.Silly,
58+
"debug": LogLevel.Debug,
59+
"http": LogLevel.Http,
60+
"verbose": LogLevel.Verbose,
61+
"warn": LogLevel.Warn,
62+
"error": LogLevel.Error,
63+
};
64+
for (const key in levels) {
65+
it(`should log at the '${key}' level`, async () => {
66+
return testLevel(key, levels[key]);
67+
});
68+
}
6869

6970
it("should default to 'info' level when using custom logging", async () => {
70-
return testLevel("silly", LogLevel.Info);
71+
return testLevel("xyz", LogLevel.Info, { xyz: 42 });
7172
});
7273

7374
it("should sync multiple logs", async done => {

packages/winston/src/winston.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Transport from "winston-transport";
33

44
import { Logtail } from "@logtail/node";
55
import {LogLevel, StackContextHint} from "@logtail/types";
6+
import {getLogLevel} from "./helpers";
67

78
const stackContextHint = { fileName: "node_modules/winston", methodNames: [ "log", "error", "warn", "info", "http", "verbose", "debug", "silly" ] };
89

@@ -20,25 +21,7 @@ export class LogtailTransport extends Transport {
2021
const { level, message, ...meta } = info;
2122

2223
// Determine the log level
23-
let logLevel: LogLevel;
24-
25-
switch (level) {
26-
case "debug":
27-
logLevel = LogLevel.Debug;
28-
break;
29-
30-
case "warn":
31-
logLevel = LogLevel.Warn;
32-
break;
33-
34-
case "error":
35-
logLevel = LogLevel.Error;
36-
break;
37-
38-
// All other log levels use `Info` by default
39-
default:
40-
logLevel = LogLevel.Info;
41-
}
24+
const logLevel = getLogLevel(level);
4225

4326
// Log out to Logtail
4427
void this._logtail.log(message, logLevel, meta, stackContextHint as StackContextHint);

0 commit comments

Comments
 (0)