【发布时间】:2020-06-08 17:05:05
【问题描述】:
我一直在尝试设置一个文件观察器来检测何时将新数据添加到文件中。一般顺序是 1.) 客户端连接到服务器。 2.)服务器日志到文件。 3.) fs.watch() 检测到文件已更改并运行一个函数,在这种情况下是一个简单的console.log('New log entry')
除了fs.watch() 没有检测到新消息何时添加到日志文件之外,一切似乎都正常。但是,如果我单击 VScode 中的日志文件,它似乎会触发它。这是较新版本的 Node 中的错误还是我在这里做错了什么?
我意识到我可以使用fs.watchFile(),但我希望避免轮询的开销......
// src/index.js
const path = require('path');
const express = require('express');
const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
const logger = require('./logger');
const fs = require('fs');
fs.watch('./logs/combined.log', (event) => {
if (event === 'change') {
console.log('New log entry');
}
});
app.use(express.static(path.join(__dirname, '../public')));
app.get('/', function(req, res, next) {
res.sendFile(path.join(__dirname, '../public', 'index.html'));
});
io.on('connection', function(socket) {
logger.info('a user connected');
});
const PORT = process.env.PORT || 8888;
server.listen(PORT, () => {
logger.info(`Listening at http://localhost:${port}`);
});
-
// src/logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
module.exports = logger
-
// public/index.html
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:8888');
</script>
-
// simplified test
const logger = require('./logger');
const fs = require('fs');
fs.watch('./logs/combined.log', event => {
if (event === 'change') {
console.log('log file has updated');
}
});
function intervalFunc() {
logger.info('new log message');
}
setInterval(intervalFunc, 5000);
【问题讨论】:
-
如果你想要简单和一致的东西,你应该查看chokidar 它被微软的 Visual Studio Code、gulp、karma、PM2、browserify、webpack、BrowserSync 等使用。
-
I just tested this 看起来你甚至可以从你的主应用程序中启动子进程......我想知道套接字是否搞砸了?我在 Mac 上测试了这个。
-
很好,我去看看。我还在原始帖子中添加了一个简化测试,您可以尝试看看您是否有问题?我仍然认为 fs.watch() 有点奇怪,但我可能疯了
-
嘿,对不起,我昨晚不得不去睡觉,这样我才能起床工作。你有没有解决这个问题?如果没有,您能否提供您在该最小示例中使用的
package.json文件?我想测试一下。 -
干得好!可能想在 Winstons GitHub 上打开一个问题。如果问题仅在您将 Winston 添加到我创建的演示后才开始发生,则 Def 听起来像是 Winston 的问题(证明 Winston 是破坏它的原因)。随意参考我的演示制作并告诉他们添加 Winston 后演示中断(Winston 写入日志而不触发文件观察器).. 祝你好运!干杯。我应该提一下,我确实搜索了他们的未解决问题和已关闭问题,但找不到与此问题相关的问题,所以我认为没有人已经为此提出问题。
标签: javascript node.js express fs winston