查看源代码 wrap_log_reader (内核 v10.2)
用于读取内部格式的环绕磁盘日志的服务。
此模块可以读取内部格式的环绕磁盘日志,请参阅disk_log
。wrap_log_reader
不会干扰 disk_log
的活动;但是,此版本的 wrap_log_reader
中存在一个错误,请参阅已知限制部分。
一个环绕磁盘日志文件由许多称为索引文件的文件组成。日志文件可以打开和关闭。此外,单个索引文件可以单独打开。如果打开不存在或非内部格式的文件,将返回错误消息。如果文件损坏,则不会尝试修复它,但会返回错误消息。
如果将日志配置为分布式,则可能并非所有项目都记录在所有节点上。wrap_log_reader
仅读取调用节点上的日志;用户需要确保已读取所有项目。
已知限制
此版本的 wrap_log_reader
不会检测到在调用 wrap_log_reader:open/1
和第一次调用 wrap_log_reader:chunk/1
之间 disk_log
环绕到新的索引文件的情况。如果发生这种情况,则调用 chunk/1
会读取日志文件中的最后记录的项目,因为打开的索引文件已被 disk_log
截断。
概要
函数
可以高效地读取附加到日志的项。通过从文件中读取 64 千字节的块来最大限度地减少磁盘 I/O。
正确关闭日志文件。
等效于 open(Filename, ...)
,只是读取整个环绕日志文件。
Filename
指定要读取的文件的名称。
类型
-opaque continuation()
由 open/1,2
或 chunk/1,2
返回的延续。
-type open_ret() :: {ok, Continuation :: continuation()} | {error, Reason :: tuple()}.
函数
-spec chunk(Continuation) -> chunk_ret() when Continuation :: continuation().
-spec chunk(Continuation, N) -> chunk_ret() when Continuation :: continuation(), N :: infinity | pos_integer().
可以高效地读取附加到日志的项。通过从文件中读取 64 千字节的块来最大限度地减少磁盘 I/O。
首次调用 chunk/2
时,必须提供从 open/1
或 open/2
返回的初始延续。
当调用 chunk/2
时,N
控制每次从日志中读取的最大项数。infinity
表示读取 8K 块中包含的所有项。如果返回的项少于 N
,这并不一定表示已到达文件末尾。
返回一个元组 {Continuation2, Terms}
,其中 Terms
是日志中找到的项的列表。Continuation2
是另一个延续,必须将其传递给任何后续的 chunk()
调用。通过一系列 chunk()
调用,可以从日志中提取所有项。
如果日志以只读模式打开并且读取的块已损坏,则返回一个元组 {Continuation2, Terms, Badbytes}
。Badbytes
指示在块中找到的非 Erlang 项的数量。请注意,日志未修复。
当到达日志末尾时,返回 {Continuation2, eof}
;如果发生错误,则返回 {error, Reason}
。
返回的延续在下一次调用此函数时有效或无效。这是因为日志可以环绕并删除延续指向的文件。为了确保不会发生这种情况,可以在搜索期间阻止日志。
-spec close(Continuation) -> ok | {error, Reason} when Continuation :: continuation(), Reason :: file:posix().
正确关闭日志文件。
等效于 open(Filename, ...)
,只是读取整个环绕日志文件。
Filename
指定要读取的文件的名称。
N
指定要读取的文件的索引。使用 open/1
读取整个环绕日志。
如果成功打开日志/索引文件,则返回 {ok, Continuation}
。Continuation
用于分块或关闭文件。
对于所有错误,都返回 {error, Reason}
。