mirror of https://github.com/OpenVidu/openvidu.git
openvidu-browser: Add option 'debugApp' to send logs from app and from openvidu-browser
parent
1b22fd5c3a
commit
42c833faf4
|
@ -0,0 +1,42 @@
|
||||||
|
type ConsoleFunction = (...data: any) => void;
|
||||||
|
export class ConsoleLogger {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
|
logger: Console
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
|
log: ConsoleFunction
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
|
info: ConsoleFunction
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
|
debug: ConsoleFunction
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
|
warn: ConsoleFunction
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
|
error: ConsoleFunction
|
||||||
|
|
||||||
|
constructor(console: Console) {
|
||||||
|
this.logger = console;
|
||||||
|
this.log = window.console.log,
|
||||||
|
this.info = window.console.info,
|
||||||
|
this.debug = window.console.debug,
|
||||||
|
this.warn = window.console.warn,
|
||||||
|
this.error = window.console.error
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
import { JL } from 'jsnlog'
|
import { JL } from 'jsnlog'
|
||||||
import { OpenVidu } from "../../OpenVidu/OpenVidu";
|
import { OpenVidu } from "../../OpenVidu/OpenVidu";
|
||||||
|
import { ConsoleLogger } from './ConsoleLogger';
|
||||||
import { OpenViduLoggerConfiguration } from "./OpenViduLoggerConfiguration";
|
import { OpenViduLoggerConfiguration } from "./OpenViduLoggerConfiguration";
|
||||||
import JSNLogAjaxAppender = JL.JSNLogAjaxAppender;
|
|
||||||
|
|
||||||
export class OpenViduLogger {
|
export class OpenViduLogger {
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ export class OpenViduLogger {
|
||||||
private MAX_MSECONDS_BATCH_MESSAGES: number = 5000;
|
private MAX_MSECONDS_BATCH_MESSAGES: number = 5000;
|
||||||
private MAX_LENGTH_STRING_JSON: number = 1000;
|
private MAX_LENGTH_STRING_JSON: number = 1000;
|
||||||
|
|
||||||
private logger: Console = window.console;
|
private defaultConsoleLogger: ConsoleLogger = new ConsoleLogger(window.console);
|
||||||
private LOG_FNS = [this.logger.log, this.logger.debug, this.logger.info, this.logger.warn, this.logger.error];
|
|
||||||
private currentAppender: any;
|
private currentAppender: any;
|
||||||
|
|
||||||
private isProdMode = false;
|
private isProdMode = false;
|
||||||
|
@ -22,11 +22,10 @@ export class OpenViduLogger {
|
||||||
// This two variables are used to restart JSNLog
|
// This two variables are used to restart JSNLog
|
||||||
// on different sessions and different userIds
|
// on different sessions and different userIds
|
||||||
private loggingSessionId: string | undefined;
|
private loggingSessionId: string | undefined;
|
||||||
private loggingFinalUserId: string | undefined;
|
|
||||||
|
|
||||||
|
|
||||||
private constructor() { }
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
static configureJSNLog(openVidu: OpenVidu, token: string) {
|
static configureJSNLog(openVidu: OpenVidu, token: string) {
|
||||||
try {
|
try {
|
||||||
// If dev mode
|
// If dev mode
|
||||||
|
@ -34,9 +33,17 @@ export class OpenViduLogger {
|
||||||
// If instance is created and it is OpenVidu Pro
|
// If instance is created and it is OpenVidu Pro
|
||||||
(this.instance && openVidu.webrtcStatsInterval > -1
|
(this.instance && openVidu.webrtcStatsInterval > -1
|
||||||
// If logs are enabled
|
// If logs are enabled
|
||||||
&& openVidu.sendBrowserLogs === OpenViduLoggerConfiguration.debug
|
&& this.instance.isOpenViduBrowserLogsDebugActive(openVidu)
|
||||||
// Only reconfigure it if session or finalUserId has changed
|
// Only reconfigure it if session or finalUserId has changed
|
||||||
&& this.instance.canConfigureJSNLog(openVidu, this.instance))) {
|
&& this.instance.canConfigureJSNLog(openVidu, this.instance))) {
|
||||||
|
|
||||||
|
// Check if app logs can be sent
|
||||||
|
// and replace console.log function to send
|
||||||
|
// logs of the application
|
||||||
|
if (openVidu.sendBrowserLogs === OpenViduLoggerConfiguration.debugApp) {
|
||||||
|
this.instance.replaceWindowConsole();
|
||||||
|
}
|
||||||
|
|
||||||
// isJSNLogSetup will not be true until completed setup
|
// isJSNLogSetup will not be true until completed setup
|
||||||
this.instance.isJSNLogSetup = false;
|
this.instance.isJSNLogSetup = false;
|
||||||
this.instance.info("Configuring JSNLogs.");
|
this.instance.info("Configuring JSNLogs.");
|
||||||
|
@ -49,9 +56,12 @@ export class OpenViduLogger {
|
||||||
// https://github.com/mperdeck/jsnlog.js/blob/v2.30.0/jsnlog.ts#L805-L818
|
// https://github.com/mperdeck/jsnlog.js/blob/v2.30.0/jsnlog.ts#L805-L818
|
||||||
const parentReadyStateFunction = xhr.onreadystatechange;
|
const parentReadyStateFunction = xhr.onreadystatechange;
|
||||||
xhr.onreadystatechange = () => {
|
xhr.onreadystatechange = () => {
|
||||||
if ((xhr.status == 401) || (xhr.status == 403) || (xhr.status == 404)) {
|
console.log(xhr.status);
|
||||||
|
if (this.isInvalidResponse(xhr)) {
|
||||||
Object.defineProperty(xhr, "readyState", { value: 4 });
|
Object.defineProperty(xhr, "readyState", { value: 4 });
|
||||||
Object.defineProperty(xhr, "status", { value: 200 });
|
Object.defineProperty(xhr, "status", { value: 200 });
|
||||||
|
// Disable JSNLog too to not send periodically errors
|
||||||
|
this.instance.disableLogger();
|
||||||
}
|
}
|
||||||
parentReadyStateFunction();
|
parentReadyStateFunction();
|
||||||
}
|
}
|
||||||
|
@ -114,19 +124,20 @@ export class OpenViduLogger {
|
||||||
|
|
||||||
this.instance.isJSNLogSetup = true;
|
this.instance.isJSNLogSetup = true;
|
||||||
this.instance.loggingSessionId = sessionId;
|
this.instance.loggingSessionId = sessionId;
|
||||||
this.instance.loggingFinalUserId = finalUserId;
|
|
||||||
this.instance.info("JSNLog configured.");
|
this.instance.info("JSNLog configured.");
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
// Print error
|
||||||
console.error("Error configuring JSNLog: ");
|
console.error("Error configuring JSNLog: ");
|
||||||
console.error(e);
|
console.error(e);
|
||||||
this.instance.isJSNLogSetup = false;
|
// Restore defaults values just in case any exception happen-
|
||||||
this.instance.loggingSessionId = undefined;
|
this.instance.disableLogger();
|
||||||
this.instance.loggingFinalUserId = undefined;
|
|
||||||
this.instance.currentAppender = undefined;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
static getInstance(): OpenViduLogger {
|
static getInstance(): OpenViduLogger {
|
||||||
if (!OpenViduLogger.instance) {
|
if (!OpenViduLogger.instance) {
|
||||||
OpenViduLogger.instance = new OpenViduLogger();
|
OpenViduLogger.instance = new OpenViduLogger();
|
||||||
|
@ -134,56 +145,136 @@ export class OpenViduLogger {
|
||||||
return OpenViduLogger.instance;
|
return OpenViduLogger.instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private isDebugLogEnabled() {
|
private static isInvalidResponse(xhr: XMLHttpRequest) {
|
||||||
return this.isJSNLogSetup;
|
return xhr.status == 401 || xhr.status == 403 || xhr.status == 404 || xhr.status == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private canConfigureJSNLog(openVidu: OpenVidu, logger: OpenViduLogger): boolean {
|
private canConfigureJSNLog(openVidu: OpenVidu, logger: OpenViduLogger): boolean {
|
||||||
return openVidu.session.sessionId != logger.loggingSessionId
|
return openVidu.session.sessionId != logger.loggingSessionId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isOpenViduBrowserLogsDebugActive(openVidu: OpenVidu) {
|
||||||
|
return openVidu.sendBrowserLogs === OpenViduLoggerConfiguration.debug ||
|
||||||
|
openVidu.sendBrowserLogs === OpenViduLoggerConfiguration.debugApp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return console functions with jsnlog integration
|
||||||
|
private getConsoleWithJSNLog() {
|
||||||
|
return function(openViduLogger: OpenViduLogger){
|
||||||
|
return {
|
||||||
|
log: function(...args){
|
||||||
|
openViduLogger.defaultConsoleLogger.log.apply(openViduLogger.defaultConsoleLogger.logger, arguments);
|
||||||
|
if (openViduLogger.isJSNLogSetup) {
|
||||||
|
JL().info(arguments);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
info: function (...args) {
|
||||||
|
openViduLogger.defaultConsoleLogger.info.apply(openViduLogger.defaultConsoleLogger.logger, arguments);
|
||||||
|
if (openViduLogger.isJSNLogSetup) {
|
||||||
|
JL().info(arguments);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
debug: function(...args) {
|
||||||
|
openViduLogger.defaultConsoleLogger.debug.apply(openViduLogger.defaultConsoleLogger.logger, arguments);
|
||||||
|
},
|
||||||
|
warn: function (...args) {
|
||||||
|
openViduLogger.defaultConsoleLogger.warn.apply(openViduLogger.defaultConsoleLogger.logger, arguments);
|
||||||
|
if (openViduLogger.isJSNLogSetup) {
|
||||||
|
JL().warn(arguments);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (...args) {
|
||||||
|
openViduLogger.defaultConsoleLogger.error.apply(openViduLogger.defaultConsoleLogger.logger, arguments);
|
||||||
|
if (openViduLogger.isJSNLogSetup) {
|
||||||
|
JL().error(arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private replaceWindowConsole() {
|
||||||
|
window.console = this.defaultConsoleLogger.logger;
|
||||||
|
window.console.log = this.getConsoleWithJSNLog().log;
|
||||||
|
window.console.info = this.getConsoleWithJSNLog().info;
|
||||||
|
window.console.debug = this.getConsoleWithJSNLog().debug;
|
||||||
|
window.console.warn = this.getConsoleWithJSNLog().warn;
|
||||||
|
window.console.error = this.getConsoleWithJSNLog().error;
|
||||||
|
}
|
||||||
|
|
||||||
|
private disableLogger() {
|
||||||
|
JL.setOptions({enabled: false});
|
||||||
|
this.isJSNLogSetup = false;
|
||||||
|
this.loggingSessionId = undefined;
|
||||||
|
this.currentAppender = undefined;
|
||||||
|
window.console = this.defaultConsoleLogger.logger;
|
||||||
|
window.console.log = this.defaultConsoleLogger.log;
|
||||||
|
window.console.info = this.defaultConsoleLogger.info;
|
||||||
|
window.console.debug = this.defaultConsoleLogger.debug;
|
||||||
|
window.console.warn = this.defaultConsoleLogger.warn;
|
||||||
|
window.console.error = this.defaultConsoleLogger.error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
log(...args: any[]) {
|
log(...args: any[]) {
|
||||||
if (!this.isProdMode) {
|
if (!this.isProdMode) {
|
||||||
this.LOG_FNS[0].apply(this.logger, arguments);
|
this.defaultConsoleLogger.log.apply(this.defaultConsoleLogger.logger, arguments);
|
||||||
}
|
}
|
||||||
if (this.isDebugLogEnabled()) {
|
if (this.isJSNLogSetup) {
|
||||||
JL().info(arguments);
|
JL().info(arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
debug(...args: any[]) {
|
debug(...args: any[]) {
|
||||||
if (!this.isProdMode) {
|
if (!this.isProdMode) {
|
||||||
this.LOG_FNS[1].apply(this.logger, arguments);
|
this.defaultConsoleLogger.debug.apply(this.defaultConsoleLogger.logger, arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
info(...args: any[]) {
|
info(...args: any[]) {
|
||||||
if (!this.isProdMode) {
|
if (!this.isProdMode) {
|
||||||
this.LOG_FNS[2].apply(this.logger, arguments);
|
this.defaultConsoleLogger.info.apply(this.defaultConsoleLogger.logger, arguments);
|
||||||
}
|
}
|
||||||
if (this.isDebugLogEnabled()) {
|
if (this.isJSNLogSetup) {
|
||||||
JL().info(arguments);
|
JL().info(arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
warn(...args: any[]) {
|
warn(...args: any[]) {
|
||||||
if (!this.isProdMode) {
|
if (!this.isProdMode) {
|
||||||
this.LOG_FNS[3].apply(this.logger, arguments);
|
this.defaultConsoleLogger.warn.apply(this.defaultConsoleLogger.logger, arguments);
|
||||||
}
|
}
|
||||||
if (this.isDebugLogEnabled()) {
|
if (this.isJSNLogSetup) {
|
||||||
JL().warn(arguments);
|
JL().warn(arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
error(...args: any[]) {
|
error(...args: any[]) {
|
||||||
this.LOG_FNS[4].apply(this.logger, arguments);
|
this.defaultConsoleLogger.error.apply(this.defaultConsoleLogger.logger, arguments);
|
||||||
if (this.isDebugLogEnabled()) {
|
if (this.isJSNLogSetup) {
|
||||||
JL().error(arguments);
|
JL().error(arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hidden
|
||||||
|
*/
|
||||||
flush() {
|
flush() {
|
||||||
if (this.isDebugLogEnabled() && this.currentAppender != null) {
|
if (this.isJSNLogSetup && this.currentAppender != null) {
|
||||||
this.currentAppender.sendBatch();
|
this.currentAppender.sendBatch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
export enum OpenViduLoggerConfiguration {
|
export enum OpenViduLoggerConfiguration {
|
||||||
disabled = 'disabled',
|
disabled = 'disabled',
|
||||||
debug = 'debug'
|
debug = 'debug',
|
||||||
|
debugApp = 'debugApp'
|
||||||
}
|
}
|
Loading…
Reference in New Issue