diff options
author | Evgeny Zinoviev <me@ch1p.io> | 2021-02-28 16:11:57 +0300 |
---|---|---|
committer | Evgeny Zinoviev <me@ch1p.io> | 2021-02-28 16:11:57 +0300 |
commit | feaa5065f900a9c031ca7d66d80957040e2ee99f (patch) | |
tree | c6dbaf2861364725df1c54a8ba3423ca273107e0 /src/lib/logger.js | |
parent | 142869948c40900569f339a2177e95a3be3bbdfb (diff) |
refactor: moved some files to lib/
Diffstat (limited to 'src/lib/logger.js')
-rw-r--r-- | src/lib/logger.js | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/lib/logger.js b/src/lib/logger.js new file mode 100644 index 0000000..260ba41 --- /dev/null +++ b/src/lib/logger.js @@ -0,0 +1,97 @@ +const log4js = require('log4js') +const fs = require('fs/promises') +const fsConstants = require('fs').constants +const util = require('src/lib/util') + +module.exports = { + /** + * @param {string} file + * @param {string} levelFile + * @param {string} levelConsole + */ + async init({file, levelFile, levelConsole}) { + const categories = { + default: { + appenders: ['stdout-filter'], + level: 'trace' + } + } + + const appenders = { + stdout: { + type: 'stdout', + level: 'trace' + }, + 'stdout-filter': { + type: 'logLevelFilter', + appender: 'stdout', + level: levelConsole + } + } + + if (file) { + let exists + try { + await fs.stat(file) + exists = true + } catch (error) { + exists = false + } + + // if file exists + if (exists) { + // see if it's writable + try { + // this promise fullfills with undefined upon success + await fs.access(file, fsConstants.W_OK) + } catch (error) { + throw new Error(`file '${file}' is not writable:` + error.message) + } + } else { + // try to create an empty file + let fd + try { + fd = await fs.open(file, 'wx') + } catch (error) { + throw new Error(`failed to create file '${file}': ` + error.message) + } finally { + await fd?.close() + } + } + + categories.default.appenders.push('file-filter') + appenders.file = { + type: 'file', + filename: file, + maxLogSize: 1024 * 1024 * 50, + debug: 'debug' + } + appenders['file-filter'] = { + type: 'logLevelFilter', + appender: 'file', + level: levelFile + } + } + + log4js.configure({ + appenders, + categories + }) + }, + + /** + * @return {Logger} + */ + getLogger(...args) { + return log4js.getLogger(...args) + }, + + /** + * @param cb + */ + shutdown(cb) { + log4js.shutdown(cb) + }, + + Logger: log4js.Logger, +} |