最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs使用winston進(jìn)行日志記錄詳解

 更新時(shí)間:2024年01月15日 11:02:11   作者:東方小月  
在生產(chǎn)環(huán)境中,更常見(jiàn)的做法是使用專(zhuān)門(mén)的日志記錄庫(kù),如winston、log4js等,來(lái)實(shí)現(xiàn)更靈活和可配置的日志記錄功能,本篇文章將介紹的是winston的強(qiáng)大的日志記錄功能,快跟隨小編一起學(xué)習(xí)一下吧

在我們開(kāi)發(fā)過(guò)程中,日志記錄是非常重要的一環(huán),它可以提供我們程序的運(yùn)行狀況、錯(cuò)誤和異常、性能和安全等方面的關(guān)鍵信息,讓開(kāi)發(fā)人員和運(yùn)維團(tuán)隊(duì)更好地管理和維護(hù)應(yīng)用程序。

那么在NodeJS中該如何進(jìn)行日志記錄呢? 有小伙伴就會(huì)說(shuō)console.log! 確實(shí),Node.js中可以使用console.log進(jìn)行簡(jiǎn)單的日志記錄,但是它將信息輸出到控制臺(tái)就結(jié)束了,不會(huì)被持久化保存到文件或其他存儲(chǔ)設(shè)備中。所以通常只是在開(kāi)發(fā)和調(diào)試階段使用一下。

在生產(chǎn)環(huán)境中,更常見(jiàn)的做法是使用專(zhuān)門(mén)的日志記錄庫(kù),如winston、log4js等,來(lái)實(shí)現(xiàn)更靈活和可配置的日志記錄功能。本篇文章將介紹的是winston的強(qiáng)大的日志記錄功能。下面我們就從一個(gè)簡(jiǎn)單的node項(xiàng)目開(kāi)始吧!

初始化項(xiàng)目

新建目錄執(zhí)行

npm init

初始化一個(gè) node 項(xiàng)目。

然后在 package.json 文件中新增type:module字段,這樣我們就可以使用 ES6 語(yǔ)法了

{
  "name": "winston",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

新建一個(gè)index.js文件。ok,接下來(lái)我們就可以使用 winston 了

安裝使用 winston

執(zhí)行命令npm i winston -S安裝winston,安裝完成我們就可以在程序中導(dǎo)入使用了

比如在index.js中我們可以使用 winston.createLogger 創(chuàng)建一個(gè)日志記錄器

import winston from "winston";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [new transports.Console()],
});

logger.info("cxkhtw");

然后我們執(zhí)行node index.js就會(huì)看到控制臺(tái)打印了

info: cxkhtw

日志記錄器接受以下參數(shù):

名稱(chēng)默認(rèn)值描述
level'info'僅在 info.level 小于或等于此級(jí)別時(shí)記錄
levelswinston.config.npm.levels表示日志優(yōu)先級(jí)的級(jí)別(和顏色)
formatwinston.format.json用于 info 消息的格式化(參見(jiàn):Formats)
transports[]日志傳傳輸方式
exitOnErrortrue如果為 false,則處理的異常不會(huì)導(dǎo)致進(jìn)程退出
exceptionHandlers[]未捕獲異常處理方式
silentfalse如果為 true,則所有日志都將被禁止

我們簡(jiǎn)單看下上面常用的參數(shù)

level

它表示日志記錄的最低等級(jí),在 winston 中,日志級(jí)別遵循 RFC5424 指定的嚴(yán)重性順序:所有級(jí)別的嚴(yán)重性被規(guī)定為從最重要到最不重要的數(shù)字遞增。

const levels = {
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6,
};

比如上面我們指定的 level 為 debug,那么 debug 及以上都會(huì)被記錄,下面的則不會(huì)被打印,比如我們加幾種打印類(lèi)型

logger.info("cxkhtw");
logger.debug("cxkhtw");
logger.warn("cxkhtw");
logger.silly("cxkhtw");

執(zhí)行程序后會(huì)發(fā)現(xiàn)只記錄了前三個(gè)

format

format可以規(guī)定日志的格式,默認(rèn)是format.json也就是 JSON 格式,比如我們將format去掉再執(zhí)行程序

const logger = winston.createLogger({
  level: "debug",
  transports: [new transports.Console()],
});

你會(huì)發(fā)現(xiàn)打印出來(lái)的變成 JSON 格式了

我們還可以使用format.combine組合我們需要的格式

format: format.combine(format.timestamp(), format.simple()),

更多格式可以參見(jiàn)formats

transports

transports可以理解為日志的傳輸方式,比如我們想傳輸?shù)娇刂婆_(tái),文件,數(shù)據(jù)庫(kù),接口等等,都可以選擇對(duì)應(yīng)transports,比如上面的new transports.Console()就可以讓我們?cè)诳刂婆_(tái)看到打印的日志。

1. transports.File

如果我們想將日志記錄在文件中,可以使用new transports.File進(jìn)行配置

const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.File({
      dirname: "logs",
      filename: "index.log",
    }),
  ],
});

這時(shí)候再執(zhí)行程序你就會(huì)發(fā)現(xiàn)多了個(gè) logs/index.log 文件并且記錄了打印的日志

如果將所有日志都記錄在一個(gè)文件中,那這個(gè)文件豈不是越來(lái)越大? 不用擔(dān)心。winston還給我們提供了日志分割的功能,只需要配置maxsize屬性即可,單位是字節(jié),為了更好的演示這里我們?cè)O(shè)置 1024 字節(jié)也就是 1kb

const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.File({
      dirname: "logs",
      filename: "index.log",
      maxsize: 1024,
    }),
  ],
});

然后多執(zhí)行幾次就會(huì)發(fā)現(xiàn)日志文件新增了一個(gè),并且第一個(gè)日志文件大小剛好 1kb 左右

一般來(lái)說(shuō)我們進(jìn)行日志分割都是根據(jù)時(shí)間來(lái)分割的,這樣方便后期排查問(wèn)題,那么winston支持按時(shí)間分割嗎? 答案是肯定的

2. transports.DailyRotateFile

如果想根據(jù)時(shí)間分割日志,我們需要換別的 Transport ,winston提供了很多transport,感興趣的可以點(diǎn)進(jìn)去看下。我們這里使用DailyRotateFile來(lái)分割日志

我們首先要安裝npm install winston-daily-rotate-file -S,然后導(dǎo)入就可以使用了

import winston from "winston";
import "winston-daily-rotate-file";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.DailyRotateFile({
      level: "debug",
      dirname: "logs",
      filename: "index-%DATE%.log",
      datePattern: "YYYY-MM-DD-HH-mm",
      maxSize: 1024,
    }),
  ],
});

logger.info("cxkhtw");
logger.debug("cxkhtw");
logger.warn("cxkhtw");
logger.info("cxkhtw");

這時(shí)候每分鐘的日志都會(huì)被記錄在不同的文件中了,當(dāng)然你可以設(shè)置datePattern來(lái)規(guī)定這個(gè)時(shí)間

3. transports.Http

有的時(shí)候我們想將日志上報(bào)到指定接口中進(jìn)行記錄 winston 也是支持的,可以使用內(nèi)置的 transport.Http 進(jìn)行配置,為了更好的演示,我們用express寫(xiě)一個(gè)簡(jiǎn)單的接口,安裝express后新建一個(gè) server.js

import express from "express";
import bodyParser from "body-parser";
const app = express();
const port = 3000;
app.use(bodyParser.json());
// 定義一個(gè) POST請(qǐng)求的路由
app.post("/", (req, res) => {
  console.log(req.body);
  res.send("Hello, World!");
});

// 啟動(dòng)服務(wù)器
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

注意這里還需要安裝body-parser讓我們的接口可以接收 JSON 文件,然后新建一個(gè)終端執(zhí)行node server.js啟動(dòng)一個(gè)端口為 3000 的接口

在我們程序中的transports添加一個(gè)transports.Http,并傳入一些配置參數(shù)

import winston from "winston";
import "winston-daily-rotate-file";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.Http({
      level: "info",
      host: "localhost",
      port: 3000,
      path: "/",
    }),
  ],
});

logger.info("cxkhtw");
logger.debug("cxkhtw");
logger.warn("cxkhtw");
logger.info("cxkhtw");

然后執(zhí)行一下,可以發(fā)現(xiàn)我們接口中拿到了日志信息,后面可以根據(jù)自己的需求將這些信息存儲(chǔ)下來(lái)

winston的transport還有很多,由于篇幅有限這里先只介紹這幾個(gè)常用的,感興趣的可以自己查看

exceptionHandlers

除了上述功能外,winston 還可以配置處理未捕獲異常,如下

import winston from "winston";
import "winston-daily-rotate-file";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [new transports.Console()],
  exceptionHandlers: [
    new transports.File({
      dirname: "errorlogs",
      filename: "error.log",
    }),
  ],
});
throw Error("這是一條錯(cuò)誤信息");

運(yùn)行就會(huì)發(fā)現(xiàn)多了一個(gè)errorlogs/error.log文件

總結(jié)

本篇文章介紹 winston 一些常見(jiàn)用法,包括 level 的優(yōu)先級(jí)、日志打印的格式format以及一些transport的使用等等。

其中,重點(diǎn)介紹了transport的用法,通過(guò)transport實(shí)現(xiàn)了生成日志文件,日志分割,日志上傳接口等常見(jiàn)日志處理功能。

到此這篇關(guān)于Nodejs使用winston進(jìn)行日志記錄詳解的文章就介紹到這了,更多相關(guān)Nodejs winston內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • 命令行批量截圖Node腳本示例代碼

    命令行批量截圖Node腳本示例代碼

    這篇文章主要給大家介紹了關(guān)于命令行批量截圖Node腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 服務(wù)端nodejs抓取jsonp接口數(shù)據(jù)實(shí)現(xiàn)示例

    服務(wù)端nodejs抓取jsonp接口數(shù)據(jù)實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了服務(wù)端nodejs抓取jsonp接口數(shù)據(jù)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Windows下使用Nodejs運(yùn)行js的方法

    Windows下使用Nodejs運(yùn)行js的方法

    今天小編就為大家分享一篇Windows下使用Nodejs運(yùn)行js的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • node.js實(shí)現(xiàn)快速截圖

    node.js實(shí)現(xiàn)快速截圖

    本文給大家匯總介紹了幾種node.js實(shí)現(xiàn)快速截屏的方法,這里分享給大家,希望大家能夠喜歡。
    2016-08-08
  • node 使用 nodemailer工具發(fā)送驗(yàn)證碼到郵箱

    node 使用 nodemailer工具發(fā)送驗(yàn)證碼到郵箱

    最近閑著沒(méi)事,我就在練習(xí)使用node和mysql編寫(xiě)接口,計(jì)劃寫(xiě)一個(gè)完整的vue系統(tǒng),這篇文章主要介紹了node 使用 nodemailer工具發(fā)送驗(yàn)證碼到郵箱,需要的朋友可以參考下
    2023-10-10
  • 初始Nodejs

    初始Nodejs

    本文屬于nodejs的基礎(chǔ)知識(shí)介紹篇,從nodejs的基本概念,到架構(gòu)示意圖,同步異步等方面做了詳細(xì)的解答,是篇非常不錯(cuò)的文章
    2014-11-11
  • express框架,報(bào)錯(cuò):“Cannot set headers after they are sent to the client”,解決方法總結(jié)

    express框架,報(bào)錯(cuò):“Cannot set headers after t

    這篇文章主要介紹了express框架,報(bào)錯(cuò):“Cannot set headers after they are sent to the client”,解決方法,結(jié)合實(shí)例形式總結(jié)分析了常見(jiàn)的問(wèn)題原因與對(duì)應(yīng)的解決方案,需要的朋友可以參考下
    2023-05-05
  • Windows系統(tǒng)下安裝Node.js的步驟圖文詳解

    Windows系統(tǒng)下安裝Node.js的步驟圖文詳解

    這篇文章主要給大家介紹了Windows系統(tǒng)下Node.js的安裝教程,Node.js是用于后端編程的JavaScript框架,文中給出了詳細(xì)圖文介紹,有需要的朋友可以參考下,下面來(lái)一起看看吧。
    2016-11-11
  • node.js中axios使用心得總結(jié)

    node.js中axios使用心得總結(jié)

    這篇文章主要介紹了node.js中axios使用心得總結(jié),以及分析了中間遇到的錯(cuò)誤,大家參考一下。
    2017-11-11
  • Angularjs---項(xiàng)目搭建圖文教程

    Angularjs---項(xiàng)目搭建圖文教程

    下面小編就為大家?guī)?lái)一篇Angularjs---項(xiàng)目搭建圖文教程。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07

最新評(píng)論

金沙县| 红河县| 张家港市| 丹阳市| 长兴县| 濉溪县| 双牌县| 潢川县| 安阳市| 莲花县| 武清区| 华宁县| 昌吉市| 璧山县| 章丘市| 沿河| 贵州省| 津市市| 突泉县| 曲麻莱县| 彭山县| 鸡西市| 翁牛特旗| 凌海市| 元谋县| 苏尼特右旗| 五大连池市| 永清县| 西华县| 道真| 宜春市| 贡觉县| 梅河口市| 吴旗县| 涞水县| 临武县| 秦安县| 吴江市| 资兴市| 宝兴县| 伊吾县|