Skip to content

Commit 2334867

Browse files
committed
Add tests for logger names
1 parent e75b7a2 commit 2334867

File tree

4 files changed

+114
-8
lines changed

4 files changed

+114
-8
lines changed

docs/README.md

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,17 @@ In order to run a native ES module in Node.js, you have to do two things:
6161
2) For now, start with `--experimental-specifier-resolution=node`
6262

6363
Example `package.json`
64-
```json
64+
```json5
6565
{
6666
"name": "NAME",
6767
"version": "1.0.0",
6868
"main": "index.js",
69-
"type": "module", // <-- here
69+
// here:
70+
"type": "module",
7071
"scripts": {
7172
"build": "tsc -p .",
72-
"start": "node --enable-source-maps --experimental-specifier-resolution=node index.js" // <-- and here
73+
// and here:
74+
"start": "node --enable-source-maps --experimental-specifier-resolution=node index.js"
7375
},
7476
"dependencies": {
7577
"tslog": "^4"
@@ -144,7 +146,7 @@ This feature enables `tslog` to reference a correct line number in your TypeScri
144146
```typescript
145147
import { Logger } from "tslog";
146148

147-
const logger = new Logger();
149+
const logger = new Logger({ name: "myLogger" });
148150
logger.silly("I am a silly log.");
149151
logger.trace("I am a trace log.");
150152
logger.debug("I am a debug log.");
@@ -169,6 +171,8 @@ logger.fatal(new Error("I am a pretty Error with a stacktrace."));
169171
- **Pretty Error:** Errors and stack traces printed in a structured way and fully accessible through _JSON_ (e.g. external Log services)
170172
- **ES Modules:** import syntax with ([tree-shaking](https://webpack.js.org/guides/tree-shaking/))
171173
- **Object/JSON highlighting:** Nicely prints out objects
174+
- **Instance Name**: _(Server-side only)_ Logs capture instance name (default host name) making it easy to distinguish logs coming from different instances
175+
- **Named Logger:** Logger can be named (e.g. useful for packages/modules and monorepos)
172176
- **Sub Logger with inheritance:** Powerful sub-loggers with settings inheritance, also at runtime
173177
- **Secrets masking:** Prevent passwords and secrets from sneaking into log files by masking them
174178
- **Short paths:** Paths are relative to the root of the application folder
@@ -268,6 +272,36 @@ const jsonLogger = new Logger({type: "json"});
268272
const hiddenLogger = new Logger({type: "hidden"});
269273
```
270274

275+
276+
#### Name
277+
278+
Each logger has an optional name. You can find the name of the logger responsible for a log inside the `Meta`-object or printed in `pretty` mode.
279+
Names get also inherited to sub loggers and can be found inside the `Meta`-object `parentNames` as well as printed out with a separator (e.g. `:`).
280+
281+
Simple name example:
282+
```typescript
283+
new Logger({ name: "myLogger" });
284+
```
285+
286+
Sub-loggers with an inherited name:
287+
```typescript
288+
const mainLogger = new Logger({ type: "pretty", name: "MainLogger" });
289+
mainLogger.silly("foo bar");
290+
291+
const firstSubLogger = mainLogger.getSubLogger({ name: "FirstSubLogger" });
292+
firstSubLogger.silly("foo bar 1");
293+
294+
const secondSubLogger = firstSubLogger.getSubLogger({ name: "SecondSubLogger" });
295+
secondSubLogger.silly("foo bar 2");
296+
```
297+
298+
Output:
299+
```shell
300+
2022-11-17 10:45:47.705 SILLY [/examples/nodejs/index2.ts:51 MainLogger] foo bar
301+
2022-11-17 10:45:47.706 SILLY [/examples/nodejs/index2.ts:54 MainLogger:FirstSubLogger] foo bar 1
302+
2022-11-17 10:45:47.706 SILLY [/examples/nodejs/index2.ts:57 MainLogger:FirstSubLogger:SecondSubLogger] foo bar 2
303+
```
304+
271305
#### minLevel
272306

273307
You can ignore every log message from being processed until a certain severity.
@@ -276,7 +310,7 @@ Default severities are:
276310

277311
```typescript
278312

279-
const suppressSilly = new Logger({minLevel: 1 });
313+
const suppressSilly = new Logger({ minLevel: 1 });
280314
suppressSilly.silly("Will be hidden");
281315
suppressSilly.trace("Will be visible");
282316
```
@@ -319,6 +353,7 @@ Following settings are available for styling:
319353
- `{{ms}}`: milliseconds
320354
- `{{dateIsoStr}}`: Shortcut for `{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}`
321355
- `{{logLevelName}}`: name of the log level
356+
- `{{name}}`: optional name of the current logger and his parents (e.g. "ParentLogger:ThisLogger")
322357
- `{{fullFilePath}}`: a full path starting from `/` root
323358
- `{{filePathWithLine}}`: a full path below the project path with line number
324359
- `prettyErrorTemplate`: template string for error message. Possible placeholders:
@@ -329,6 +364,7 @@ Following settings are available for styling:
329364
- `{{fileName}}`: name of the file
330365
- `{{filePathWithLine}}`: a full path below the project path with a line number
331366
- `{{method}}`: _optional_ name of the invoking method
367+
- `prettyErrorParentNamesSeparator`: separator to be used when joining names ot the parent logger, and the current one (default: `:`)
332368
- `prettyInspectOptions`: <a href="https://nodejs.org/api/util.html#utilinspectobject-options" target="_blank">Available options</a>
333369

334370
- **Styling:**
@@ -348,9 +384,10 @@ You can define the property containing this meta information with `metaProperty`
348384
```typescript
349385

350386
const logger = new Logger({
351-
prettyLogTemplate: "{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\t{{logLevelName}}\t[{{filePathWithLine}}]\t",
387+
prettyLogTemplate: "{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\t{{logLevelName}}\t[{{filePathWithLine}}{{name}}]\t",
352388
prettyErrorTemplate: "\n{{errorName}} {{errorMessage}}\nerror stack:\n{{errorStack}}",
353389
prettyErrorStackTemplate: " • {{fileName}}\t{{method}}\n\t{{filePathWithLine}}",
390+
prettyErrorParentNamesSeparator: ":",
354391
stylePrettyLogs: true,
355392
prettyLogStyles: {
356393
logLevelName: {
@@ -365,6 +402,7 @@ const logger = new Logger({
365402
},
366403
dateIsoStr: "white",
367404
filePathWithLine: "white",
405+
name: "white",
368406
errorName: ["bold", "bgRedBright", "whiteBright"],
369407
fileName: ["yellow"],
370408
},

src/BaseLogger.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export * from "./interfaces";
77
export class BaseLogger<LogObj> {
88
private readonly runtime: "browser" | "nodejs" | "unknown";
99
private readonly settings: ISettings<LogObj>;
10-
private subLogger: BaseLogger<LogObj>[] = [];
10+
private subLoggers: BaseLogger<LogObj>[] = [];
1111

1212
constructor(settings?: ISettingsParam<LogObj>, private logObj?: LogObj, private stackDepthLevel: number = 4) {
1313
const isBrowser = ![typeof window, typeof document].includes("undefined");
@@ -171,7 +171,7 @@ export class BaseLogger<LogObj> {
171171
logObj?: LogObj,
172172
stackDepthLevel?: number
173173
) => this)(subLoggerSettings, this.logObj, this.stackDepthLevel);
174-
this.subLogger.push(subLogger);
174+
this.subLoggers.push(subLogger);
175175
return subLogger;
176176
}
177177

tests/Nodejs/6_json_Settings.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,45 @@ describe("JSON: Settings", () => {
2424
expect(getConsoleLog()).toContain('"_meta": {');
2525
});
2626

27+
test("name", (): void => {
28+
const logger = new Logger({
29+
type: "json",
30+
name: "logger",
31+
});
32+
const log = logger.log(1, "testLevel", "foo bar");
33+
expect(log).toBeDefined();
34+
expect(log?._meta?.name).toBe("logger");
35+
expect(getConsoleLog()).toContain(`logger`);
36+
});
37+
38+
test("name with sub-logger inheritance", (): void => {
39+
const logger1 = new Logger({
40+
type: "json",
41+
name: "logger1",
42+
});
43+
const logger2 = logger1.getSubLogger({ name: "logger2" });
44+
const logger3 = logger2.getSubLogger({ name: "logger3" });
45+
46+
const log1 = logger1.log(1, "testLevel", "foo bar");
47+
const log2 = logger2.log(1, "testLevel", "foo bar");
48+
const log3 = logger3.log(1, "testLevel", "foo bar");
49+
expect(log1).toBeDefined();
50+
expect(log2).toBeDefined();
51+
expect(log3).toBeDefined();
52+
53+
expect(log1?._meta?.name).toBe("logger1");
54+
expect(log2?._meta?.name).toBe("logger2");
55+
expect(log3?._meta?.name).toBe("logger3");
56+
57+
expect(getConsoleLog()).toContain(`logger1`);
58+
expect(getConsoleLog()).toContain(`logger2`);
59+
expect(getConsoleLog()).toContain(`logger3`);
60+
61+
expect(log2?._meta?.parentNames).toContain("logger1");
62+
expect(log3?._meta?.parentNames).toContain("logger1");
63+
expect(log3?._meta?.parentNames).toContain("logger2");
64+
});
65+
2766
test("minLevel", (): void => {
2867
const logger = new Logger({
2968
type: "json",

tests/Nodejs/7_pretty_Settings.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,35 @@ describe("Pretty: Settings", () => {
2020
expect(getConsoleLog()).toContain("Test1 Test2");
2121
});
2222

23+
test("name", (): void => {
24+
const logger = new Logger({ type: "pretty", name: "logger" });
25+
const log = logger.log(1, "testLevel", "foo bar");
26+
expect(log).toBeDefined();
27+
expect(log?._meta?.name).toBe("logger");
28+
expect(getConsoleLog()).toContain(`logger`);
29+
});
30+
31+
test("name with sub-logger inheritance", (): void => {
32+
const logger1 = new Logger({ type: "pretty", name: "logger1" });
33+
const logger2 = logger1.getSubLogger({ name: "logger2" });
34+
const logger3 = logger2.getSubLogger({ name: "logger3" });
35+
36+
const log1 = logger1.log(1, "testLevel", "foo bar");
37+
const log2 = logger2.log(1, "testLevel", "foo bar");
38+
const log3 = logger3.log(1, "testLevel", "foo bar");
39+
expect(log1).toBeDefined();
40+
expect(log2).toBeDefined();
41+
expect(log3).toBeDefined();
42+
43+
expect(log1?._meta?.name).toBe("logger1");
44+
expect(log2?._meta?.name).toBe("logger2");
45+
expect(log3?._meta?.name).toBe("logger3");
46+
47+
expect(getConsoleLog()).toContain(`logger1`);
48+
expect(getConsoleLog()).toContain(`logger1:logger2`);
49+
expect(getConsoleLog()).toContain(`logger1:logger2:logger3`);
50+
});
51+
2352
test("argumentsArray", (): void => {
2453
const logger = new Logger({
2554
type: "pretty",

0 commit comments

Comments
 (0)