1. 程式人生 > >node.js專案改進之日誌系統

node.js專案改進之日誌系統

專案自帶的日誌模組koa-logger

專案自帶的日誌系統是很給力的,我們隨便啟動一下下程式,請求一下地址我們就會看到控制檯上出現一堆GET啊啥的是這樣的

logger

logger
超級簡單明瞭,通俗易懂,上面的輸出就是有一個GET請求請求了/目錄,然後處理這個get請求GET用時12ms(這段話是在app.js console.log的不算logger的)下面的處理請求GET,目錄是/,http響應碼是200,用時24ms 資料大小138b
真的是很厲害。但是這個logger不能夠生成本地日誌檔案和更加詳細的記錄。所以為了補全這個遺憾(不能叫缺點,本來人家就是隻負責控制檯輸出的)我們要再搗鼓另一個模組來處理這個問題。

日誌處理模組log4js

這個模組是個大而全的一各模組,有日誌等級分類,可以替換掉console.log輸出,可以生成本地的日誌檔案,甚至還可以傳送郵件把危險的日誌用郵件發出去((⊙﹏⊙)b神奇);

安裝log4js模組

建立log4js的配置檔案

log_config.js

'use strict';
var path = require('path');

//日誌根目錄
var baseLogPath = path.resolve(__dirname, '../logs')

//錯誤日誌目錄
var errorPath = "/error";
//錯誤日誌檔名
var
errorFileName = "error"; //錯誤日誌輸出完整路徑 var errorLogPath = baseLogPath + errorPath + "/" + errorFileName; // var errorLogPath = path.resolve(__dirname, "../logs/error/error"); //響應日誌目錄 var responsePath = "/response"; //響應日誌檔名 var responseFileName = "response"; //響應日誌輸出完整路徑 var responseLogPath = baseLogPath + responsePath + "/"
+ responseFileName; // var responseLogPath = path.resolve(__dirname, "../logs/response/response"); var log_config = { "appenders": [ //錯誤日誌 { "category":"errorLogger", //logger名稱 "type": "dateFile", //日誌型別 "filename": errorLogPath, //日誌輸出位置 "alwaysIncludePattern":true, //是否總是有後綴名 "pattern": "-yyyy-MM-dd-hh.log", //字尾,每小時建立一個新的日誌檔案 "path": errorPath //自定義屬性,錯誤日誌的根目錄 }, //響應日誌 { "category":"resLogger", "type": "dateFile", "filename": responseLogPath, "alwaysIncludePattern":true, "pattern": "-yyyy-MM-dd-hh.log", "path": responsePath } ], "levels": //設定logger名稱對應的的日誌等級 { "errorLogger":"ERROR", "resLogger":"ALL" }, "baseLogPath": baseLogPath //logs根目錄 } module.exports = log_config;

建立log4js的封裝模組

在app_need下面新建一檔案

log.js

'use strict';
var log4js = require('log4js');

var log_config = require('../config/log_config');

//載入配置檔案
log4js.configure(log_config);

var log = {};

var errorLogger = log4js.getLogger('errorLogger');
var resLogger = log4js.getLogger('resLogger');

//封裝錯誤日誌
log.logError = function (ctx, error, resTime) {
    if (ctx && error) {
        errorLogger.error(formatError(ctx, error, resTime));
    }
};

//封裝響應日誌
log.logResponse = function (ctx, resTime) {
    if (ctx) {
        resLogger.info(formatRes(ctx, resTime));
    }
};

//格式化響應日誌
var formatRes = function (ctx, resTime) {
    var logText = new String();

    //響應日誌開始
    logText += "\n" + "*************** response log start ***************" + "\n";

    //新增請求日誌
    logText += formatReqLog(ctx.request, resTime);

    //響應狀態碼
    logText += "response status: " + ctx.status + "\n";

    //響應內容
    logText += "response body: " + "\n" + JSON.stringify(ctx.body) + "\n";

    //響應日誌結束
    logText += "*************** response log end ***************" + "\n";

    return logText;

}

//格式化錯誤日誌
var formatError = function (ctx, err, resTime) {
    var logText = new String();

    //錯誤資訊開始
    logText += "\n" + "*************** error log start ***************" + "\n";

    //新增請求日誌
    logText += formatReqLog(ctx.request, resTime);

    //錯誤名稱
    logText += "err name: " + err.name + "\n";
    //錯誤資訊
    logText += "err message: " + err.message + "\n";
    //錯誤詳情
    logText += "err stack: " + err.stack + "\n";

    //錯誤資訊結束
    logText += "*************** error log end ***************" + "\n";

    return logText;
};

//格式化請求日誌
var formatReqLog = function (req, resTime) {

    var logText = new String();

    var method = req.method;
    //訪問方法
    logText += "request method: " + method + "\n";

    //請求原始地址
    logText += "request originalUrl:  " + req.originalUrl + "\n";

    //客戶端ip
    logText += "request client ip:  " + req.ip + "\n";

    //開始時間
    var startTime;
    //請求引數
    if (method === 'GET') {
        logText += "request query:  " + JSON.stringify(req.query) + "\n";
        // startTime = req.query.requestStartTime;
    } else {
        logText += "request body: " + "\n" + JSON.stringify(req.body) + "\n";
        // startTime = req.body.requestStartTime;
    }
    //伺服器響應時間
    logText += "response time: " + resTime + "\n";

    return logText;
}

module.exports = log;

監聽響應和錯誤

app.js的logger部分
修改的app.js初始部分

// logger
app.use(async (ctx, next) => {
  const start = new Date();
  await next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);//列印請求的方式請求的url和請求所花費的時間
});

修改為:

//log工具
const log = require('./app_need/log');
// logger
app.use(async (ctx, next) => {
  const start = new Date();
  try {
    await next();

    const ms = new Date() - start;
    log.logResponse(ctx,ms);
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);//列印請求的方式請求的url和請求所花費的時


  } catch (e) {
    const ms = new Date() - start;
    log.logError(ctx,error,ms);
  }
});

再安裝log4js的依賴包

在終端裡專案最外層目錄

npm install log4js --save

重啟

重啟一下,然後訪問最外層目錄一下,從控制檯看來是和原來一樣的,但是看看檔案目錄就會發現多出來了
個檔案目錄是這樣的:
log
log
然後開啟response-2017-xxxxxxx看看
res
完美記錄了我們的請求響應。

額外擴充套件

現在基本的log日誌系統已經成型了,功能很完備,但是還是可以再擴充套件一下的,具體擴充套件就不寫了只是說下思路,

首先是不是每小時一個log檔案是不是太多了呢,之後找起來也麻煩

我們可以修改下log_config模組,讓他在log檔案的外層再放置一層目錄,這層目錄是會隨著天數的不同而改變的,這樣我們的響應請求就會分門別類到天上了,每天的資料夾裡最多有24個log。
同理我們是不是可以再設定月層次的目錄,和年層次的目錄呢?

其次要是我們在伺服器沒有生成資料夾的許可權怎麼辦。

我們就在www目錄裡寫入一個檢查許可權的程式碼,如果沒有許可權就報錯。

再者如果說我們想生成個測試log怎麼辦

我麼就在app_need/log裡面再寫一個方法,在log_config裡面單獨寫個配置,將生成的測試/debug,log全部寫在對應路徑裡
最終專案地址:https://github.com/jijuxie/koa2_all.git

相關推薦

node.js專案改進日誌系統

專案自帶的日誌模組koa-logger 專案自帶的日誌系統是很給力的,我們隨便啟動一下下程式,請求一下地址我們就會看到控制檯上出現一堆GET啊啥的是這樣的 logger 超級簡單明瞭,通俗易懂,上面的輸出就是有一個GET請求請求了/目錄,然後處理這

node.js專案改進restful API介面支援

神奇的restful規範 建立restfulAPI模組 這個模組的作用主要是做一些前置操作和指引,並且規範路徑,同時對錯誤進行初步處理 app_need/restfulAPI.js

微軟與Node.js的開源

支持 全球 tro 更多 工具和平臺 .cn 我們 images tell 微軟近年來在開源領域可謂是大刀闊斧的前進中,繼2015年微軟與紅帽合作,微軟智能雲Azure與Linux進一步融合等舉措之後,2016年,微軟繼續加大開源之舉,大力推進Node.js的開發和開源社區

五個最佳案例帶你解讀Node.js的前後

個推 web服務 SegmentFault D-Day Node.js 是什麽?Node.js采用C++語言編寫而成,瀏覽器內核V8做為執行引擎;Node不是JS應用、而是一個Javascript的運行環境。Node保留了前端瀏覽器js的接口,沒有改寫語言本身的任何特性,依舊基於作用域和原型鏈。

Node.js的開源博客系統Ghost搭建教程

參考 運行 qlite 停止 存儲 img 圖片 http 啟動 準備工作 Node.js版本:0.10.x、0.12.x、4.2.x。安裝步驟可參考:Node.js環境搭建 Ghost版本:0.7.4:中文集成版(33.6M),中文標準版(3.39M),英文原版(3.2

Node.js知識點整理----基礎知識----事件處理機制及事件環機制

node 應用程序 nod eat 回調函數 clas 對象 繼續 知識 在event模塊中,定義了EventEmitter類,所有觸發事件的對象都是繼承了這個類的子類的實例對象。 addListener(event,listener) 對指定事件綁定事件處理函數 on

Node.js知識點整理----基礎知識----console(控制臺)

輸出流 輸出結果 err 顯示 info 定向 文件中 world 字符 console.log() 用於進行標準輸出流的輸出,即在控制臺中顯示一行字符串 console.log(‘this is a message.‘) 可以將它重寫向輸出到文件中,1代表重定向標

Node.js專案

這裡mongose語言可以參考https://www.jianshu.com/p/2f54b90efe15 首先配置好入口檔案app.js app.js中比較重要的兩個模組是express  swig(用於解析模板內容) 檔案解析模板swig的配置

Node.js中的fs檔案系統--目錄相關方法;

檔案系統:Linux/Unix (一切皆檔案)file 檔案dir 目錄unknown 未知檔案block 塊狀裝置檔案char 字元型裝置link 連結fifo 管道Windowsfile 檔案dir 目錄unknown 未知檔案 一、與目錄相關的; 1. 首先引入fs檔案模組; va

node.js初使用使用express外掛快速搭建登入註冊

首先,介紹些express,express是基於node.js平臺快速,開放,極簡的web開發框架,express 便於我們快速的開發node api介面 得保證安裝了node.js 下載好以後,新建server.js檔案 //引入模組 const express = require('

阿里雲ECS伺服器部署Node.js專案詳細教程及多網站部署

本文詳細介紹如何部署NodeJS專案到阿里雲ECS上,以及本人在部署過程中所遇到的問題、坑點和解決辦法,可以說是全網最全最詳細的教程了。同時講解了如何申請阿里雲免費SSL證書,以及一臺ECS伺服器配置多網站的Nginx配置方法等。 作者:Kovli 1. 雲伺

Node.js-檔案模組其他操作

9. 其他操作 (1)絕對路徑 Fs.realpath() Fs.realpathSync() 例子: // 匯入檔案系統 const fs = require('fs'); fs.realpa

中小型的 Node.js 專案目錄

build 構建指令碼 dist 編譯出來的釋出版 docs 文件 examples 示例檔案 src 原始碼 test 測試指令碼 .babelrc Babel 交叉編譯的配置 .eslintrc ESLint 測試配置&n

three.js入門系列粒子系統

其實程式碼很簡單,也很容易懂(我用的是r99版本的three.js,目前網上大多數demo是60或者80的版本,其中的一些api已經廢棄,如下是r99版本支援的寫法): 注:渲染器是WebGl渲染器 如上的程式碼,你將看到如下畫面: 但是這麼多“粒子”都是正方形的啊,哪來的雪花呢,不急

node.js專案框架搭建

一、使用Node搭建伺服器專案 1.//全域性安裝 express sudo npm install -g express-generator 2.//使用ejs建立工程 express -e NodeTest 3.//進入工程 cd NodeTest 4.//下載專案所需

Node.js專案的package.json配置檔案中的devdependencies 和 dependencies的區別

1、dependencies和devDependencies 具體程式碼如下 "name": "webpack-react-express", "version": "0.2.0", "private": true, "dependencies": {

Node.js實戰(七)互動式直譯器

Node.js REPL(Read Eval Print Loop:互動式直譯器) 表示一個電腦的環境,類似 Window 系統的終端或 Unix/Linux shell,我們可以在終端中輸入命令,並接收系統的響應。 Node 自帶了互動式直譯器,可以執行以下任務: 讀取 - 讀取使用者輸入,解析

Node.js實戰(八)回撥函式

Node.js 非同步程式設計的直接體現就是回撥。 非同步程式設計依託於回撥來實現,但不能說使用了回撥後程序就非同步化了。 回撥函式在完成任務後就會被呼叫,Node 使用了大量的回撥函式,Node 所有 API 都支援回撥函式。 例如,我們可以一邊讀取檔案,一邊執行其他命令,在檔案讀取完成後,我們將檔案

Node.js實戰(九)事件迴圈

Node.js 是單程序單執行緒應用程式,但是因為 V8 引擎提供的非同步執行回撥介面,通過這些介面可以處理大量的併發,所以效能非常高。 Node.js 幾乎每一個 API 都是支援回撥函式的。 Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。 Node.js 單執行緒類似進入一個w

Node.js實戰(二)HelloWorld示例

經過前面的Node.js實戰(一)之概述 想必你應該對Node.js的概念、應用場景、優缺點等有個大致的瞭解,同時你本地Windows或者Linux上已經準備好了Node.js環境。 下面我們來進入每種程式語言必經之關“HelloWorld”,不要小看這個HelloWorld,每學一樣新的東西,Hello