winston log 库如何创建 custom logger
代码:
const { createLogger, format, transports, config } = require('winston'); const usersLogger = createLogger({ levels: config.syslog.levels, format: combine( timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), transports: [ new transports.File({ filename: 'users.log' }) ] }); const transactionLogger = createLogger({ transports: [ new transports.File({ filename: 'transaction.log' }) ] }); module.exports = { usersLogger: usersLogger, transactionLogger: transactionLogger };
在上面的例子中,应用程序有两个服务,用户和交易。 为此类服务创建不同的记录器将是相关的。 这些区分了各种应用程序服务的问题。
例如,假设一个处理用户服务属性的 user.js 文件,下面的例子将申请一个简单的日志。
// Require logger.js const {usersLogger, transactionLogger} = require('./logger'); ...........// Your users' code setups................. // What to record to users.log usersLogger.info('New user created'); usersLogger.error(`Unable to find user: ${err}`);
在实际应用中,我们可以在系统中创建新用户或发生新事务时创建以下日志。 属性将被提取并记录在日志文件中。
User.js:
// Require logger.js const {usersLogger, transactionLogger} = require('./logger'); ...........// Your users' code setups................. usersLogger.info('User created!', {user_id: `${res._id}`, user_name: `${res.name}`, user_email: `${res.email}`, ); usersLogger.error(`Unable to find user: ${err}`);
Transaction.js::
// Require logger.js const {usersLogger, transactionLogger} = require('./logger'); ...........// Your Transaction' code setups................. // Transaction logs transactionLogger.info('Session connected', { session_id: `${req.id}`}, {user_id: `${res._id}`); transactionLogger.info('Transaction Initiated', { transaction_id: `${req.transaction_id}`}, {user_id: `${res.user_id}`); transactionLogger.info('Transaction completed', {user_id: `${res.user_id}`, {`${req.transaction_amout}`, `${req.transaction_code}`}); transactionLogger.error('Transaction Failed', `{${err}`,session_id: `${req.id}`}, {user_id: `${res._id}`);
这使得管理日志变得更容易,因为针对特定问题进行了分离,并且提供了用户和事务属性以帮助将其缩小到特定用户或事务。
Other logging middleware
除了 winston 之外,我们还有如下其他库选择。
Morgan 用于记录 HTTP Web 服务器。 它结合了 Node.js 和 Express。 Morgan 记录来自 HTTP 服务器的响应和请求。 它的日志条目基于 HTTP 请求和错误日志行。
Logger 函数访问 req 和 res 等对象。
res - HTTP 响应对象。 req - HTTP 请求对象。 该函数将向日志行返回一个字符串日志条目。
Morgan 旨在记录错误,就像 Apache 和 Nginx 等服务器对访问日志或错误日志执行的方式一样。
以下是 Morgan 记录器的示例:
const express = require('express') const fs = require('fs') const morgan = require('morgan') const path = require('path') const app = express() // Create a write stream (in append mode) const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' }) // Setup the logger app.use(morgan('combined', { stream: accessLogStream })) app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(3000, () => { console.log("Server Listening on port 3000"); })
运行应用程序并在浏览器上点击 http://localhost:3000/。 Morgan 将在 access.log 文件中记录以下日志。
::1 - - [12/Nov/2020:09:19:46 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36"
Bunyan
Bunyan 以 JSON 格式记录日志条目。 该格式是使用时间戳和主机名等基本字段自动生成的。
像 Winston 记录器一样,创建一个记录器实例,并记录您的消息。
const bunyan = require("bunyan"); const log = bunyan.createLogger({ name: "myapp" }); log.info("hi"); log.warn({ lang: "fr" }, "au revoir");
输出:
{"name":"myapp","hostname":"Doe","pid":14244,"level":30,"msg":"hi","time":"2020-11-12T08:22:41.398Z","v":0} {"name":"myapp","hostname":"Doe","pid":14244,"level":40,"lang":"fr","msg":"au revoir","time":"2020-11-12T08:22:41.4 00Z","v":0}
log4js
以下 Log4js 示例将错误日志记录到文件 (log4.log) 和控制台附加程序中。
// Require Log4js const log4js = require('log4js'); // Logger configuration log4js.configure({ appenders: { fileAppender: { type: 'file', filename: './logs/log4.log' }, console: { type: 'console' } }, categories: { default: { appenders: ['fileAppender', 'console'], level: 'error' } } }); // Create the logger const logger = log4js.getLogger(); // Log some messages logger.trace('Trace, log4js!'); logger.debug('Debug, log4js!'); logger.info('Hello, log4js!'); logger.warn('Heads up, log4js!'); logger.error('Danger, log4js!'); logger.fatal('Fatal, log4js!');
输出:
[2020-11-12T11:27:21.278] [ERROR] default - Danger, log4js! [2020-11-12T11:27:21.291] [FATAL] default - Fatal, log4js!