log4js是Node.js中很是棒的日誌模塊,使用起來很是簡單且好用。這一篇和你們分享下如何很快的寫一個日誌記錄服務,由於node的中間件模式,因此咱們將日誌服務寫爲一箇中間件。html
下面將以koa
爲例寫一個訪問日誌中間件node
npm install log4js
複製代碼
log4js.configure({
appenders: {
visitor: {
type: "dateFile",
filename: `./logs/visitor-`,
pattern: ".yyyy-MM-dd.log",
alwaysIncludePattern: true,
daysToKeep: 30,
layout: {
type: "messagePassThrough"
}
}
},
categories: { default: { appenders: ["visitor"], level: "info" } }
});
複製代碼
appenders.visitor
咱們作了一些個性化配置,爲何要這樣作呢?nginx
type: "dateFile"
:日誌文件能夠安特定的日期模式滾動,例現在天輸出爲visitor-2019-03-08.log,明天輸爲visitor-2019-03-09.log;filename: './logs/visitor.log'
:設置log輸出的文件路勁和文件名alwaysIncludePattern: true
: 和上面同時使用 設置天天生成log名daysToKeep: 30
: 日誌只保存30天 layout.type
咱們設爲messagePassThrough
,不適用log4js提供的日誌模版,徹底使用本身的代碼,這樣作的好處是當咱們的日誌要和阿里雲日誌關聯的時候必需要寫成JSON的,爲了方便查詢以及可控性,咱們要使用本身的定義的JSON。const log4js = require("log4js");
log4js.configure({
appenders: {
visitor: {
type: "dateFile",
filename: `./logs/visitor.log`,
alwaysIncludePattern: true,
daysToKeep: 30,
layout: {
type: "messagePassThrough"
}
}
},
categories: { default: { appenders: ["visitor"], level: "info" } }
});
const logger = log4js.getLogger("visitor");
module.exports = function() {
return async function(ctx, next) {
const start = new Date();
await next();
// 根據文件結尾篩選
const index = ctx.url.lastIndexOf(".");
const ext = ctx.url.substr(index + 1);
const extArr = ["js", "png", "otf", "txt", "html", "xml", "json", "ico"];
if (extArr.indexOf(ext) === -1 ) {
const end = new Date();
// 這裏是取nginx反向代理後的ip信息, ctx.ip + "i"這個是給壞人準備的,若是ip結尾帶了i且不是大家公司的ip,那是有很大機率是壞人的。若是大家沒有使用nginx那就只取 ctx.ip。
const Uip =
ctx.get("HTTP_X_REAL_IP") ||
ctx.get("X-Read-IP") ||
ctx.get("HTTP_X_FORWARDED_FOR") ||
ctx.get("X-Forwarded-For") ||
ctx.get("Remote_Addr") ||
ctx.ip + "i";
let data = {
startTime: start.toJSON(),
endTime: end.toJSON(),
uri: ctx.url,
ip: Uip || "",
status: ctx.status,
referrer: ctx.headers.referer || "",
msec: end - start,
ua: ctx.header["user-agent"]
};
logger.info(JSON.stringify(data));
}
};
};
複製代碼