我的记录器工作正常,但突然我的logger.query
停止工作。它开始返回一些未知的字符错误为result
,而err
仍然是null
。
我检查了文件,发现两个日志之间有一些奇怪的字符。
gedit显示如下字符:
00 00 00 00 00 00 00 00 00 00……而记事本只显示空白
我想它可能一直在写文件,但被关闭了。有人能告诉我发生这种事的原因吗?有办法修复文件吗?
我也遇到了同样的问题。当问题出现时,我通过从文件中删除空字符来解决这个问题。
我首先尝试正常query
记录器。如果我没有得到Error
的results
的实例,那么一切都很好。但是,如果我确实得到了Error
的实例,那么我就去掉所有的空字符,然后再尝试一次,并标记说不要在进一步失败时继续尝试。
我去掉空字符的方法是使用sed
。我在这里使用sed -i -e 's/\x0//g' ${DATA_DIRECTORY}/logs/*.log
,其中${DATA_DIRECTORY}/logs
是我的日志文件文件夹的路径。
下面是一个完整的例子:
public readonly read = async (retry = true) => {
return new Promise<LogEntry[]>((resolve, reject) => {
const options: QueryOptions = {...};
let logs: LogEntry[];
this.logger.query(options, (error, results) => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (error) {
reject(error);
return;
}
const rawWinstonLogs = results as {
dailyRotateFile: DailyRotateFileEntry[];
};
// sometimes null bytes get written to a log file. In this
// case, `reuslts.dailyRotateFile` is an Error object. If this
// happens, try stripping the null characters from the file and
// try again once
if (rawWinstonLogs.dailyRotateFile instanceof Error) {
// if it's not the first time retrying, just fail
if (!retry) {
reject(rawWinstonLogs.dailyRotateFile);
return;
}
// strip the null characters out of the files
exec(`sed -i -e 's/\x0//g' ${DATA_DIRECTORY}/logs/*.log`);
// try again
resolve(this.read(false));
return;
}
// if somehow we got here and this isn't a function, reject
if (typeof rawWinstonLogs.dailyRotateFile.map !== 'function') {
reject(error);
return;
}
logs = rawWinstonLogs.dailyRotateFile.map((logEntry, index) => {
const entry: LogEntry = { ...logEntry, id: index };
return entry;
});
resolve(logs);
});
});
};
注意:我只有在我的代码不优雅地关闭时才会遇到这个问题。我的意思是,我将这段代码加载到一个设备上,当我在设备运行时关闭电源时,温斯顿就会插入空字符。我重新启动它,空字符总是在关闭前的最后一条消息和电源恢复后的第一条消息之间。
我认为这与