node.js專案改進之日誌系統
專案自帶的日誌模組koa-logger
專案自帶的日誌系統是很給力的,我們隨便啟動一下下程式,請求一下地址我們就會看到控制檯上出現一堆GET啊啥的是這樣的
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
然後開啟response-2017-xxxxxxx看看
完美記錄了我們的請求響應。
額外擴充套件
現在基本的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