winston 被设计为一个简单且通用的日志库,支持多种传输。 传输本质上是日志的存储设备。 每个 winston 记录器都可以在不同级别配置多个存储渠道。例如,人们可能希望将错误日志存储在持久的远程位置(如数据库),但所有调试日志都输出到控制台或本地文件。

使用 winston 的推荐方法是创建您自己的记录器。 最简单的方法是使用 winston.createLogger:

const winston = require('winston');const logger = winston.createLogger({level: 'info',format: winston.format.json(),defaultMeta: { service: 'user-service' },transports: [//// - Write all logs with level `error` and below to `error.log`// - Write all logs with level `info` and below to `combined.log`//new winston.transports.File({ filename: 'error.log', level: 'error' }),new winston.transports.File({ filename: 'combined.log' }),],
});//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
if (process.env.NODE_ENV !== 'production') {logger.add(new winston.transports.Console({format: winston.format.simple(),}));
}

winston 的日志等级

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

如何创建 logger

const logger = winston.createLogger({transports: [new winston.transports.Console(),new winston.transports.File({ filename: 'combined.log' })]
});

即使 logger 实例创建之后,也能容易地删除或者增添新的 transport:

const files = new winston.transports.File({ filename: 'combined.log' });
const console = new winston.transports.Console();logger.clear()          // Remove all transports.add(console)     // Add console transport.add(files)       // Add file transport.remove(console); // Remove console transport

也能使用 logger 的 configure 方法,重新配置新的 transport:

const logger = winston.createLogger({level: 'info',transports: [new winston.transports.Console(),new winston.transports.File({ filename: 'combined.log' })]
});//
// Replaces the previous transports with those in the
// new configuration wholesale.
//
const DailyRotateFile = require('winston-daily-rotate-file');
logger.configure({level: 'verbose',transports: [new DailyRotateFile(opts)]
});

在 winston 中,Logger 和 Transport 实例都被视为接受 info 对象的 objectMode 流。

提供给给定格式的 info 参数表示单个日志消息。 对象本身是可变的。 每个信息必须至少具有 level 和 message 属性:

const info = {level: 'info',                 // Level of the logging message  message: 'Hey! Log something?' // Descriptive message being logged.
};

除了级别和消息之外的属性被视为“元属性”:

const { level, message, ...meta } = info;

我们来动手写一个实际的例子。

主程序:

// @ts-nocheck
var express = require('express');
var app = express();
var DEFAULTPORT = 3003;
var port = process.env.PORT || DEFAULTPORT;
var winstonTest = require("./winstonTest");app.get('/', function(_req, res){res.send("Hello world");winstonTest.logMessage('234');
});app.listen(port, function(){console.log("App listens on port: " + port);
});

winstonTest 的实现:

const winston = require('winston');const logger = winston.createLogger({level: 'info',format: winston.format.json(),defaultMeta: { service: 'user-service' },transports: [//// - Write all logs with level `error` and below to `error.log`// - Write all logs with level `info` and below to `combined.log`//new winston.transports.File({ filename: 'data/error.log', level: 'error' }),new winston.transports.File({ filename: 'data/combined.log' }),]
});if (process.env.NODE_ENV !== 'production') {logger.add(new winston.transports.Console({format: winston.format.simple(),}));
}console.log('Logger initialized successfully!');function log(content){logger.info('hello', { message: content });
}module.exports = {logMessage: log
};

浏览器里输入如下 url:
http://localhost:3003/
在 combined.log 里生成了如下 log 文件:

这就是 winston 最基本的使用方法。

日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用相关推荐

  1. golang游戏开发学习笔记-创建一个能自由探索的3D世界

    此文写在golang游戏开发学习笔记-用golang画一个随时间变化颜色的正方形之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里,我们将创建一个非常简单(只有三个方块)但能自由探索的的3D世 ...

  2. 创建一个提供数据 API 的 Node.js 网站

    创建站点目录 首先,创建一个文件夹用来保存你的站点文件,使用 mkdir 就可以了 PS C:\> mkdir mysite 然后,进入到这个文件夹进行下一步的操作. 创建包说明 使用记事本或者 ...

  3. OpenCascade学习笔记-创建一个简单的OpenCascade单文档

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Open ...

  4. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试

    按照这篇文章日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用里的代码,对下列方法进行单步调试: 因为我们调用的是 info 方法,所以生成的日志,leve ...

  5. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)

    此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...

  6. Magnolia学习笔记(一个基于JSR170的内容管理系统) ( by quqi99 )

                         Magnolia学习笔记(一个基于JSR170的内容管理系统) ( by quqi99 ) 作者:张华 发表于:2007-05-24  ( http://bl ...

  7. activiti7关联mysql_学习笔记:一个MySQL实例有多个Activiti数据库问题

    学习笔记:一个MySQL实例有多个Activiti数据库问题 使用SpringBoot + activiti6 搭建审批流项目,数据库使用的是MySQL.且我的数据库下存在多个activiti相关的数 ...

  8. OPenGL笔记--创建一个3D场景

    文章目录 一.前言 二.效果展示 三.详细流程 3.1.World.txt文件规则 3.2.加载World.txt 3.3.绘制场景 3.4.交互 四.详细代码 五.举一反三 一.前言 通过前面的学习 ...

  9. 嵌入式开发学习笔记9-做一个好玩的LED闪烁

    嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...

最新文章

  1. 如何在Bash中加入数组元素?
  2. python按概率输出分类结果_sklearn例程:多分类输出概率
  3. 串行、并行、并发总结
  4. VTK:图像迭代器用法实战
  5. zend studio配置php_PHP-Zend Studio PHP环境的搭建
  6. C++ 学习之旅(12)——static用法小结
  7. 数字图像处理怎么讲yiq空间变成rgb空间_【JTRP】屏幕空间深度边缘光 Screen Space Depth Rimlight...
  8. 用python开发的运维管理系统下载_GitHub - jiegangwu/OPMS_v3: 基于 Python 3.5 + Django 2.0 开发的运维管理系统...
  9. Windows Phone 7(WP7)开发 获取网络状态
  10. 10000以内的质数表
  11. 全链路压测那点事(一)
  12. RabbitMq Direct exchange路由模型
  13. 花滑三周连跳_三周半+四周跳来势汹汹 花滑女单将迎难度巨变?
  14. iptables 查看客户端流量情况
  15. 计算机的应用软件在哪里,电脑软件卸载在哪里
  16. oracle 中将number类型的数据转化成指定格式的小数
  17. 大连python培训费用-大连Python培训价格_Python培训哪家好
  18. 应届实习生,北京短租经验分享
  19. 用matlab绘制函数图形,matlab函数绘制 用matlab怎样绘制函数图形
  20. 学人工智能电脑配置要求高吗?多少钱能搞定?

热门文章

  1. 如何实现Linux下高亮关键字的tail -f功能
  2. python变量和运算符
  3. 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
  4. Lync登录错误解决一例
  5. tabindex, taborder和notab属性的区别
  6. FFT快速傅立叶变换
  7. LightSwitch 2011 数据字段唯一性验证方案
  8. Python线程编程—同步队列
  9. ACE在AIX环境下编译指南
  10. 实用教程 活动目录介绍及安装指南