Skip to content

Commit

Permalink
refactor(core-logger-pino): implement RFC 5424 log levels
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Faust committed Sep 2, 2019
1 parent ab8cc65 commit c613728
Show file tree
Hide file tree
Showing 11 changed files with 79 additions and 253 deletions.
4 changes: 2 additions & 2 deletions __tests__/unit/core-logger-pino/driver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import { Container, Identifiers } from "@packages/core-kernel/src/container";

expectLogger(PinoLogger, {
levels: {
console: "trace",
file: "trace",
console: "emergency",
file: "emergency",
},
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,23 +62,23 @@ export class LoadServiceProviders implements Bootstrapper {
*
* @private
* @param {ServiceProvider} serviceProvider
* @param {JsonObject} opts
* @param {JsonObject} options
* @returns {PackageConfiguration}
* @memberof LoadServiceProviders
*/
private discoverConfiguration(serviceProvider: ServiceProvider, opts: JsonObject): PackageConfiguration {
private discoverConfiguration(serviceProvider: ServiceProvider, options: JsonObject): PackageConfiguration {
const hasDefaults: boolean = Object.keys(serviceProvider.configDefaults()).length > 0;

if (hasDefaults) {
return this.app
.resolve(PackageConfiguration)
.from(serviceProvider.name(), serviceProvider.configDefaults())
.merge(opts);
.merge(options);
}

return this.app
.resolve(PackageConfiguration)
.discover(serviceProvider.name())
.merge(opts);
.merge(options);
}
}
3 changes: 2 additions & 1 deletion packages/core-kernel/src/contracts/kernel/log.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ export interface Logger {
/**
* Create a new instance of the logger.
*
* @param {*} options
* @returns {Promise<Logger>}
* @memberof Logger
*/
make(opts: any): Promise<Logger>;
make(options: any): Promise<Logger>;

/**
* System is unusable.
Expand Down
3 changes: 2 additions & 1 deletion packages/core-kernel/src/enums/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as Events from "./events";
import * as Log from "./log";
import * as Process from "./process";

export { Events, Process };
export { Events, Log, Process };
17 changes: 17 additions & 0 deletions packages/core-kernel/src/enums/log.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* @remarks
* Log levels as defined by {@link https://tools.ietf.org/html/rfc5424 | RFC 5424}
*
* @export
* @enum {number}
*/
export enum LogLevel {
Emergency = 0,
Alert = 1,
Critical = 2,
Error = 3,
Warning = 4,
Notice = 5,
Informational = 6,
Debug = 7,
}
17 changes: 5 additions & 12 deletions packages/core-kernel/src/services/log/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ import { injectable } from "../../container";
@injectable()
export abstract class Logger {
/**
* @protected
* @private
* @type {Record<string, string>}
* @memberof Logger
*/
protected readonly defaultLevels: Record<string, string> = {
private levels: Record<string, string> = {
emergency: "emergency",
alert: "alert",
critical: "critical",
Expand All @@ -26,13 +26,6 @@ export abstract class Logger {
debug: "debug",
};

/**
* @protected
* @type {*}
* @memberof Logger
*/
protected logger: any;

/**
* @protected
* @type {boolean}
Expand All @@ -42,10 +35,10 @@ export abstract class Logger {

/**
* @protected
* @type {Record<string, string>}
* @type {*}
* @memberof Logger
*/
protected levels: Record<string, string>;
protected logger: any;

/**
* @param {string} level
Expand Down Expand Up @@ -148,6 +141,6 @@ export abstract class Logger {
* @memberof Logger
*/
public setLevels(levels: Record<string, string>): void {
this.levels = { ...this.defaultLevels, ...levels };
this.levels = { ...this.levels, ...levels };
}
}
1 change: 1 addition & 0 deletions packages/core-logger-pino/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
},
"dependencies": {
"@arkecosystem/core-kernel": "^3.0.0-next.0",
"chalk": "^2.4.2",
"pino": "^5.12.6",
"pino-pretty": "^3.2.0",
"pump": "^3.0.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/core-logger-pino/src/defaults.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export const defaults = {
levels: {
console: process.env.CORE_LOG_LEVEL || "debug",
file: process.env.CORE_LOG_LEVEL_FILE || "trace",
console: process.env.CORE_LOG_LEVEL || "emergency",
file: process.env.CORE_LOG_LEVEL_FILE || "emergency",
},
fileRotator: {
interval: "1d",
Expand Down
58 changes: 36 additions & 22 deletions packages/core-logger-pino/src/driver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import pump from "pump";
import { Transform } from "readable-stream";
import rfs from "rotating-file-stream";
import split from "split2";
import chalk, { Chalk } from "chalk";
import { PassThrough } from "stream";

@Container.injectable()
Expand All @@ -17,32 +18,44 @@ export class PinoLogger extends Services.Log.Logger implements Contracts.Kernel.

protected logger: pino.Logger;

public async make(opts): Promise<Contracts.Kernel.Log.Logger> {
this.setLevels({
emergency: "fatal",
alert: "fatal",
critical: "fatal",
error: "error",
warning: "warn",
notice: "info",
info: "info",
debug: "debug",
});

private levelStyles: Record<string, Chalk> = {
emergency: chalk.bgRed,
alert: chalk.red,
critical: chalk.red,
error: chalk.red,
warning: chalk.yellow,
notice: chalk.green,
info: chalk.blue,
debug: chalk.magenta,
};

public async make(options): Promise<Contracts.Kernel.Log.Logger> {
const stream: PassThrough = new PassThrough();
this.logger = pino(
{
base: null,
customLevels: {
emergency: 0,
alert: 1,
critical: 2,
error: 3,
warning: 4,
notice: 5,
info: 6,
debug: 7,
},
level: "emergency",
useLevelLabels: true,
useOnlyCustomLevels: true,
safe: true,
level: "trace",
},
stream,
);

this.fileStream = this.getFileStream(opts);
this.fileStream = this.getFileStream(options);

const consoleTransport = this.createPrettyTransport(opts.levels.console, { colorize: true });
const fileTransport = this.createPrettyTransport(opts.levels.file, { colorize: false });
const consoleTransport = this.createPrettyTransport(options.levels.console, { colorize: true });
const fileTransport = this.createPrettyTransport(options.levels.file, { colorize: false });

pump(stream, split(), consoleTransport, process.stdout);
pump(stream, split(), fileTransport, this.fileStream);
Expand All @@ -59,18 +72,19 @@ export class PinoLogger extends Services.Log.Logger implements Contracts.Kernel.
...prettyOptions,
});

const levelValue = this.logger.levels.values[level];
const getLevel = (level: string): number => this.logger.levels.values[level];
const formatLevel = (level: string): string => this.levelStyles[level](level.toUpperCase());

return new Transform({
transform(chunk, enc, cb) {
try {
const json = JSON.parse(chunk);

if (json.level >= levelValue) {
const line = pinoPretty(json);
if (getLevel(json.level) >= getLevel(level)) {
const line: string | undefined = pinoPretty(json);

if (line !== undefined) {
return cb(undefined, line);
return cb(undefined, line.replace("USERLVL", formatLevel(json.level)));
}
}
} catch {}
Expand All @@ -80,7 +94,7 @@ export class PinoLogger extends Services.Log.Logger implements Contracts.Kernel.
});
}

private getFileStream(opts): WriteStream {
private getFileStream(options): WriteStream {
return rfs(
(time: Date, index: number) => {
if (!time) {
Expand All @@ -98,7 +112,7 @@ export class PinoLogger extends Services.Log.Logger implements Contracts.Kernel.
{
path: this.app.logPath(),
initialRotation: true,
interval: opts.fileRotator ? opts.fileRotator.interval : "1d",
interval: options.fileRotator ? options.fileRotator.interval : "1d",
maxSize: "100M",
maxFiles: 10,
compress: "gzip",
Expand Down
4 changes: 2 additions & 2 deletions packages/core/bin/config/testnet/.env
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CORE_LOG_LEVEL=debug
CORE_LOG_LEVEL_FILE=trace
CORE_LOG_LEVEL=emergency
CORE_LOG_LEVEL_FILE=emergency

CORE_DB_HOST=localhost
CORE_DB_PORT=5432
Expand Down
Loading

0 comments on commit c613728

Please sign in to comment.