nestjs-loki-logger
Version:
A Nest Js module to push logs to grafana loki extending the built-in nest js Logger Class.
157 lines (146 loc) • 3.46 kB
text/typescript
import { Injectable, Logger, Optional } from '@nestjs/common';
import axios from 'axios';
import { NestLokiModuleOptions } from './typings/nest-loki';
()
export class LokiLogger extends Logger {
constructor(() protected context?: string) {
super(context);
}
static lokiUrl = 'localhost:3100';
static defaultLabels: any = {};
static logToConsole = false;
static gzip = false;
static onLokiError: (error: any) => void = () => {};
private static sendLokiRequest = (
labels: Record<string, string>,
message: string,
): any => {
const data = JSON.stringify({
streams: [
{
stream: labels,
values: [[(Date.now() * 1000000).toString(), message]],
},
],
});
axios({
method: 'POST',
url: `${LokiLogger.lokiUrl}/loki/api/v1/push`,
headers: LokiLogger.gzip
? {
'Content-Type': 'application/json',
'Content-Encoding': 'application/gzip',
}
: {
'Content-Type': 'application/json',
},
data: data,
})
.then()
.catch((error) => {
if (LokiLogger.onLokiError) {
LokiLogger.onLokiError(error);
} else {
console.error('error', error.message, error?.response?.data);
}
});
};
static forRoot(options: NestLokiModuleOptions): any {
this.lokiUrl = options.lokiUrl;
this.defaultLabels = options.labels ?? {};
this.logToConsole = options.logToConsole ?? false;
this.gzip = !!options.gzip;
return LokiLogger;
}
error(
message: string,
trace?: string,
context?: string,
labels?: Record<string, string>,
): void {
LokiLogger.sendLokiRequest(
{
...LokiLogger.defaultLabels,
...labels,
context: context ?? this.context,
level: 'error',
},
message,
);
if (LokiLogger.logToConsole) {
super.error(message, trace, context);
}
}
log(
message: string,
context?: string,
labels?: Record<string, string>,
): void {
LokiLogger.sendLokiRequest(
{
...LokiLogger.defaultLabels,
...labels,
context: context ?? this.context,
level: 'info',
},
message,
);
if (LokiLogger.logToConsole) {
super.log(message, context);
}
}
warn(
message: string,
context?: string,
labels?: Record<string, string>,
): void {
LokiLogger.sendLokiRequest(
{
...LokiLogger.defaultLabels,
...labels,
context: this.context,
level: 'warn',
},
message,
);
if (LokiLogger.logToConsole) {
super.warn(message, context);
}
}
debug(
message: string,
context?: string,
labels?: Record<string, string>,
): void {
LokiLogger.sendLokiRequest(
{
...LokiLogger.defaultLabels,
...labels,
context: this.context,
level: 'debug',
},
message,
);
if (LokiLogger.logToConsole) {
super.debug(message, context);
}
}
verbose(
message: string,
context?: string,
labels?: Record<string, string>,
): void {
LokiLogger.sendLokiRequest(
{
...LokiLogger.defaultLabels,
...labels,
context: this.context,
level: 'verbose',
},
message,
);
if (LokiLogger.logToConsole) {
super.verbose(message, context);
}
}
}