bigbluebutton-Github/bigbluebutton-html5/imports/startup/client/logger.js

127 lines
3.5 KiB
JavaScript
Raw Normal View History

2018-06-20 00:46:59 +08:00
import Auth from '/imports/ui/services/auth';
import { Meteor } from 'meteor/meteor';
import { createLogger, stdSerializers } from 'browser-bunyan';
import { ConsoleFormattedStream } from '@browser-bunyan/console-formatted-stream';
import { ConsoleRawStream } from '@browser-bunyan/console-raw-stream';
2018-06-20 00:46:59 +08:00
import { ServerStream } from '@browser-bunyan/server-stream';
import { nameFromLevel } from '@browser-bunyan/levels';
// The logger accepts "console","server", and "external" as targets
// Multiple targets can be set as an array in the settings under public.log
// To add more targets use the format { "target": "server", "level": "info" },
// and add it to the public.log array
2018-06-20 00:46:59 +08:00
// The accepted levels are "debug", "info", "warn", "error"
2018-07-20 00:21:26 +08:00
// To send to URL, use the format {"target": "external","level": "info",
// "url": "","method": ""}
// externalURL is the end-point that logs will be sent to
2018-07-14 03:44:22 +08:00
// Call the logger by doing a function call with the level name, I.e, logger.warn('Hi on warn')
2018-06-20 00:46:59 +08:00
const LOG_CONFIG = Meteor.settings.public.clientLog || { console: { enabled: true, level: 'info' } };
2018-06-20 00:46:59 +08:00
2018-07-20 00:21:26 +08:00
// Custom stream that logs to an end-point
2018-06-20 00:46:59 +08:00
class ServerLoggerStream extends ServerStream {
constructor(params) {
super(params);
if (params.logTag) {
this.logTagString = params.logTag;
}
}
2018-06-20 00:46:59 +08:00
write(rec) {
const { fullInfo } = Auth;
2018-07-27 02:48:50 +08:00
this.rec = rec;
2018-06-20 00:46:59 +08:00
if (fullInfo.meetingId != null) {
this.rec.userInfo = fullInfo;
2018-06-20 00:46:59 +08:00
}
this.rec.clientBuild = Meteor.settings.public.app.html5ClientBuild;
2020-05-01 04:40:45 +08:00
this.rec.connectionId = Meteor.connection._lastSessionId;
if (this.logTagString) {
this.rec.logTag = this.logTagString;
}
2018-07-27 02:48:50 +08:00
return super.write(this.rec);
2018-06-20 00:46:59 +08:00
}
}
2018-07-27 02:48:50 +08:00
2018-07-20 00:21:26 +08:00
// Custom stream to log to the meteor server
2018-06-20 00:46:59 +08:00
class MeteorStream {
write(rec) {
const { fullInfo } = Auth;
2020-07-01 03:18:01 +08:00
const clientURL = window.location.href;
2018-07-27 02:48:50 +08:00
this.rec = rec;
2018-06-20 00:46:59 +08:00
if (fullInfo.meetingId != null) {
2020-07-01 03:18:01 +08:00
if (!this.rec.extraInfo) {
this.rec.extraInfo = {};
}
this.rec.extraInfo.clientURL = clientURL;
Meteor.call(
'logClient',
nameFromLevel[this.rec.level],
this.rec.msg,
this.rec.logCode,
2020-07-01 03:18:01 +08:00
this.rec.extraInfo,
fullInfo,
);
2018-06-20 00:46:59 +08:00
} else {
2020-07-01 03:18:01 +08:00
Meteor.call(
'logClient',
nameFromLevel[this.rec.level],
this.rec.msg,
this.rec.logCode,
{ ...rec.extraInfo, clientURL },
2020-07-01 03:18:01 +08:00
);
2018-06-20 00:46:59 +08:00
}
}
}
2020-07-01 03:18:01 +08:00
function createStreamForTarget(target, options) {
const TARGET_EXTERNAL = 'external';
const TARGET_CONSOLE = 'console';
const TARGET_SERVER = 'server';
2018-07-20 00:21:26 +08:00
let Stream = ConsoleRawStream;
switch (target) {
case TARGET_EXTERNAL:
2018-07-20 00:21:26 +08:00
Stream = ServerLoggerStream;
break;
case TARGET_CONSOLE:
Stream = ConsoleFormattedStream;
break;
case TARGET_SERVER:
Stream = MeteorStream;
break;
2018-07-27 02:48:50 +08:00
default:
Stream = ConsoleFormattedStream;
}
2018-07-20 00:21:26 +08:00
return new Stream(options);
}
function generateLoggerStreams(config) {
let result = [];
Object.keys(config).forEach((key) => {
const logOption = config[key];
if (logOption && logOption.enabled) {
const { level, ...streamOptions } = logOption;
result = result.concat({ level, stream: createStreamForTarget(key, streamOptions) });
}
});
return result;
2018-06-20 00:46:59 +08:00
}
// Creates the logger with the array of streams of the chosen targets
const logger = createLogger({
name: 'clientLogger',
streams: generateLoggerStreams(LOG_CONFIG),
2018-06-20 00:46:59 +08:00
serializers: stdSerializers,
src: true,
});
export default logger;