實現node日誌管理

第一次寫node項目,以前除了前端的腳手架構建接觸過一些簡單的,因此老是碰到不少坑。好比權限驗證,好比異常處理,好比日誌管理。 在看log4js使用方法的時候忽然想到本身就能夠實現簡單的業務,不須要藉助組件,雖然簡單可是實現了挺開心的。前端

爲何須要日誌管理

本身的node項目寫了一段時間了,但一直沒有加上日誌管理的功能,由於以爲不必,不少時候都是在本身電腦上面調試的。 但忽然有一天在線上訪問本身的項目,發現頁面報錯了,想知道爲何報錯了,發現居然沒有什麼很好的方法,若是我沒有經過一個東西去記錄的話,因此日誌管理這個時候就顯得尤其重要了。node

日誌的產生過程

  • 頁面出現錯誤
  • 根據錯誤類型建立日誌文件
  • 寫入錯誤信息

建立日誌方法的實現

  • 先判斷要寫入的路徑是否存在,不存在則建立
  • 判斷日誌要建立在的文件夾存不存在,不存在則建立
  • 判斷當前要建立的日誌存不存在,存在繼續寫入,不存在則建立並寫入

fs.stat

檢查路徑是否存在git

fs.mkdir

建立目錄的方法github

fs.readFile

讀取文件的方法sql

fs.writeFile

寫入文件的方法json

完成的寫入日誌函數

個人業務是定義了兩個類型,錯誤和sql,而後傳入日誌內容bash

/**
   * 寫入日誌
   * @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)
        }
      })
    })
  }
複製代碼

使用

在sql執行函數上使用

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: '服務器內部錯誤'
    })
  }
複製代碼

最後

日誌完整代碼服務器

node項目 對應的前端項目架構

相關文章
相關標籤/搜索