@logtail/pino
Version:
Better Stack Pino transport (formerly Logtail)
78 lines • 3.8 kB
JavaScript
;
var __asyncValues = (this && this.__asyncValues) || function (o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.logtailTransport = logtailTransport;
const pino_abstract_transport_1 = __importDefault(require("pino-abstract-transport"));
const node_1 = require("@logtail/node");
const helpers_1 = require("./helpers");
const stackContextHint = {
fileName: "node_modules/pino",
methodNames: ["log", "fatal", "error", "warn", "info", "debug", "trace", "silent"],
required: true,
};
async function logtailTransport(options) {
const logtail = new node_1.Logtail(options.sourceToken, options.options);
const buildFunc = async (source) => {
var _a, e_1, _b, _c;
try {
for (var _d = true, source_1 = __asyncValues(source), source_1_1; source_1_1 = await source_1.next(), _a = source_1_1.done, !_a; _d = true) {
_c = source_1_1.value;
_d = false;
let obj = _c;
// Logging meta data
const meta = {};
// Copy `time` if set
if (typeof obj.time === "string" || obj.time.length) {
const time = new Date(obj.time);
if (!isNaN(time.valueOf())) {
meta.dt = time;
}
}
// Carry over any additional data fields
Object.keys(obj)
.filter((key) => ["time", "msg", "message", "level", "v"].indexOf(key) < 0)
.forEach((key) => (meta[key] = obj[key]));
// Get message
// NOTE: Pino passes messages as obj.msg but if user passes object to Pino it will pass it to us
// even without 'msg' field. Later we map 'msg' -> 'message' so let's also read 'message' field.
const msg = obj.msg || obj.message;
// Prevent overriding 'message' with 'msg'
if (obj.msg !== undefined && obj.message !== undefined) {
meta["message_field"] = obj.message;
}
// Determine the log level
let level;
try {
level = (0, helpers_1.getLogLevel)(obj.level);
}
catch (_) {
console.error("Error while mapping log level.");
continue;
}
// Log to Logtail
logtail.log(msg, level, meta, stackContextHint);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (!_d && !_a && (_b = source_1.return)) await _b.call(source_1);
}
finally { if (e_1) throw e_1.error; }
}
};
const closeFunc = async () => {
return await logtail.flush();
};
return (0, pino_abstract_transport_1.default)(buildFunc, { close: closeFunc });
}
//# sourceMappingURL=pino.js.map