From 6332f297cb58af26cbb1092d7f23900693d473a7 Mon Sep 17 00:00:00 2001 From: Douglas Barone Date: Fri, 18 Dec 2020 12:07:33 -0400 Subject: [PATCH] Replaced all console.log with new logger function --- server/src/classes/User.js | 39 +++++++++-- server/src/cronTasks.js | 65 +++++++++++++------ server/src/index.js | 28 ++++---- .../src/lib/activeDirectory/passwordUtils.js | 12 +++- server/src/lib/ciscoController.js | 7 +- server/src/lib/logger.js | 38 +++++++++-- server/src/lib/paloalto.js | 8 ++- server/src/lib/wifiDevices.js | 15 ++++- 8 files changed, 163 insertions(+), 49 deletions(-) diff --git a/server/src/classes/User.js b/server/src/classes/User.js index 6fc2bc0..1e27194 100755 --- a/server/src/classes/User.js +++ b/server/src/classes/User.js @@ -8,6 +8,7 @@ import config from '../lib/activeDirectory/config' import jwt from 'jsonwebtoken' import { pubsub, AUTH_UPDATED } from '../pubsub' +import { logError, logInfo, logSuccess, logWarning } from '../lib/logger' class User { constructor(username) { @@ -139,7 +140,11 @@ class User { client.on('error', err => { client.unbind(() => { - console.log('Client unbinded due error.') + logError({ + message: 'Client unbinded due error.', + data: err, + tags: ['ldap'] + }) }) reject(new Error(err.message)) }) @@ -186,13 +191,21 @@ class User { (err, result) => { if (err) { client.unbind(() => { - console.log('Client unbinded due error.') + logError({ + message: 'Client unbinded. Error updating password', + data: err, + tags: ['ldap'] + }) }) reject(new Error(err.message)) } else { User.upsertUser(this.username) client.unbind(() => { - console.log('Client unbinded') + logSuccess({ + message: `Client unbinded. Password updated for user ${this.username}`, + data: result, + tags: ['ldap'] + }) }) resolve(User.login(this.username, newPassword)) } @@ -315,21 +328,30 @@ class User { static async importAllUsers() { if (this.working) { - console.log('Já há uma importação em andamento') + logWarning({ + tags: ['user'], + message: 'User import aborted: already working' + }) return 0 } this.working = true try { - console.log('Obtendo usuários do AD...') + logInfo({ + tags: ['user'], + message: 'Importing users from Active Directory' + }) const allAdUsers = await ad.findUsers({ paged: true, filter: '(!(userAccountControl:1.2.840.113556.1.4.803:=2))' // Only active users }) - console.log('Importando usuários...') + logInfo({ + tags: ['user'], + message: 'Importing users to database' + }) await Promise.all( allAdUsers.map(async user => @@ -343,7 +365,10 @@ class User { ) ) - console.log(`${allAdUsers.length} usuários importados`) + logSuccess({ + tags: ['user'], + message: `${allAdUsers.length} usuários importados` + }) return allAdUsers.length } catch (e) { diff --git a/server/src/cronTasks.js b/server/src/cronTasks.js index 04400ae..1a842ea 100644 --- a/server/src/cronTasks.js +++ b/server/src/cronTasks.js @@ -1,51 +1,78 @@ import cron from 'node-cron' import { updateDevicesInfo } from './lib/wifiDevices' import { User } from './classes/User' -import { format } from 'date-fns' + import oui from 'oui' -import { log } from './lib/logger' +import { deleteOldLogs, log, logInfo, logSuccess } from './lib/logger' import { updateUserIdMappings } from './lib/paloalto' -function cronLog(message) { - log({ - level: 'INFO', - tags: ['cron'], - message, - data: { message } - }) -} - -cronLog('Scheduling tasks...') +logInfo({ + tags: ['cron'], + message: 'Scheduling tasks...' +}) cron.schedule('*/1 * * * *', async () => { - cronLog('updateDevicesInfo started.') + logInfo({ + tags: ['cron', 'wifiDevices'], + message: 'updateDevicesInfo started' + }) const devices = await updateDevicesInfo() - cronLog(`updateDevicesInfo updated ${devices} devices.`) + logSuccess({ + tags: ['cron', 'wifiDevices'], + message: `updateDevicesInfo updated ${devices} devices` + }) let mappings = 0 if (devices > 0) { - cronLog('updateUserIdMappings started.') + logInfo({ + tags: ['cron', 'user-id'], + message: `updateUserIdMappings started` + }) + mappings = await updateUserIdMappings() - cronLog(`updateUserIdMappings updated ${mappings} user-id mappings.`) + + logSuccess({ + tags: ['cron', 'user-id'], + message: `updateUserIdMappings updated ${mappings} user-id mappings` + }) } }) cron.schedule( '0 0 0 * * *', async () => { - cronLog('User.importAllUsers started') + logInfo({ + tags: ['cron', 'user'], + message: `User.importAllUsers started` + }) + await User.importAllUsers() - cronLog('User.importAllUsers finished') + + logSuccess({ + tags: ['cron', 'user'], + message: `User.importAllUsers finished` + }) }, {} ) cron.schedule('0 0 0 * * *', async () => { await oui.update() - cronLog('Oui updated') + logSuccess({ + tags: ['cron', 'oui'], + message: `OUI list updated` + }) +}) + +cron.schedule('0 0 0 * * *', async () => { + await deleteOldLogs() + logSuccess({ + tags: ['cron', 'log'], + message: `Old logs deleted` + }) }) diff --git a/server/src/index.js b/server/src/index.js index 784608b..99a45e8 100755 --- a/server/src/index.js +++ b/server/src/index.js @@ -1,21 +1,27 @@ import {} from 'dotenv/config' import '@babel/polyfill/noConflict' import './utils/capitalize' - +import { logInfo, logSuccess } from './lib/logger' import { server } from './server' import './cronTasks' -console.log( - process.env.NODE_ENV === 'production' - ? '[Running in production]' - : '[Running in development]' -) +logInfo({ + tags: ['server'], + level: 'SUCCESS', + message: + process.env.NODE_ENV === 'production' + ? 'Running in production' + : 'Running in development' +}) server.listen().then(options => { - console.log( - `\n---\nServer ready!`, - `\nEndpoint: ${options.url}graphql`, - `\nWebSocket: ${options.subscriptionsUrl}\n---` - ) + logSuccess({ + tags: ['server'], + message: `Server ready!` + }) + logInfo({ + tags: ['server'], + message: `Endpoint: ${options.url}graphql - WebSocket: ${options.subscriptionsUrl}` + }) }) diff --git a/server/src/lib/activeDirectory/passwordUtils.js b/server/src/lib/activeDirectory/passwordUtils.js index eb07de6..cf9706b 100755 --- a/server/src/lib/activeDirectory/passwordUtils.js +++ b/server/src/lib/activeDirectory/passwordUtils.js @@ -2,6 +2,7 @@ import config from './config' import { createClient, Change } from 'ldapjs' import { User } from '../../classes/User' import { encodePassword } from './encodePassword' +import { logError, logSuccess } from '../logger' const replacePassword = (username, newPassword) => { return new Promise((resolve, reject) => { @@ -45,11 +46,20 @@ const replacePassword = (username, newPassword) => { (err, result) => { if (err) { client.unbind(() => { - console.log('Client unbinded due error.') + logError({ + tags: ['user', 'replacePassword'], + message: 'Error raplacing password', + data: err + }) }) reject(new Error(err.message)) } else { User.upsertUser(username) + logSuccess({ + tags: ['user', 'replacePassword'], + message: `Password updated for user ${username}`, + data: result + }) resolve('Senha alterada com sucesso!') } } diff --git a/server/src/lib/ciscoController.js b/server/src/lib/ciscoController.js index f978a3a..6620fe6 100644 --- a/server/src/lib/ciscoController.js +++ b/server/src/lib/ciscoController.js @@ -1,6 +1,7 @@ import { create } from 'axios' import https from 'https' import { ouiFinder } from '../utils/ouiFinder' +import { logError } from './logger' const httpsAgent = new https.Agent({ rejectUnauthorized: false, @@ -37,7 +38,11 @@ async function getDevices() { return devices } catch (e) { - console.log('[Cisco Controller]', e.message) + logError({ + tags: ['cisco', 'wifiDevices'], + message: e.message, + data: e + }) return [] } } diff --git a/server/src/lib/logger.js b/server/src/lib/logger.js index 449b37d..ea17acb 100644 --- a/server/src/lib/logger.js +++ b/server/src/lib/logger.js @@ -1,5 +1,5 @@ import prisma from '../prisma' -import { format } from 'date-fns' +import { format, subDays } from 'date-fns' async function log({ level, tags = [], message = '', data }) { const logEntry = await prisma.log.create({ @@ -7,7 +7,7 @@ async function log({ level, tags = [], message = '', data }) { level, tags, message, - data + data: { ...data, msg: message } } }) @@ -19,11 +19,37 @@ async function log({ level, tags = [], message = '', data }) { ERROR: '\x1b[31m' }[logEntry.level] + const entryTags = logEntry.tags.length ? ` [${logEntry.tags}] ` : '' + console.log( - `${color}[${format(logEntry.timestamp, 'HH:mm:ss')}] [${ - logEntry.tags - }] \x1b[0m ${logEntry.message}` + `${color}[${format(logEntry.timestamp, 'HH:mm:ss')}]${entryTags}\x1b[0m${ + logEntry.message + }` ) } -export { log } +function logLow({ tags, message, data }) { + log({ level: 'LOW', tags: tags, message, data }) +} + +function logInfo({ tags, message, data }) { + log({ level: 'INFO', tags: tags, message, data }) +} + +function logSuccess({ tags, message, data }) { + log({ level: 'SUCCESS', tags: tags, message, data }) +} +function logWarning({ tags, message, data }) { + log({ level: 'WARNING', tags: tags, message, data }) +} +function logError({ tags, message, data }) { + log({ level: 'ERROR', tags: tags, message, data }) +} + +async function deleteOldLogs() { + return prisma.log.deleteMany({ + where: { timestamp: { lt: subDays(new Date(), 30) } } + }) +} + +export { log, logLow, logInfo, logSuccess, logWarning, logError, deleteOldLogs } diff --git a/server/src/lib/paloalto.js b/server/src/lib/paloalto.js index c3cb74e..7fc206f 100644 --- a/server/src/lib/paloalto.js +++ b/server/src/lib/paloalto.js @@ -5,6 +5,7 @@ import prisma from '../prisma' import https from 'https' import { subMinutes } from 'date-fns' import qs from 'qs' +import { logError } from './logger' const DEBOUNCE_TIME_IN_MS = 5000 const TIMEOUT_IN_MINUTES = '3' @@ -72,7 +73,12 @@ async function updateUserIdMappings() { return wifiDevices.length } catch (e) { - console.log('Error updating user-id mappings:', e.message) + logError({ + tags: ['paloalto', 'user-id'], + message: `Error updating user-id mappings: ${e.message}`, + data: e + }) + return 'Não foi possível atualizar. Veja o log do servidor' } finally { setTimeout(() => { diff --git a/server/src/lib/wifiDevices.js b/server/src/lib/wifiDevices.js index 058db3a..f67cd1c 100644 --- a/server/src/lib/wifiDevices.js +++ b/server/src/lib/wifiDevices.js @@ -5,6 +5,7 @@ import { getOnlineWifiDevices as getOnlineCiscoDevices } from './ciscoController import prisma from '../prisma' import { pubsub, USER_PRESENCE_UPDATED } from '../pubsub' +import { logError } from './logger' const DEBOUNCE_TIME_MS = 10000 const RECENT_THRESHOLD_IN_MINUTES = 3 @@ -83,8 +84,11 @@ async function updateDB(onlineDevices) { } }) } catch (e) { - if (!['P2016'].includes(e.code)) - console.log('[wifiDevice upsert error]', e) + logError({ + tags: ['wifiDevices'], + message: `Error trying to upsert device with mac "${device.mac}": ${e.message}`, + data: { error: e, device } + }) } } } @@ -107,7 +111,12 @@ async function updateDevicesInfo() { return onlineDevices.length } catch (e) { - console.log('Error updating Wi-Fi devices: ', e) + logError({ + tags: ['wifiDevices'], + message: `Error updating Wi-Fi devices: ${e.message}`, + data: e + }) + return 0 } finally { setTimeout(() => {