Javascript 是fs.watch()在节点v13中损坏了,还是我做错了什么?
我一直在尝试设置一个文件监视程序,该程序可以在文件中添加新数据时进行检测。一般顺序为1。)客户端连接到服务器。2.)服务器将日志记录到文件。3.Javascript 是fs.watch()在节点v13中损坏了,还是我做错了什么?,javascript,node.js,express,fs,winston,Javascript,Node.js,Express,Fs,Winston,我一直在尝试设置一个文件监视程序,该程序可以在文件中添加新数据时进行检测。一般顺序为1。)客户端连接到服务器。2.)服务器将日志记录到文件。3.fs.watch()检测文件已更改并运行一个函数,在本例中是一个简单的console.log('New log entry') 除了在日志文件中添加新消息时,fs.watch()没有检测到外,其他一切似乎都正常。但是,如果我在VScode中单击日志文件,它似乎会触发它。这是Node较新版本中的错误还是我在这里做错了什么 我意识到我可以使用fs.watch
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}`);
});
-
-
的节点文档有一整节,从一开始就说明: fs.watch API在不同平台之间并非100%一致,而是 在某些情况下不可用 您应该阅读该部分以了解更多信息,但如果您无法获得
fs.watch
,则可能最终不得不使用
[更新]
“注意事项”一节的小节还规定:
即使在受支持的平台上,文件名
也不一定总是可以使用
假如因此,不要假设filename
参数总是
在回调中提供,如果为null
,则具有一些回退逻辑
由于您不需要使用filename
参数(而且您已经知道文件名),因此回调不应该测试真实的filename
参数。更新:
就这样。这些侦听器的行为类似于文件监视程序,并允许您钩住某些事件。您可以钩住的事件之一称为“数据”——这使您可以侦听数据写入文件的时间,并运行回调函数
这提供了与file.watch类似的行为
它们允许您监听以下事件:
- 接近
- 资料
- 结束
- 错误
- 可读的
我在Windows上进行了测试,效果非常好
这是我正在使用的测试文件:
const winston=require('winston');
const{createLogger,格式:{json},传输:{File}}=winston;
const logger=createLogger({
级别:“信息”,
格式:json(),
运输:[
新文件({filename:'./log.txt'})
],
});
/**
*添加了一个内置Winston侦听器
*/
logger.addListener('data',chunk=>{
console.log('\r\n[winston listener]我们已经记录了一些数据:\n',chunk)
})
/**
*他们的文档似乎使用了“.on”方法。
*
*这似乎提供了与“.addListener”相同的行为类型。
*
*我不确定哪一个是最好的,或者推荐的,`.addListener`或者`.on`-you
*我可能想更深入地了解这一点。
*/
logger.on('data',chunk=>{
log('\r\n[winston“data”]我们记录了一些数据:\n',chunk);
});
设置间隔(()=>{
logger.info(“新日志消息”);
}, 5000);
所以我一直在思考这个问题,起初我认为这是因为Winston使用写流来更新文件
然后我继续尝试复制你的问题,但我无法复制它
每次更新日志文件时,都会向控制台写入一条消息(这意味着,fs.watch
正在工作
您正在使用Windows吗?您使用的是哪个版本的Node
这是我正在使用的测试文件:
const winston=require('winston');
常数fs=要求('fs');
const{createLogger,格式:{json},传输:{File}}=winston;
const logger=createLogger({
级别:“信息”,
格式:json(),
运输:[
新文件({filename:'./log.txt'})
]
});
fs.watch('./log.txt',event=>{
如果(事件=='change'){
log(“日志文件已更新”);
}
});
设置间隔(()=>{
logger.info(“新日志消息”);
}, 5000);
如果你想要简单一致的东西,你应该检查一下它被微软的Visual Studio code、gulp、karma、PM2、browserify、webpack、BrowserSync等使用过。看起来你甚至可以从你的主应用程序中启动子进程……我想知道这个套接字是否有问题?我在Mac上测试过。很好,我会检查的我还在原来的帖子中添加了一个简化的测试,你可以试着看看是否有问题?我仍然觉得fs.watch()有些奇怪但我可能会发疯,他们很抱歉我昨晚不得不睡觉,这样我才能起床上班。你有没有解决过这个问题?如果没有,你能提供你在这个最小的例子中使用的package.json
文件吗?我想测试一下。干得好!可能想在Winstons GitHub上打开一个问题。如果没有,Def听起来像是Winston的问题这个问题只有在你将Winston添加到我创建的演示中后才会发生(证明Winston是破坏它的东西)…请随意参考我制作的演示,并告诉他们Winston添加后演示会中断(Winston写入日志,而不是触发文件观察者)…祝你好运!干杯。我应该提到,我确实搜索了他们的开放和关闭的问题,但找不到该问题的问题,因此我认为还没有人为此提交问题。谢谢,我已经阅读了文档,并且“在某些情况下不可用”非常模糊。我在Windows计算机上。我要查找的是代码是否有问题,或者这是否属于“某些情况”部分不可用。如果有帮助,请参阅我的更新答案。是的,文档有点模糊,但在各种文件系统中支持此功能确实很难,而且也很难完整记录。感谢更新。我不确定为什么会有此检查,但在删除它后,它没有帮助。日志已被删除g已写入日志文件,但仍未检测到文件更改。如果打开日志文件,则为VScode并键入d
// 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);