Added logging system
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
51
server/src/helpers/logger.ts
Normal file
51
server/src/helpers/logger.ts
Normal 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'))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.')
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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 })
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user