第一次写node项目,以前除了前端的脚手架构建接触过一些简单的,因此老是碰到不少坑。好比权限验证,好比异常处理,好比日志管理。
在看log4js使用方法的时候忽然想到本身就能够实现简单的业务,不须要借助组件,虽然简单可是实现了挺开心的。前端
本身的node项目写了一段时间了,但一直没有加上日志管理的功能,由于以为不必,不少时候都是在本身电脑上面调试的。
但忽然有一天在线上访问本身的项目,发现页面报错了,想知道为何报错了,发现居然没有什么很好的方法,若是我没有经过一个东西去记录的话,因此日志管理这个时候就显得尤其重要了。node
检查路径是否存在git
建立目录的方法github
读取文件的方法sql
写入文件的方法json
个人业务是定义了两个类型,错误和sql,而后传入日志内容服务器
/** * 写入日志 * @param {String} type // 日志类型 err 错误日志 sql sql日志 * @param {String} content */ writeLog (content, type = 'err') { // 建立不存在的文件夹 await this.dirExists(`log/file/${type}`) // 获取到文件files fs.readFile(`log/file/${type}/${utils.switchTime(new Date(), 'YYYY-MM-DD')}.log`, (err, data) => { if (err) { console.log(err) } // 写入文件 fs.writeFile(`log/file/${type}/${utils.switchTime(new Date(), 'YYYY-MM-DD')}.log`, `${data || ''}\n${content}`, async (err) => { if (err) { console.log(err) } }) }) }
function query (sql) { // 写入sql NodeLog.writeLog(sql, 'sql') return new Promise((resolve, reject) => { pool.getConnection((err, conn) => { if (err) { // 若是是链接断开,自动从新链接 if (err.code === 'PROTOCOL_CONNECTION_LOST') { setTimeout(query(), 2000); reject('断开重连'); } else { console.error(err.stack || err); reject(err); } } else { // 获得结果 conn.query(sql, (queryErr, result) => { if (queryErr) { reject(queryErr); } else { resolve(result); } // 释放链接 conn.release(); }) } }) }) }
handleException (req, res, e) { // 写入日志 NodeLog.writeLog(e) res.json({ code: e.errno || 20501, success: false, content: e, message: '服务器内部错误' }) }
日志完整代码架构