Обновление:
Так что похоже на то, что Winston поставляется со встроенными слушателями . Эти слушатели действуют подобно наблюдателю файла и позволяют вам подключаться к определенным событиям. Одно из событий, которое вы можете подключить, называется «data» - это позволяет вам прослушивать, когда данные записываются в файл, и запускать функцию обратного вызова.
Это обеспечивает поведение, подобное file.watch
.
Они позволяют прослушивать следующие события:
- close
- data
- end
- error
- readable
Я проверил это на Windows, и оно отлично работает.
Это тест файл, который я использую:
const winston = require('winston');
const { createLogger, format: { json }, transports: { File } } = winston;
const logger = createLogger({
level: 'info',
format: json(),
transports: [
new File({ filename: './log.txt' })
],
});
/**
* Added a built in Winston listener
*/
logger.addListener('data', chunk => {
console.log('\r\n[winston listener] we have logged some data:\n', chunk)
})
/**
* Their documentation seems to use the `.on` method.
*
* This appears to provide the same type of behavior that `.addListener` does.
*
* I'm not sure which is best, or recommended, `.addListener` or `.on` - you
* may want to dig deeper into that.
*/
logger.on('data', chunk => {
console.log('\r\n[winston on "data"] we have logged some data:\n', chunk);
});
setInterval(() => {
logger.info('new log message');
}, 5000);
, поэтому я немного подумал над этим, и сначала я подумал, что это происходит, потому что Winston использует потоки записи для обновления файлов ..
Затем я попытался повторить вашу проблему, но я не могу воспроизвести ее.
Каждый раз, когда файл журнала обновляется, на консоль записывается сообщение (то есть fs.watch
работает.
Используете ли вы Windows? Какую версию Node вы используете?
Это тестовый файл, который я использую:
const winston = require('winston');
const fs = require('fs');
const { createLogger, format: { json }, transports: { File } } = winston;
const logger = createLogger({
level: 'info',
format: json(),
transports: [
new File({ filename: './log.txt' })
]
});
fs.watch('./log.txt', event => {
if (event === 'change') {
console.log('log file has updated');
}
});
setInterval(() => {
logger.info('new log message');
}, 5000);