Merge pull request #112 from Joe-Dowd/logging-change

Logging change
This commit is contained in:
Ajay Ramachandran
2020-08-22 16:05:48 -04:00
committed by GitHub
13 changed files with 113 additions and 36 deletions

9
Dockerfile Normal file
View File

@@ -0,0 +1,9 @@
FROM node:12
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY index.js .
COPY src src
COPY entrypoint.sh .
EXPOSE 8080
CMD ./entrypoint.sh

26
entrypoint.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/bin/bash
set -e
echo 'Entrypoint script'
cd /usr/src/app
cp /etc/sponsorblock/config.json . || cat <<EOF > config.json
{
"port": 8080,
"globalSalt": "[CHANGE THIS]",
"adminUserID": "[CHANGE THIS]",
"youtubeAPIKey": null,
"discordReportChannelWebhookURL": null,
"discordFirstTimeSubmissionsWebhookURL": null,
"discordAutoModWebhookURL": null,
"proxySubmission": null,
"behindProxy": "X-Forwarded-For",
"db": "./databases/sponsorTimes.db",
"privateDB": "./databases/private.db",
"createDatabaseIfNotExist": true,
"schemaFolder": "./databases",
"dbSchema": "./databases/_sponsorTimes.db.sql",
"privateDBSchema": "./databases/_private.db.sql",
"mode": "development",
"readOnly": false
}
EOF
node index.js

View File

@@ -1,8 +1,10 @@
var MysqlInterface = require('sync-mysql'); var MysqlInterface = require('sync-mysql');
var config = require('../config.js');
var logger = require('../utils/logger.js');
class Mysql { class Mysql {
constructor(config) { constructor(msConfig) {
this.connection = new MysqlInterface(config); this.connection = new MysqlInterface(msConfig);
} }
exec(query) { exec(query) {
@@ -10,7 +12,7 @@ class Mysql {
} }
prepare (type, query, params) { prepare (type, query, params) {
(config.mode === "development") && console.log("prepare (mysql): type: " + type + ", query: " + query + ", params: " + params); logger.debug("prepare (mysql): type: " + type + ", query: " + query + ", params: " + params);
if (type === 'get') { if (type === 'get') {
return this.connection.query(query, params)[0]; return this.connection.query(query, params)[0];
} else if (type === 'run') { } else if (type === 'run') {
@@ -18,7 +20,7 @@ class Mysql {
} else if (type === 'all') { } else if (type === 'all') {
return this.connection.query(query, params); return this.connection.query(query, params);
} else { } else {
console.log('returning undefined...') logger.warn('returning undefined...');
return undefined; return undefined;
} }
} }

View File

@@ -1,4 +1,6 @@
const { db } = require("./databases"); const { db } = require("./databases");
var config = require('../config.js');
const logger = require('../utils/logger.js');
class Sqlite { class Sqlite {
constructor(connection) { constructor(connection) {
@@ -17,8 +19,8 @@ class Sqlite {
} else if (type === 'all') { } else if (type === 'all') {
return this.connection.prepare(query).all(...params); return this.connection.prepare(query).all(...params);
} else { } else {
(config.mode === "development") && console.log('returning undefined...') logger.debug('sqlite query: returning undefined')
(config.mode === "development") && console.log("prepare: type: " + type + ", query: " + query + ", params: " + params); logger.debug("prepare: type: " + type + ", query: " + query + ", params: " + params);
return undefined; return undefined;
} }
} }

View File

@@ -1,7 +1,6 @@
var fs = require('fs'); const log = require('../utils/logger.js'); // log not logger to not interfere with function name
var config = require('../config.js');
module.exports = function logger (req, res, next) { module.exports = function logger (req, res, next) {
(config.mode === "development") && console.log('Request recieved: ' + req.url); log.info('Request recieved: ' + req.url);
next(); next();
} }

View File

@@ -5,6 +5,7 @@ var databases = require('../databases/databases.js');
var db = databases.db; var db = databases.db;
var privateDB = databases.privateDB; var privateDB = databases.privateDB;
var logger = require('../utils/logger.js');
var getHash = require('../utils/getHash.js'); var getHash = require('../utils/getHash.js');
var getIP = require('../utils/getIP.js'); var getIP = require('../utils/getIP.js');
@@ -166,7 +167,7 @@ function handleGetSegments(req, res) {
return segments; return segments;
} catch (error) { } catch (error) {
console.error(error); logger.error(error);
res.sendStatus(500); res.sendStatus(500);
return false; return false;

View File

@@ -1,6 +1,7 @@
var db = require('../databases/databases.js').db; var db = require('../databases/databases.js').db;
var getHash = require('../utils/getHash.js'); var getHash = require('../utils/getHash.js');
const logger = require('../utils/logger.js');
module.exports = function getUsername (req, res) { module.exports = function getUsername (req, res) {
let userID = req.query.userID; let userID = req.query.userID;
@@ -28,7 +29,7 @@ module.exports = function getUsername (req, res) {
}); });
} }
} catch (err) { } catch (err) {
console.log(err); logger.error(err);
res.sendStatus(500); res.sendStatus(500);
return; return;

View File

@@ -1,6 +1,6 @@
var db = require('../databases/databases.js').db; var db = require('../databases/databases.js').db;
var getHash = require('../utils/getHash.js'); var getHash = require('../utils/getHash.js');
var logger = require('../utils/logger.js');
module.exports = function getViewsForUser(req, res) { module.exports = function getViewsForUser(req, res) {
let userID = req.query.userID; let userID = req.query.userID;
@@ -25,7 +25,7 @@ module.exports = function getViewsForUser(req, res) {
res.sendStatus(404); res.sendStatus(404);
} }
} catch (err) { } catch (err) {
console.log(err); logger.error(err);
res.sendStatus(500); res.sendStatus(500);
return; return;

View File

@@ -1,5 +1,3 @@
var config = require('../config.js');
var postSkipSegments = require('./postSkipSegments.js'); var postSkipSegments = require('./postSkipSegments.js');
module.exports = async function submitSponsorTimes(req, res) { module.exports = async function submitSponsorTimes(req, res) {

View File

@@ -4,6 +4,7 @@ var databases = require('../databases/databases.js');
var db = databases.db; var db = databases.db;
var privateDB = databases.privateDB; var privateDB = databases.privateDB;
var YouTubeAPI = require('../utils/youtubeAPI.js'); var YouTubeAPI = require('../utils/youtubeAPI.js');
var logger = require('../utils/logger.js');
var request = require('request'); var request = require('request');
var isoDurations = require('iso8601-duration'); var isoDurations = require('iso8601-duration');
@@ -25,7 +26,7 @@ function sendDiscordNotification(userID, videoID, UUID, segmentInfo) {
id: videoID id: videoID
}, function (err, data) { }, function (err, data) {
if (err || data.items.length === 0) { if (err || data.items.length === 0) {
err && console.log(err); err && logger.error(err);
return; return;
} }
@@ -52,13 +53,13 @@ function sendDiscordNotification(userID, videoID, UUID, segmentInfo) {
} }
}, (err, res) => { }, (err, res) => {
if (err) { if (err) {
console.log("Failed to send first time submission Discord hook."); logger.error("Failed to send first time submission Discord hook.");
console.log(JSON.stringify(err)); logger.error(JSON.stringify(err));
console.log("\n"); logger.error("\n");
} else if (res && res.statusCode >= 400) { } else if (res && res.statusCode >= 400) {
console.log("Error sending first time submission Discord hook"); logger.error("Error sending first time submission Discord hook");
console.log(JSON.stringify(res)); logger.error(JSON.stringify(res));
console.log("\n"); logger.error("\n");
} }
}); });
}); });
@@ -105,7 +106,7 @@ async function autoModerateSubmission(submission, callback) {
} }
} else { } else {
if (config.mode === 'development') console.log("Skipped YouTube API"); logger.debug("Skipped YouTube API");
// Can't moderate the submission without calling the youtube API // Can't moderate the submission without calling the youtube API
// so allow by default. // so allow by default.
@@ -117,9 +118,9 @@ function proxySubmission(req) {
request.post(config.proxySubmission + '/api/skipSegments?userID='+req.query.userID+'&videoID='+req.query.videoID, {json: req.body}, (err, result) => { request.post(config.proxySubmission + '/api/skipSegments?userID='+req.query.userID+'&videoID='+req.query.videoID, {json: req.body}, (err, result) => {
if (config.mode === 'development') { if (config.mode === 'development') {
if (!err) { if (!err) {
console.log('Proxy Submission: ' + result.statusCode + ' ('+result.body+')'); logger.error('Proxy Submission: ' + result.statusCode + ' ('+result.body+')');
} else { } else {
console.log("Proxy Submission: Failed to make call"); logger.debug("Proxy Submission: Failed to make call");
} }
} }
}); });
@@ -264,7 +265,7 @@ module.exports = async function postSkipSegments(req, res) {
} catch (err) { } catch (err) {
//a DB change probably occurred //a DB change probably occurred
res.sendStatus(502); res.sendStatus(502);
console.log("Error when putting sponsorTime in the DB: " + videoID + ", " + segmentInfo.segment[0] + ", " + logger.error("Error when putting sponsorTime in the DB: " + videoID + ", " + segmentInfo.segment[0] + ", " +
segmentInfo.segment[1] + ", " + userID + ", " + segmentInfo.category + ". " + err); segmentInfo.segment[1] + ", " + userID + ", " + segmentInfo.category + ". " + err);
return; return;
@@ -274,7 +275,7 @@ module.exports = async function postSkipSegments(req, res) {
sendDiscordNotification(userID, videoID, UUID, segmentInfo); sendDiscordNotification(userID, videoID, UUID, segmentInfo);
} }
} catch (err) { } catch (err) {
console.error(err); logger.error(err);
res.sendStatus(500); res.sendStatus(500);

View File

@@ -3,6 +3,7 @@ var config = require('../config.js');
var db = require('../databases/databases.js').db; var db = require('../databases/databases.js').db;
var getHash = require('../utils/getHash.js'); var getHash = require('../utils/getHash.js');
const logger = require('../utils/logger.js');
module.exports = function setUsername(req, res) { module.exports = function setUsername(req, res) {
@@ -45,7 +46,7 @@ module.exports = function setUsername(req, res) {
res.sendStatus(200); res.sendStatus(200);
} catch (err) { } catch (err) {
console.log(err); logger.error(err);
res.sendStatus(500); res.sendStatus(500);
return; return;

View File

@@ -11,6 +11,7 @@ var db = databases.db;
var privateDB = databases.privateDB; var privateDB = databases.privateDB;
var YouTubeAPI = require('../utils/youtubeAPI.js'); var YouTubeAPI = require('../utils/youtubeAPI.js');
var request = require('request'); var request = require('request');
const logger = require('../utils/logger.js');
function categoryVote(UUID, userID, isVIP, category, hashedIP, res) { function categoryVote(UUID, userID, isVIP, category, hashedIP, res) {
// Check if they've already made a vote // Check if they've already made a vote
@@ -203,7 +204,7 @@ async function voteOnSponsorTime(req, res) {
id: submissionInfoRow.videoID id: submissionInfoRow.videoID
}, function (err, data) { }, function (err, data) {
if (err || data.items.length === 0) { if (err || data.items.length === 0) {
err && console.log(err); err && logger.error(err);
return; return;
} }
@@ -232,13 +233,13 @@ async function voteOnSponsorTime(req, res) {
} }
}, (err, res) => { }, (err, res) => {
if (err) { if (err) {
console.log("Failed to send reported submission Discord hook."); logger.error("Failed to send reported submission Discord hook.");
console.log(JSON.stringify(err)); logger.error(JSON.stringify(err));
console.log("\n"); logger.error("\n");
} else if (res && res.statusCode >= 400) { } else if (res && res.statusCode >= 400) {
console.log("Error sending reported submission Discord hook"); logger.error("Error sending reported submission Discord hook");
console.log(JSON.stringify(res)); logger.error(JSON.stringify(res));
console.log("\n"); logger.error("\n");
} }
}); });
}); });
@@ -299,7 +300,7 @@ async function voteOnSponsorTime(req, res) {
res.sendStatus(200); res.sendStatus(200);
} catch (err) { } catch (err) {
console.error(err); logger.error(err);
res.status(500).json({error: 'Internal error creating segment vote'}); res.status(500).json({error: 'Internal error creating segment vote'});
} }

36
src/utils/logger.js Normal file
View File

@@ -0,0 +1,36 @@
const config = require('../config.js');
const levels = {
ERROR: "ERROR",
WARN: "WARN",
INFO: "INFO",
DEBUG: "DEBUG"
};
const settings = {
ERROR: true,
WARN: true,
INFO: false,
DEBUG: false
};
if (config.mode === 'development') {
settings.INFO = true;
settings.DEBUG = true;
}
function log(level, string) {
if (!!settings[level]) {
if (level.length === 4) {level = level + " "}; // ensure logs are aligned
console.log(level + " " + new Date().toISOString() + " : " + string);
}
}
module.exports = {
levels,
log,
error: (string) => {log(levels.ERROR, string)},
warn: (string) => {log(levels.WARN, string)},
info: (string) => {log(levels.INFO, string)},
debug: (string) => {log(levels.DEBUG, string)},
};