温斯顿在文件中写入了无效字符



我的记录器工作正常,但突然我的logger.query停止工作。它开始返回一些未知的字符错误为result,而err仍然是null

我检查了文件,发现两个日志之间有一些奇怪的字符。

gedit显示如下字符:

00 00 00 00 00 00 00 00 00 00……而记事本只显示空白

我想它可能一直在写文件,但被关闭了。有人能告诉我发生这种事的原因吗?有办法修复文件吗?

我也遇到了同样的问题。当问题出现时,我通过从文件中删除空字符来解决这个问题。

我首先尝试正常query记录器。如果我没有得到Errorresults的实例,那么一切都很好。但是,如果我确实得到了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);
        });
    });
};

注意:我只有在我的代码不优雅地关闭时才会遇到这个问题。我的意思是,我将这段代码加载到一个设备上,当我在设备运行时关闭电源时,温斯顿就会插入空字符。我重新启动它,空字符总是在关闭前的最后一条消息和电源恢复后的第一条消息之间。

我认为这与0在内部是null字符有关。

我最近发现了一个关于这个的视频,你可能想看看:https://www.youtube.com/watch?v=0fw5Cyh21TE

一个可能的修复可能是检查0上的传入字符串并将其转换为字符串替换(尚未测试是否有效)

相关内容

  • 没有找到相关文章

最新更新