Skip to main content

Logging

Logging

Basica internally uses Pino, the fastest javascript logger out there! Use loggerFactory to get back an instance and configure it as you please.

index.ts
import { loggerFactory } from "@basica/core/logger";

const logger = loggerFactory();

logger.info("Hello world!");
{"level":30,...,"msg":"Hello world!"}

Custom logger

You can always bring in your own as long as it satisfies ILogger.

index.ts
import { ILogger } from "@basica/core/logger";

const logger: ILogger = {
info: console.info,
warn: console.warn,
error: console.error,
debug: console.debug,
trace: console.trace,
child: () => console,
};

logger.info("Hello world!");
Hello world!

Using logger

service.ts
import { ILogger } from "@basica/core/logger";

export class MyService implements IStartup {

constructor(private readonly logger: ILogger) {
logger.info("Initializing!");
}

//...
}
index.ts
import { AppBuilder } from "@basica/core";

import { MyService } from "./service";

const app = AppBuilder.registerDependencies((di) =>
di
.addSingleton("my-svc", (c) => new MyService(c.logger)),
)

// ...
{"level":30,...,"msg":"Initializing!"}
note

Basica provides a default logger automatically. If you override it by registering your own under the logger key, it must satisfy ILogger.

// A default logger is provided automatically
const app1 = AppBuilder.registerDependencies().build(); // OK

// Overriding it with something that isn't an ILogger is an error
const app2 = AppBuilder.registerDependencies((di) =>
di.addSingleton("logger", () => "not a logger"),
).build(); // Error: logger is not of type ILogger

// Overriding it with a real logger is fine
const app3 = AppBuilder.registerDependencies((di) =>
di.addSingleton("logger", () => loggerFactory()),
).build(); // OK