查看源代码 wrap_log_reader (内核 v10.2)

用于读取内部格式的环绕磁盘日志的服务。

此模块可以读取内部格式的环绕磁盘日志,请参阅disk_logwrap_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 截断。

概要

类型

open/1,2chunk/1,2 返回的延续。

函数

可以高效地读取附加到日志的项。通过从文件中读取 64 千字节的块来最大限度地减少磁盘 I/O。

正确关闭日志文件。

等效于 open(Filename, ...),只是读取整个环绕日志文件。

Filename 指定要读取的文件的名称。

类型

-type chunk_ret() ::
          {Continuation2 :: term(), Terms :: [term()]} |
          {Continuation2 :: term(), Terms :: [term()], Badbytes :: non_neg_integer()} |
          {Continuation2 :: term(), eof} |
          {error, Reason :: term()}.
-opaque continuation()

open/1,2chunk/1,2 返回的延续。

-type open_ret() :: {ok, Continuation :: continuation()} | {error, Reason :: tuple()}.

函数

-spec chunk(Continuation) -> chunk_ret() when Continuation :: continuation().

等效于 chunk(Continuation, infinity)

链接到此函数

chunk(Continuation, N)

查看源代码
-spec chunk(Continuation, N) -> chunk_ret()
               when Continuation :: continuation(), N :: infinity | pos_integer().

可以高效地读取附加到日志的项。通过从文件中读取 64 千字节的块来最大限度地减少磁盘 I/O。

首次调用 chunk/2 时,必须提供从 open/1open/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().

正确关闭日志文件。

-spec open(Filename) -> open_ret() when Filename :: string() | atom().

等效于 open(Filename, ...),只是读取整个环绕日志文件。

-spec open(Filename, N) -> open_ret() when Filename :: string() | atom(), N :: integer().

Filename 指定要读取的文件的名称。

N 指定要读取的文件的索引。使用 open/1 读取整个环绕日志。

如果成功打开日志/索引文件,则返回 {ok, Continuation}Continuation 用于分块或关闭文件。

对于所有错误,都返回 {error, Reason}