discord-baymax-bot/node_modules/log4js/lib/appenders/logFacesAppender.js

126 lines
3.9 KiB
JavaScript
Raw Permalink Normal View History

2017-03-24 04:52:08 +00:00
/**
* logFaces appender sends JSON formatted log events to logFaces receivers.
* There are two types of receivers supported - raw UDP sockets (for server side apps),
* and HTTP (for client side apps). Depending on the usage, this appender
* requires either of the two:
*
* For UDP require 'dgram', see 'https://nodejs.org/api/dgram.html'
* For HTTP require 'axios', see 'https://www.npmjs.com/package/axios'
*
* Make sure your project have relevant dependancy installed before using this appender.
*/
"use strict";
var util = require('util');
var context = {};
function datagram(config){
var sock = require('dgram').createSocket('udp4');
var host = config.remoteHost || "127.0.0.1";
var port = config.port || 55201;
return function(event){
var buff = new Buffer(JSON.stringify(event));
sock.send(buff, 0, buff.length, port, host, function(err, bytes) {
if(err){
console.error("log4js.logFacesAppender failed to %s:%d, error: %s",
host, port, err);
}
});
};
}
function servlet(config){
var axios = require('axios').create();
axios.defaults.baseURL = config.url;
axios.defaults.timeout = config.timeout || 5000;
axios.defaults.headers = {'Content-Type': 'application/json'};
axios.defaults.withCredentials = true;
return function(lfsEvent){
axios.post("", lfsEvent)
.then(function(response){
if(response.status != 200){
console.error("log4js.logFacesAppender post to %s failed: %d",
config.url, response.status);
}
})
.catch(function(response){
console.error("log4js.logFacesAppender post to %s excepted: %s",
config.url, response.status);
});
};
}
/**
* For UDP (node.js) use the following configuration params:
* {
* "type": "logFacesAppender", // must be present for instantiation
* "application": "LFS-TEST", // name of the application (domain)
* "remoteHost": "127.0.0.1", // logFaces server address (hostname)
* "port": 55201 // UDP receiver listening port
* }
*
* For HTTP (browsers or node.js) use the following configuration params:
* {
* "type": "logFacesAppender", // must be present for instantiation
* "application": "LFS-TEST", // name of the application (domain)
* "url": "http://lfs-server/logs", // logFaces receiver servlet URL
* }
*/
function logFacesAppender(config) {
var send = config.send;
if(send === undefined){
send = (config.url === undefined) ? datagram(config) : servlet(config);
}
return function log(event) {
// convert to logFaces compact json format
var lfsEvent = {
a: config.application || "", // application name
t: event.startTime.getTime(), // time stamp
p: event.level.levelStr, // level (priority)
g: event.categoryName, // logger name
m: format(event.data) // message text
};
// add context variables if exist
Object.keys(context).forEach(function(key) {
lfsEvent['p_' + key] = context[key];
});
// send to server
send(lfsEvent);
};
}
function configure(config) {
return logFacesAppender(config);
}
function setContext(key, value){
context[key] = value;
}
function format(logData) {
var data = Array.isArray(logData) ?
logData : Array.prototype.slice.call(arguments);
return util.format.apply(util, wrapErrorsWithInspect(data));
}
function wrapErrorsWithInspect(items) {
return items.map(function(item) {
if ((item instanceof Error) && item.stack) {
return { inspect: function() {
return util.format(item) + '\n' + item.stack;
}};
} else {
return item;
}
});
}
exports.appender = logFacesAppender;
exports.configure = configure;
exports.setContext = setContext;