Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions examples/implicit-level.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
'use strict';

const winston = require('../');
const myCustomLevels = {
l1: 0,
l2:1,
l3:2,
l4:3,
l5:4,
l6:5,
l7:6,
l8:7
}

/* made customs levels and didn't specify level for cut off-
but here magic happens and default level is implicitly selected
based on custom level using median approach*/

const myNewLogger = winston.createLogger({
levels:myCustomLevels,
transports: [
new winston.transports.Console()
]
})

myNewLogger.l1("some l1 message");
myNewLogger.l2("some l2 message");
myNewLogger.l3("some l3 message");
myNewLogger.l4("some l4 message");
myNewLogger.l5("some l5 message");
myNewLogger.l6("some l6 message");



79 changes: 77 additions & 2 deletions lib/winston/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ class Logger extends Transform {
this.configure(options);
}

// method to calculate default level value in case of custom levels defined



child(defaultRequestMetadata) {
const logger = this;
return Object.create(logger, {
Expand Down Expand Up @@ -70,6 +74,7 @@ class Logger extends Transform {
});
}


/**
* This will wholesale reconfigure this instance by:
* 1. Resetting all transports. Older transports will be removed implicitly.
Expand All @@ -78,12 +83,13 @@ class Logger extends Transform {
* @param {!Object} options - TODO: add param description.
* @returns {undefined}
*/

configure({
silent,
format,
defaultMeta,
levels,
level = 'info',
level,
exitOnError = true,
transports,
colors,
Expand All @@ -95,6 +101,41 @@ class Logger extends Transform {
exceptionHandlers,
rejectionHandlers
} = {}) {


// function to calculate default levels

function calculateDefaultLevel({ levels={} }) {
// for example : levels:{low:0,medium:1,high:2}
// levelNumber=[0,1,2]
// levelNames=["low"]
const strNumbers = Object.values(levels);

const levelNumbers = strNumbers.map(function (num) {
return Number(num);
})
const levelNames = Object.keys(levels);

const sortedLevels = levelNumbers.sort((a, b) => a - b);
//now it'll select median from sorted list as default level value
let medianIndex = Math.floor(sortedLevels.length / 2) - 1;
if(medianIndex===-1){
// means level have only one key
medianIndex=0;
}
const medianLevelValue = sortedLevels[medianIndex];
let defaultLvlName = "info";
Object.entries(levels).forEach((level) => {
if (parseInt(level[1]) === medianLevelValue) {
defaultLvlName = level[0];
}
})

return defaultLvlName;

}


// Reset transports if we already have them
if (this.transports.length) {
this.clear();
Expand All @@ -106,7 +147,41 @@ class Logger extends Transform {
this.defaultMeta = defaultMeta || null;
// Hoist other options onto this instance.
this.levels = levels || this.levels || config.npm.levels;
this.level = level;


// if level is not given and levels are also not given

if(Object.keys(levels).length ===1){

}


if (!level && !levels) {
this.level = "info";
}

// user gave custom levels then calculate default value implicitly
else if (Object.keys(levels).length > 0 && !level) {
this.level = calculateDefaultLevel({
levels
});
}

// user didnt gave custom levels but gave level
else if (!Object.keys(levels).length > 0 && level) {
this.level = level;
}

// user didnt gave custom levels but gave level
else if (Object.keys(levels).length < 0 && level) {
this.level = level;
}
else if (Object.keys(levels).length > 0 && level){
this.level=level
}



if (this.exceptions) {
this.exceptions.unhandle();
}
Expand Down
Loading