Added logging system

This commit is contained in:
RemixDev
2022-02-28 14:58:25 +01:00
parent e1f7451e51
commit 1e14eb5b6b
16 changed files with 258 additions and 63 deletions

View File

@@ -8,6 +8,7 @@ import { Settings, Listener } from './types'
import { NotLoggedIn } from './helpers/errors'
import { GUI_PACKAGE } from './helpers/paths'
import { logger } from './helpers/logger'
// Types
const Downloader = deemix.downloader.Downloader
@@ -70,7 +71,7 @@ export class DeemixApp {
retry: 5
})
} catch (e) {
console.trace(e)
logger.error(e)
this.deezerAvailable = 'no-network'
return this.deezerAvailable
}
@@ -90,7 +91,7 @@ export class DeemixApp {
}
})
} catch (e) {
console.trace(e)
logger.error(e)
this.latestVersion = 'NotFound'
return this.latestVersion
}
@@ -111,7 +112,7 @@ export class DeemixApp {
commit: matchResult[5] || ''
}
} catch (e) {
console.trace(e)
logger.error(e)
return null
}
}
@@ -168,7 +169,7 @@ export class DeemixApp {
for (let i = 0; i < url.length; i++) {
link = url[i]
console.log(`Adding ${link} to queue`)
logger.info(`Adding ${link} to queue`)
let downloadObj
try {
downloadObj = await deemix.generateDownloadObject(dz, link, bitrate, this.plugins, this.listener)
@@ -182,7 +183,7 @@ export class DeemixApp {
if (downloadErrors.length) {
downloadErrors.forEach((e: any) => {
if (!e.errid) console.trace(e)
if (!e.errid) logger.error(e)
this.listener.send('queueError', { link: e.link, error: e.message, errid: e.errid })
})
}
@@ -280,7 +281,7 @@ export class DeemixApp {
this.queue[currentUUID] = savedObject
fs.writeFileSync(configFolder + `queue${sep}${currentUUID}.json`, JSON.stringify(savedObject))
}
console.log(this.queueOrder)
logger.info(this.queueOrder)
fs.writeFileSync(configFolder + `queue${sep}order.json`, JSON.stringify(this.queueOrder))
this.currentJob = null

View File

@@ -1,10 +1,3 @@
import { concat } from 'ramda'
const prependDeemix = concat('[deemix-server]: ')
export const consoleInfo = (infoText: string) => console.info(prependDeemix(infoText))
export const consoleError = (errorText: string) => console.error(prependDeemix(errorText))
export class BadRequestError extends Error {
constructor() {
super()

View File

@@ -0,0 +1,51 @@
import fs from 'fs'
import { join as joinPath } from 'path'
import os from 'os'
import dateFormat from 'dateformat'
import { createLogger, format, transports } from 'winston'
// @ts-expect-error
import deemix from 'deemix'
const { combine, timestamp, errors, colorize, printf } = format
const logFolder: string = joinPath(deemix.utils.localpaths.getConfigFolder(), 'logs')
const logFilename = joinPath(logFolder, `${dateFormat(new Date(), 'yyyy-mm-dd-HH.MM.ss')}.log`)
const logFormat = printf(error => {
const { level, message, timestamp, stack } = error
let result = `${timestamp} [${level}] ${message}`
if (stack && !message.startsWith('uncaughtException')) result += '\n' + stack + '\n'
return result
})
export const logger = createLogger({
format: combine(errors({ stack: true }), timestamp(), logFormat),
transports: [
new transports.File({
handleExceptions: true,
handleRejections: true,
format: combine(errors({ stack: true }), timestamp(), logFormat),
filename: logFilename
}),
new transports.Console({
handleExceptions: true,
handleRejections: true,
format: combine(errors({ stack: true }), colorize(), timestamp(), logFormat)
})
]
})
export function removeOldLogs(logFilesNumber: number) {
if (!fs.existsSync(logFolder)) fs.mkdirSync(logFolder, { recursive: true })
fs.appendFileSync(logFilename, `${os.platform()} - ${os.type()} ${os.release()} ${os.arch()}\n\n`)
const files = fs.readdirSync(logFolder)
const logs: Array<string> = []
files.forEach(function (file) {
logs.push(file.substring(0, file.length - 4))
})
logs.sort()
if (logs.length > logFilesNumber) {
for (let i = 0; i < logs.length - logFilesNumber; i++) {
fs.unlinkSync(joinPath(logFolder, logs[i] + '.log'))
}
}
}

View File

@@ -1,6 +1,6 @@
import http from 'http'
import type { Debugger } from 'debug'
import { consoleInfo } from './errors'
import { logger } from './logger'
/**
* Event listener for HTTP server "error" event.
@@ -18,11 +18,11 @@ export function getErrorCb(port: number | string | boolean) {
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES': {
console.error(bind + ' requires elevated privileges')
logger.error(bind + ' requires elevated privileges')
process.exit(1)
}
case 'EADDRINUSE': {
console.error(bind + ' is already in use')
logger.error(bind + ' is already in use')
process.exit(1)
}
default:
@@ -44,7 +44,7 @@ export function getListeningCb(server: http.Server, debug: Debugger) {
const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port
debug(`Listening on ${bind}`)
consoleInfo(`Listening on ${bind}`)
logger.info(`Listening on ${bind}`)
}
}
}

View File

@@ -5,7 +5,8 @@ import { ApiHandler } from '../../../types'
import { sessionDZ } from '../../../app'
import { isObjectEmpy } from '../../../helpers/primitive-checks'
import { BadRequestError, isBadRequestError, consoleError } from '../../../helpers/errors'
import { BadRequestError, isBadRequestError } from '../../../helpers/errors'
import { logger } from '../../../helpers/logger'
export interface RawChartTracksQuery {
id: string
@@ -32,7 +33,7 @@ const handler: RequestHandler<{}, {}, {}, RawChartTracksQuery> = async (req, res
return res.status(200).send(response)
} catch (error) {
if (isBadRequestError(error)) {
consoleError(error.message)
logger.error(error.message)
res.status(400).send()
return next()
}

View File

@@ -2,6 +2,7 @@
import { Deezer } from 'deezer-js'
import { ApiHandler } from '../../../types'
import { sessionDZ } from '../../../app'
import { logger } from '../../../helpers/logger'
const path: ApiHandler['path'] = '/addToQueue'
@@ -24,7 +25,7 @@ const handler: ApiHandler['handler'] = async (req, res) => {
deemix.listener.send('loginNeededToDownload')
break
default:
console.error(e)
logger.error(e)
res.send({ result: false, errid: e.name, data: { url, bitrate } })
break
}

View File

@@ -3,6 +3,7 @@ import { RequestHandler } from 'express'
import { Deezer } from 'deezer-js'
import { sessionDZ } from '../../../app'
import { ApiHandler } from '../../../types'
import { logger } from '../../../helpers/logger'
export interface RawLoginArlBody {
arl: string
@@ -47,7 +48,7 @@ const handler: RequestHandler<{}, {}, RawLoginArlBody, {}> = async (req, res, _)
try {
response = await dz.login_via_arl(...loginParams)
} catch (e) {
console.trace(e)
logger.error(e)
response = false
}
response = response ? 1 : 0

View File

@@ -1,7 +1,7 @@
import express from 'express'
// @ts-expect-error
import { Deezer } from 'deezer-js'
import { consoleInfo } from '../helpers/errors'
import { logger } from '../helpers/logger'
import { sessionDZ, deemixVersion, currentVersion } from '../app'
const router = express.Router()
@@ -13,8 +13,8 @@ router.get('/connect', async (req, res) => {
const deemix = req.app.get('deemix')
if (!update) {
consoleInfo(`Currently running deemix-gui version ${currentVersion}`)
consoleInfo(`deemix-lib version ${deemixVersion}`)
logger.info(`Currently running deemix-gui version ${currentVersion}`)
logger.info(`deemix-lib version ${deemixVersion}`)
update = {
currentCommit: currentVersion,
deemixVersion

View File

@@ -9,7 +9,7 @@ import indexRouter from './routes'
import { getErrorCb, getListeningCb } from './helpers/server-callbacks'
import { registerApis } from './routes/api/register'
import { registerWebsocket } from './websocket'
import { consoleInfo } from './helpers/errors'
import { logger, removeOldLogs } from './helpers/logger'
import { Port, Listener } from './types'
import { DeemixApp } from './app'
import { normalizePort } from './helpers/port'
@@ -34,7 +34,7 @@ export class DeemixServer {
const listener: Listener = {
send: (key: string, data?: any) => {
const logLine = deemix.utils.formatListener(key, data)
if (logLine) console.log(logLine)
if (logLine) logger.info(logLine)
if (['downloadInfo', 'downloadWarn'].includes(key)) return
this.wss.clients.forEach(client => {
if (client.readyState === WsOpen) {
@@ -72,10 +72,10 @@ export class DeemixServer {
/* === Server callbacks === */
this.app.on('mount', a => {
console.log(a)
logger.info(a)
})
this.server.on('connect', () => {
consoleInfo('Server connected')
logger.info('Server connected')
})
this.server.on('upgrade', (request, socket, head) => {
this.wss.handleUpgrade(request, socket, head, socket => {
@@ -84,5 +84,8 @@ export class DeemixServer {
})
this.server.on('error', getErrorCb(this.port))
this.server.on('listening', getListeningCb(this.server, debug))
/* === Remove Old logs files === */
removeOldLogs(5)
}
}

View File

@@ -1,6 +1,6 @@
import { Server as WsServer } from 'ws'
import { consoleError, consoleInfo } from '../helpers/errors'
import { logger } from '../helpers/logger'
import { DeemixApp } from '../app'
import wsModules from './modules'
@@ -18,10 +18,10 @@ export const registerWebsocket = (wss: WsServer, deemix: DeemixApp) => {
})
wss.on('error', () => {
consoleError('An error occurred to the WebSocket server.')
logger.error('An error occurred to the WebSocket server.')
})
wss.on('close', () => {
consoleInfo('Connection to the WebSocket server closed.')
logger.info('Connection to the WebSocket server closed.')
})
}

View File

@@ -1,12 +1,12 @@
import { Server as WsServer } from 'ws'
import { consoleInfo } from '../../helpers/errors'
import { logger } from '../../helpers/logger'
import { DeemixApp } from '../../app'
const eventName = 'cancelAllDownloads'
const cb = (_: any, __: any, ___: WsServer, deemix: DeemixApp) => {
deemix.cancelAllDownloads()
consoleInfo(`Queue cleared`)
logger.info(`Queue cleared`)
}
export default { eventName, cb }

View File

@@ -1,12 +1,12 @@
import { Server as WsServer } from 'ws'
import { consoleInfo } from '../../helpers/errors'
import { logger } from '../../helpers/logger'
import { DeemixApp } from '../../app'
const eventName = 'removeFinishedDownloads'
const cb = (_: any, __: any, ___: WsServer, deemix: DeemixApp) => {
deemix.clearCompletedDownloads()
consoleInfo('Completed downloads cleared')
logger.info('Completed downloads cleared')
}
export default { eventName, cb }

View File

@@ -1,12 +1,12 @@
import { Server as WsServer } from 'ws'
import { consoleInfo } from '../../helpers/errors'
import { logger } from '../../helpers/logger'
import { DeemixApp } from '../../app'
const eventName = 'removeFromQueue'
const cb = (data: any, __: any, ___: WsServer, deemix: DeemixApp) => {
deemix.cancelDownload(data)
consoleInfo(`Cancelled ${data}`)
logger.info(`Cancelled ${data}`)
}
export default { eventName, cb }

View File

@@ -1,5 +1,5 @@
import { Server as WsServer } from 'ws'
import { consoleInfo } from '../../helpers/errors'
import { logger } from '../../helpers/logger'
import { DeemixApp } from '../../app'
import { Settings, SpotifySettings } from '../../types'
@@ -13,7 +13,7 @@ export interface SaveSettingsData {
const cb = (data: SaveSettingsData, _: any, __: WsServer, deemix: DeemixApp) => {
const { settings, spotifySettings } = data
deemix.saveSettings(settings, spotifySettings)
consoleInfo('Settings saved')
logger.info('Settings saved')
deemix.listener.send('updateSettings', { settings, spotifySettings })
}