代码:
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!