{: #git-wiki-toc}
The LoggerServiceFactory
is a function that returns a FactoryProvider
for NestJS, facilitating the creation of an ImprovedLoggerService
instance tailored to the app's specific configurations. This function takes several parameters including the app alias, a string to provide the logger service, the logging context, and a customizable options object.
Also, it might be useful to read the Event documentation to understand how this component work since it used in the logger library.
IImprovedLoggerOptions
object allowing you to customize the logger service settings further.Within the useFactory
function, configurations are derived from the config
service using the provided context. The loggerType
and loggerLevels
are deduced based on the context and the configuration values. Event emitting behavior is determined by the options
parameter, using the NestJS event emitter as a fallback if not specified.
Here's how the configuration selection works in detail:
context
parameter is used to derive the log levels from the configuration service.loggerLevels
are defined based on the logContextLevels
for the given context found in the configuration. If no levels are defined for the context, it falls back to the general logLevels
defined in the configuration.loggerType
is acquired from the conf
object derived from the app configuration service.To adequately configure the logger, it is crucial to set up the base configuration properly. The BaseConfFactory
function helps in creating a configuration object according to your environment settings and preferences.
The function takes an IConfFactoryOptions
object as a parameter and returns a configuration object with various properties, including those pertinent to logging, such as loggerType
, logLevels
, and logContextLevels
.
getEnvLoggerLevels
function assists in obtaining the logger levels from environment variables using the context and a default log level array.LOG_LEVEL_DEFAULT
values.The logContextLevels
object in the configuration can have keys representing different contexts, and values being an array of LogLevel
elements defining the log levels for that context. This object is constructed using a forEach loop on options.logContextLevels
, where for each context, the logger levels are obtained using getEnvLoggerLevels
function, providing a dynamic way to set logger levels for different contexts based on environment variables.
The configuration also handles different environments and stages, defining properties that help determine the current stage and whether it belongs to local or development stages. Error handling is included to ensure a valid stage is selected.
If you are utilizing the @nestjs-yalc/app library, it's beneficial to understand that the base-app module is already equipped with a provider and integrates the YalcDefaultAppModule
, which automatically configures two default loggers: the SYSTEM_LOGGER_SERVICE
that is globally accessible across all modules, and the APP_LOGGER_SERVICE
which is scoped to individual application modules.
Here is how it works:
While these default loggers are designed to meet most of your logging needs, there could be instances where you would want to instantiate new logger providers distinct from the default ones. This is feasible and is done by differentiating the context and its configuration settings.
Creating new logger providers can be highly beneficial, particularly when you aim to develop loggers for specific services and wish to dynamically tune their configuration without affecting the default loggers.
To create new logger providers, differentiate the context and its configuration settings as explained earlier. This allows for dynamic tuning of configurations specific to a service without altering the default settings.
This feature is mainly used to:
Feel free to explore this setup to create more intricate and detailed logging services for your applications, optimizing control and insights into your app's operations and performance.
Here is how to use the LoggerServiceFactory
to create a logger service instance:
import { LoggerServiceFactory } from '@nestjs-yalc/logger';
const loggerService = LoggerServiceFactory(
'myApp',
'MyLoggerService',
'MyContext',
{ event: { eventEmitter: myEventEmitter } },
);
You would integrate LoggerServiceFactory
in your NestJS application as a provider. Here is a succinct example:
import { LoggerServiceFactory } from '@nestjs-yalc/logger';
@Module({
providers: [
LoggerServiceFactory('myApp', 'MyLoggerService', 'MyContext', {
event: { eventEmitter: myEventEmitter },
}),
],
})
export class MyModule {}
Once the ImprovedLoggerService
is instantiated via the LoggerServiceFactory
, it can be injected into other services, controllers, or components in your NestJS application to facilitate logging. Below, we'll cover how to leverage the log
and error
methods of the logger service for logging messages and handling errors, respectively.
The log
method can be used to log standard messages. Here is how you can use this method:
import { Injectable } from '@nestjs/common';
@Injectable()
export class MyService {
constructor(private readonly logger: ImprovedLoggerService) {}
myMethod() {
this.logger.log('This is a log message', 'MyService');
}
}
In the above example, 'This is a log message'
is the message that will be logged, and 'MyService'
is the context in which the log is being made. The context is optional but can be useful to indicate the part of the application from which the log originates.
The error
method can be utilized to log error messages. It can take several parameters, including a message string, a trace string, and a context string. Here is how you can use this method:
import { Injectable } from '@nestjs/common';
@Injectable()
export class MyService {
constructor(private readonly logger: ImprovedLoggerService) {}
myErrorMethod() {
try {
// Some operation that can throw an error
} catch (error) {
this.logger.error('An error occurred', error.stack, 'MyService');
}
}
}
In this scenario:
'An error occurred'
is the error message to be logged.error.stack
is used to log the stack trace of the error (if available).'MyService'
indicates the context in which the error occurred.log
and error
methods can assist in filtering logs based on different contexts, providing a clearer insight into the behavior of your application.Understanding and utilizing the log
and error
methods of the ImprovedLoggerService
is essential in creating a robust logging strategy for your NestJS application. Remember to leverage the context parameter and maintain a structured logging format for a more insightful and efficient logging experience.
With the LoggerServiceFactory
and BaseConfFactory
, you can set up a dynamic logging system adapted to different contexts and environments. It facilitates context-aware logging configurations, leveraging environment variables for heightened configurability. Ensure to structure your environment variables and contexts appropriately to make the most out of this system.