gpt4 book ai didi

node.js - 将 morgan 与 logger 一起使用时,stream.write 不是函数

转载 作者:行者123 更新时间:2023-12-01 10:19:56 29 4
gpt4 key购买 nike

基本上我正在尝试使用 morgan 和 winston 为 nodejs 实现记录器。

当我尝试使用 morgan 时,抛出 stream.write 错误不是函数。

因为我想获取文件名,所以我正在传递模块,从模块对象有一个名为文件名的属性。

下面是我的代码。

//Winston.js

const appRoot = require('app-root-path');
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, label, printf } = format;
const path = require('path');

// Custom Format
const customFormat = printf(info => {
return `${new Date(info.timestamp)} || [${info.label}] || ${info.level}: ${info.message} `
})

// Return the last folder name in the path and the calling
// module's filename.
const getLabel = function (moduleDetails) {
if (Object.keys(moduleDetails).length > 0) {
let parts = moduleDetails.filename.split(path.sep)
return parts.pop();
}else{
return;
}
}

// define the custom settings for each transport (file, console)
var options = (moduleDetails) => ({
file: {
level: "info",
timestamp: new Date(),
filename: `${appRoot}/logs/app.log`,
handleExceptions: true,
json: true,
maxsize: 5242880,
maxFiles: 5,
colorize: false,
label: getLabel(moduleDetails)
},
console: {
level: "debug",
handleExceptions: true,
json: false,
colorize: true,
}
})

//instantiate a new Winston Logger with the settings defined above
let logger = function (moduleDetails) {
return createLogger({
format: combine(
label({label:getLabel(moduleDetails)}),
timestamp(),
customFormat
),
transports: [
new transports.File(options(moduleDetails).file)
],
exitOnError: false // do not exit on handled exceptions
})
}



// create a stream object with 'write' function that will be used by 'morgan'
// logger({})["stream"] = {
// write: function (message, encoding) {
// // use the 'info' log level so the output will be picked up by both transports
// // (file and console)
// logger().info(message)
// }
// }

// If we're not in production then log to the `console` with the format:
// `${info.timestamp} || [${info.label}] || ${info.level}: ${info.message}`
// like in the log file

if (process.env.NODE_ENV !== 'prod') {
logger({}).add(new transports.Console(options({}).console));
}



module.exports = logger
module.exports.stream = {
write: function (message, encoding) {
// use the 'info' log level so the output will be picked up by both transports
// (file and console)
logger().info(message)
}
}

//应用程序.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var morgan = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var winston = require('./config/winston')(module);

var app = express();


// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(morgan('combined', { "stream": winston.stream}));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};

// add this line to include winston logging
winston.error(`${err.status || 500} || ${err.message} || ${req.originalUrl} || ${req.method} || ${req.ip}` )

// render the error page
res.status(err.status || 500);
res.render('error');
});



module.exports = app;

最佳答案

在 App.js 上,尝试更改

app.use(morgan('combined', { "stream": winston.stream}));


app.use(morgan('combined', { "stream": winston.stream.write}));

即使我不知道为什么,这似乎也有效。

关于node.js - 将 morgan 与 logger 一起使用时,stream.write 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718192/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com