diagnostic-channel-publishers
Version:
A collection of pre-built module patches that enable existing npm modules to publish diagnostic data
160 lines • 7.35 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.enable = exports.winston2 = exports.winston3 = void 0;
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
var diagnostic_channel_1 = require("diagnostic-channel");
// register a "filter" with each logger that publishes the data about to be logged
var winston2PatchFunction = function (originalWinston) {
var originalLog = originalWinston.Logger.prototype.log;
var curLevels;
var loggingFilter = function (level, message, meta) {
var levelKind;
if (curLevels === originalWinston.config.npm.levels) {
levelKind = "npm";
}
else if (curLevels === originalWinston.config.syslog.levels) {
levelKind = "syslog";
}
else {
levelKind = "unknown";
}
diagnostic_channel_1.channel.publish("winston", { level: level, message: message, meta: meta, levelKind: levelKind });
return message;
};
// whenever someone logs, ensure our filter comes last
originalWinston.Logger.prototype.log = function log() {
curLevels = this.levels;
if (!this.filters || this.filters.length === 0) {
this.filters = [loggingFilter];
}
else if (this.filters[this.filters.length - 1] !== loggingFilter) {
this.filters = this.filters.filter(function (f) { return f !== loggingFilter; });
this.filters.push(loggingFilter);
}
return originalLog.apply(this, arguments);
};
return originalWinston;
};
var winston3PatchFunction = function (originalWinston) {
var mapLevelToKind = function (winston, level) {
var levelKind;
if (winston.config.npm.levels[level] != null) {
levelKind = "npm";
}
else if (winston.config.syslog.levels[level] != null) {
levelKind = "syslog";
}
else {
levelKind = "unknown";
}
return levelKind;
};
var AppInsightsTransport = /** @class */ (function (_super) {
__extends(AppInsightsTransport, _super);
function AppInsightsTransport(winston, opts) {
var _this = _super.call(this, opts) || this;
_this.winston = winston;
return _this;
}
AppInsightsTransport.prototype.log = function (info, callback) {
// tslint:disable-next-line:prefer-const - try to obtain level from Symbol(level) afterwards
var message = info.message, level = info.level, meta = info.meta, splat = __rest(info, ["message", "level", "meta"]);
level = typeof Symbol["for"] === "function" ? info[Symbol["for"]("level")] : level; // Symbol(level) is uncolorized, so prefer getting it from here
message = info instanceof Error ? info : message; // Winston places Errors at info, strings at info.message
var levelKind = mapLevelToKind(this.winston, level);
meta = meta || {}; // Winston _somtimes_ puts metadata inside meta, so start from here
for (var key in splat) {
if (splat.hasOwnProperty(key)) {
meta[key] = splat[key];
}
}
diagnostic_channel_1.channel.publish("winston", { message: message, level: level, levelKind: levelKind, meta: meta });
callback();
};
return AppInsightsTransport;
}(originalWinston.Transport));
// Helper function which returns either set level or highest level
function getLogLevel(opts) {
var _a;
// Check whether a level has been provided
if (opts === null || opts === void 0 ? void 0 : opts.level) {
return opts.level;
}
// Grab highest sev logging level in case of custom logging levels
var levels = (_a = opts === null || opts === void 0 ? void 0 : opts.levels) !== null && _a !== void 0 ? _a : originalWinston.config.npm.levels;
var lastLevel;
for (var level in levels) {
if (levels.hasOwnProperty(level)) {
lastLevel = lastLevel === undefined || levels[level] > levels[lastLevel] ? level : lastLevel;
}
}
return lastLevel;
}
// Patch this function
function patchedConfigure(opts) {
this.add(new AppInsightsTransport(originalWinston, { level: getLogLevel(opts) }));
}
var origCreate = originalWinston.createLogger;
originalWinston.createLogger = function patchedCreate(opts) {
// Add custom app insights transport to the end
// Remark: Configure is not available until after createLogger()
// and the Logger prototype is not exported in winston 3.x, so
// patch both createLogger and configure. Could also call configure
// again after createLogger, but that would cause configure to be called
// twice per create.
var result = origCreate.call(this, opts);
result.add(new AppInsightsTransport(originalWinston, { level: getLogLevel(opts) }));
var origConfigure = result.configure;
result.configure = function () {
origConfigure.apply(this, arguments);
patchedConfigure.apply(this, arguments);
};
return result;
};
var origRootConfigure = originalWinston.configure;
originalWinston.configure = function () {
origRootConfigure.apply(this, arguments);
patchedConfigure.apply(this, arguments);
};
originalWinston.add(new AppInsightsTransport(originalWinston));
return originalWinston;
};
exports.winston3 = {
versionSpecifier: "3.x",
patch: winston3PatchFunction
};
exports.winston2 = {
versionSpecifier: "2.x",
patch: winston2PatchFunction
};
function enable() {
diagnostic_channel_1.channel.registerMonkeyPatch("winston", exports.winston2);
diagnostic_channel_1.channel.registerMonkeyPatch("winston", exports.winston3);
}
exports.enable = enable;
//# sourceMappingURL=winston.pub.js.map
;