disk_log
disk_log
模块
disk_log
模块摘要
一种基于磁盘的术语日志记录工具。
描述
disk_log
是一种基于磁盘的术语记录器,它能够有效地记录文件上的项。
支持两种类型的日志:
暂停日志
将项附加到单个文件,该文件的大小可由disk_log
模块。
包装原木
使用有限大小的包装日志文件序列。当一个包装日志文件被填充时,更多的项目将登录到序列中的下一个文件中,当最后一个文件被填充时,从第一个文件开始。
出于效率原因,项目总是以二进制文件的形式写入文件。
支持日志文件的两种格式:
内部格式
支持未正确关闭的日志文件的自动修复,并使用本模块
中定义的一组函数来高效地读取块
中记录的项目。这是阅读内部格式化日志的唯一方法。记录到内部格式化日志的项目不得占用超过4 GB的磁盘空间(该大小必须适合4个字节)。
外部格式
让用户来读取和解释记录的数据。大disk_log
模块无法修复外部格式化的日志。
对于每个打开的磁盘日志,一个进程处理对磁盘日志的请求。该进程在open/1
调用时创建,前提是不存在处理磁盘日志的进程。打开磁盘日志的进程可以是磁盘日志的所有者
或匿名用户
。每个所有者
都链接到磁盘日志进程,并且所有者
可以明确地(通过调用close/1
或lclose/1,2
)终止磁盘日志或终止。
业主可订阅通知
,表单的消息{disk_log, Node, Log, Info}
,当某些事件发生时从磁盘日志进程发送,请参见函数,特别是open/1
期权notify
一个日志可以有许多所有者,但是一个进程不能拥有一个超过一次的日志。但是,同一进程可以作为用户多次打开日志。
为了使磁盘日志进程正确关闭其文件并终止,它必须由其所有者关闭,并在每次匿名使用日志时由某个非所有者进程关闭一次。当磁盘日志进程终止时,用户将被计算在内,并且绝不能留下任何用户。
项目可以记录同步
使用功能log/2
,blog/2
,log_terms/2
,和blog_terms/2
。对于这些函数中的每一个函数,调用者都被置于保持状态直到项目被记录(但不一定写入,用于sync/1
确保)。通过a
为每个提到的函数名称添加一个,我们可以获得异步
记录项目的函数。异步
函数不会等待磁盘日志进程将项目写入文件,而是立即或多或少地将控制权返回给调用者。
当使用日志的内部格式,可使用功能log/2
,log_terms/2
,alog/2
,和alog_terms/2
。这些函数记录一个或多个Erlang条款。通过在每个函数前添加一个b
(用于“二进制”),我们可以获得blog()
外部格式的相应函数。这些函数记录一个或多个字节块。例如,要"hello"
以ASCII格式记录字符串,可以使用disk_log:blog(Log, "hello")
或disk_log:blog(Log, list_to_binary("hello"))
。这两种选择同样有效。
这些blog()
函数也可以用于内部格式化的日志,但在这种情况下,它们必须用调用构造的二进制文件调用term_to_binary/1
。没有检查来确保这一点,这完全是调用者的责任。如果使用不符合Erlang条款的二进制文件调用这些函数,则chunk/2,3
自动修复功能失败。chunk/2,3
调用时会返回相应的术语(不是二进制文件)。
如果对任何日志的
请求自动发送到其他日志,则称在不同节点上运行的具有相同名称的开放磁盘日志的
集合为分布式磁盘日志
。这种集合的成员称为单独的分布式磁盘日志
,或者如果没有混淆风险,则只是分布式磁盘日志
。这种集合的成员之间没有秩序。例如,记录的术语在写入其他节点之前不一定写入发出请求的节点。然而,一些功能不作要求分配磁盘日志中的所有成员,即info/1
,chunk/2,3
,bchunk/2,3
,chunk_step/3
,和lclose/1,2
。
非分布式磁盘日志的打开磁盘日志称为本地磁盘日志
.本地磁盘日志
只能从运行磁盘日志进程的节点访问,而分布式磁盘日志可以从Erlang系统中的所有节点访问,但与分布式磁盘日志同名的本地磁盘日志
除外。访问本地或分布式磁盘日志的节点上的所有进程都可以记录项或以其他方式更改、检查或关闭日志。
不保证分布式磁盘日志的所有日志文件都包含相同的日志项。没有尝试同步文件的内容。但是,只要每次至少有一个涉及到的节点处于活动状态,所有项都会被记录下来。当将项记录到分布式日志或试图更改日志时,将忽略来自单个日志的答复。如果所有节点都已关闭,则磁盘日志函数将使用nonode
错误。
注
在某些应用程序中,忽略单个日志的答复是不可接受的。在这种情况下,另一种选择是使用许多本地磁盘日志而不是一个分布式磁盘日志,并在不使用disk_log
模块。
异步日志尝试和disk_log
模块。当同步使用时,此模块将返回错误消息,但当异步调用时,该模块不知道在哪里发送错误消息。相反,订阅通知的所有者将收到error_status
留言。
该disk_log
模块不会向error_logger
模块报告错误。由调用者决定是否使用错误记录器。函数format_error/1
可用于从错误答复中生成可读的消息。但是,信息事件在两种情况下发送到错误记录器,即在修复日志时或在读取块时丢失文件时。
错误信息no_such_log
表示指定的磁盘日志未打开。关于磁盘日志文件是否存在,我们什么也不说。
注
如果尝试重新打开或截断日志失败(请参阅reopen/2,3
和truncate/1,2
)磁盘日志进程立即终止。在进程终止之前,链接到所有者和阻止进程(请参阅block/1,2
)将被删除。结果是链接只能在一个方向上工作。任何使用磁盘日志的进程都必须检查no_such_log
是否有其他进程同时截断或重新打开日志。
数据类型
log() = term()
dlog_size() =
infinity |
integer() >= 1 |
{MaxNoBytes :: integer() >= 1, MaxNoFiles :: integer() >= 1}
dlog_format() = external | internal
dlog_head_opt() = none | term() | iodata()
dlog_mode() = read_only | read_write
dlog_type() = halt | wrap
continuation()
大块延续返回的chunk/2,3
,bchunk/2,3
或chunk_step/3
。
invalid_header() = term()
file_error() = term()
出口
accessible_logs() -> {LocalLog, DistributedLog}
类型
返回当前节点上可访问的磁盘日志的名称。第一个列表包含本地磁盘日志,第二个列表包含分布式磁盘日志。
alog(Log, Term) -> notify_ret()
balog(Log, Bytes) -> notify_ret()
类型
将一个项目异步追加到磁盘日志中。alog/2
用于内部格式化的日志和balog/2
外部格式化的日志。balog/2
如果二进制文件是通过调用构造的,也可以用于内部格式化的日志term_to_binary/1
。
所有者订阅通知接收消息read_only
,blocked_log
或者format_external
如果该项目不能在日志被写入,以及可能的消息中的一个wrap
,full
或者error_status
如果一个项目上的日志写入。error_status
如果头部功能出错或发生文件错误,则会发送消息。
alog_terms(Log, TermList) -> notify_ret()
balog_terms(Log, ByteList) -> notify_ret()
类型
将项目列表异步追加到磁盘日志。alog_terms/2
用于内部格式化的日志和balog_terms/2
外部格式化的日志。balog_terms/2
如果二进制文件是通过调用构建的,也可以用于内部格式化的日志term_to_binary/1
。
业主订阅通知收到消息read_only
,blocked_log
或者format_external
如果该项目不能在日志中写的,可能是消息中的一个或多个wrap
,full
和error_status
如果项目被写在日志中。error_status
如果头部功能出错或发生文件错误,则会发送消息。
block(Log) -> ok | {error, block_error_rsn()}
block(Log, QueueLogRecords) -> ok | {error, block_error_rsn()}
类型
打电话给block/1,2
进程可以阻塞日志。如果阻塞进程不是日志的所有者,则在磁盘日志进程和阻塞进程之间创建一个临时链接。如果阻塞进程终止而不首先关闭或解除阻塞日志,则链接将确保磁盘日志被解除阻塞。
任何进程都可以探测阻塞的日志info/1
或关闭日志close/1
。阻挡过程也可以使用函数chunk/2,3
,bchunk/2,3
,chunk_step/3
,和unblock/1
,而不受由块。除了迄今为止提到的用于更新或读取阻止的日志的任何其他尝试之外,尝试暂停调用过程,直到日志解除阻止或返回错误消息{blocked_log, Log}
,具体取决于值QueueLogRecords
是true
或false
。QueueLogRecords
默认为true
,被使用block/1
。
change_header(Log, Header) -> ok | {error, Reason}
类型
更改选项的值head
或head_func
对于磁盘日志的所有者。
change_notify(Log, Owner, Notify) -> ok | {error, Reason}
类型
更改选项的值notify
对于磁盘日志的所有者。
change_size(Log, Size) -> ok | {error, Reason}
类型
更改打开日志的大小。对于暂停日志,大小总是可以增加,但不能缩小到小于当前文件大小的大小。
对于包装日志,只要文件数量不超过65000,文件大小和数量都可以增加。如果文件的最大数量减少,则在当前文件已满并将日志包装到下一个文件之前,更改无效。下次日志包装时,即开始将冗余文件记录到第1号文件时,冗余文件就会被删除。
例如,假设旧的最大文件数为10,新的最大文件数为6.如果当前文件数不大于新的最大文件数,则在文件6时删除文件7-10已满并且日志开始再次写入文件编号1。否则,大于当前文件的文件将在当前文件已满时被删除(例如,如果当前文件为8,文件9和10将被删除)。新文件6的最大数量与当前文件(即文件7和8)之间的文件在下次文件6已满时被删除。
如果文件的大小减小,则更改将立即影响当前日志。在下次使用日志文件之前,它不会更改已满日志文件的大小。
如果减少了日志大小,例如,为了节省空间,函数inc_wrap_file/1
可用于强制日志包装。
chunk(Log, Continuation) -> chunk_ret()
chunk(Log, Continuation, N) -> chunk_ret()
bchunk(Log, Continuation) -> bchunk_ret()
bchunk(Log, Continuation, N) -> bchunk_ret()
类型
高效地读取附加到内部格式化日志的术语。它通过从文件中读取64千字节块来最小化磁盘I / O。函数bchunk/2,3
返回从文件读取的二进制文件,它们不会调用binary_to_term()
。除此之外,他们的工作就像chunk/2,3
。
第一次chunk()
(或bchunk()
)被调用时start
,必须提供初始延续,即原子。如果磁盘日志进程正在当前节点上运行,则从该日志中读取术语。否则,选择某个其他节点上的单个分布式日志,如果存在这样的日志。
何时chunk/3
叫做,N
控制从每个块中的日志中读取的最大项数。默认为infinity
,这意味着读取64 KB块中包含的所有术语。如果少于N
返回的条件,这并不一定意味着文件的结束。
chunk()
返回元组{Continuation2, Terms}
,在哪里Terms
日志中找到的术语列表。Continuation2
是另一个延续,必须将其传递到后续的任何调用中。chunk()
.一系列的电话chunk()
,可以提取日志中的所有术语。
chunk(){Continuation2, Terms, Badbytes}
如果以只读模式打开日志并且读取的块已损坏,则返回一个元组。Badbytes
是在文件中发现不是Erlang术语的字节数。注意日志没有被修复。当试图从以读写模式打开的日志中读取块时,{corrupt_log_file, FileName}
如果读取的块已损坏,则返回元组。
chunk()
回报eof
当到达日志的末尾时,或{error, Reason}
如果发生错误。如果缺少包装日志文件,则在错误日志上输出一条消息。
何时chunk/2,3
如果与包装日志一起使用,则返回的继续在下一次调用中可能无效。chunk()
这是因为日志可以包装和删除延续点所在的文件。为了防止这种情况,可以在搜索期间阻塞日志。
chunk_info(Continuation) -> InfoList | {error, Reason}
类型
返回对{node, Node}
,描述由返回块延续chunk/2,3
,bchunk/2,3
或chunk_step/3
。
从运行的磁盘日志中读取术语Node
。
chunk_step(Log, Continuation, Step) ->
{ok, any()} | {error, Reason}
类型
可以用于chunk/2,3
并bchunk/2,3
搜索内部格式化的换行日志。它需要作为参数,通过返回的延续chunk/2,3
,bchunk/2,3
或chunk_step/3
和步骤向前(或向后)Step
在包的日志文件。返回的延续指向新当前文件中的第一个日志项。
如果atom start
被指定为continuation,则选择从中读取术语的磁盘日志。当前节点上的本地或分布式磁盘日志优先于某个其他节点上的单独分布式日志。
如果由于尚未使用所有文件,包装日志未满,{error, end_of_log}
如果试图跳出日志,则返回。
close(Log) -> ok | {error, close_error_rsn()}
类型
正确关闭本地或分布式磁盘日志。在Erlang系统停止之前,必须关闭内部格式化的日志。否则,日志将被视为未关闭的,下次打开日志时将启动自动修复过程。
只要有日志的所有者或用户,磁盘日志进程就不会终止。所有所有者必须关闭日志,可能是通过终止。此外,任何其他进程,不仅是匿名打开日志的进程,都可以减少users
通过关闭日志来计数。如果没有用户,则忽略不属于所有者的进程关闭日志的尝试。
如果日志被关闭进程阻塞,则日志也会被解除阻塞。
format_error(Error) -> io_lib:chars()
类型
给定此模块中任何函数返回的错误,此函数将返回英文错误的描述性字符串。对于文件错误,函数format_error/1
在模块中file
叫做。
inc_wrap_file(Log) -> ok | {error, inc_wrap_error_rsn()}
类型
强制内部格式化的磁盘日志开始记录到下一个日志文件。例如,它可以与change_size/2
若要减少磁盘日志分配的磁盘空间数量,请执行以下操作。
订阅通知的所有者通常会收到wrap
消息,但如果发生错误时,使用的原因标记为invalid_header
或file_error
,一个error_status
信息被发送了。
info(Log) -> InfoList | {error, no_such_log}
类型
返回{Tag, Value}
描述日志的对。如果磁盘日志进程正在当前节点上运行,则该日志将用作信息源,否则,如果存在此日志,则将在其他节点上选择单个分布式日志。
对于所有日志,将返回以下对:
{name, Log}
Log
是open/1
选项指定的日志名称name
。
{file, File}
用于暂停日志File
是文件名,以及包装日志的名称。File
是基本名称。
{type, Type}
Type
是open/1
选项指定的日志类型type
。
{format, Format}
Format
是open/1
选项指定的日志格式format
。
{size, Size}
Size
是由open/1
选项指定的日志大小size
,还是由设置的大小change_size/2
。设置的值change_size/2
立即反映出来。
{mode, Mode}
Mode
是由open/1
选项指定的日志模式mode
。
{owners, [{pid(), Notify}]}
Notify
是由日志所有者的open/1
选项notify
或函数设置的值change_notify/3
。
{users, Users}
Users
是日志的匿名用户数量,请参阅open/1
选项linkto
。
{status, Status}
Status
是ok
或{blocked, QueueLogRecords}
由功能block/1,2
和设置unblock/1
。
{node, Node}
当前调用函数返回的信息info/1
是从运行的磁盘日志进程中收集的Node
。
{distributed, Dist}
如果日志在当前节点上是本地的,则Dist
具有该值local
,否则将分发日志的所有节点作为列表返回。
以read_write
模式打开的所有日志都会返回以下对:
{head, Head}
根据的价值open/1
选择head
和head_func
,或通过设置功能change_header/2
,价值Head
为none
(默认值), {head, H}
(head
选件),或{M,F,A}
(head_func
可选)。
{no_written_items, NoWrittenItems}
NoWrittenItems
自创建磁盘日志进程以来写入日志的项数。
中打开的暂停日志返回以下对read_write
模式:
{full, Full}
Full
是true
或false
取决于停止日志是否已满。
以read_write
模式打开的换行日志返回以下对:
{no_current_bytes, integer() >= 0}
写入当前包装日志文件的字节数。
{no_current_items, integer() >= 0}
写入当前包装日志文件的项数(包括头)。
{no_items, integer() >= 0}
所有包装日志文件中的项目总数。
{current_file, integer()}
范围中当前换行日志文件的序号1..MaxNoFiles
,其中MaxNoFiles
由open/1
选项指定size
或由设置change_size/2
。
{no_overflows, {SinceLogWasOpened, SinceLastInfo}}
SinceLogWasOpened
(SinceLastInfo
)是一个换行日志文件已被填充的次数,并且一个新文件被打开或inc_wrap_file/1
自磁盘日志上次打开(info/1
上次被调用)以来一直被调用。第一次info/2
在日志被重新打开或截断后调用,两个值相等。
注意函数chunk/2,3
,bchunk/2,3
并且chunk_step/3
不影响任何返回的值info/1
。
lclose(Log) - > ok | {error,lclose_error_rsn()}
lclose(Log,Node) - > ok | {error,lclose_error_rsn()}
类型
lclose/1
关闭当前节点上的本地日志或单个分布式日志。
lclose/2
如果指定节点不是当前节点,则关闭指定节点上的单个分布式日志。
lclose(Log)
相当于lclose(Log, node())
。另见close/1
。
如果指定节点上不存在具有指定名称的日志,no_such_log
会被归还。
log(Log, Term) -> ok | {error, Reason :: log_error_rsn()}
blog(Log, Bytes) -> ok | {error, Reason :: log_error_rsn()}
类型
将一个术语同步追加到磁盘日志中。返回ok
或{error, Reason}
当术语写入磁盘时。如果日志分发,ok
则返回,除非所有节点都关闭。术语是由write()
操作系统的普通功能编写的。因此,不能保证该术语被写入磁盘,它可以在操作系统内核中逗留一段时间。为确保将项目写入磁盘,sync/1
必须调用函数。
log/2
用于内部格式化的日志,以及blog/2
用于外部格式化的日志。blog/2
如果二进制文件是通过调用构造的,也可以用于内部格式化的日志term_to_binary/1
。
error_status
如果错误原因标记为invalid_header
或,则订阅通知的所有者会收到错误消息并通知您file_error
。
log_terms(Log, TermList) ->
ok | {error, Resaon :: log_error_rsn()}
blog_terms(Log, BytesList) ->
ok | {error, Reason :: log_error_rsn()}
类型
将项目列表同步追加到日志中。这是更有效地使用,而不是功能这些功能log/2
和blog/2
。指定的列表被分割为尽可能大的子列表(受封装日志文件大小的限制),并且每个子列表都记录为一个单独的项目,这可以降低开销。
log_terms/2
用于内部格式化的日志,以及blog_terms/2
用于外部格式化的日志。blog_terms/2
如果二进制文件是通过调用构建的,也可以用于内部格式化的日志term_to_binary/1
。
error_status
如果错误原因标记为invalid_header
或,则订阅通知的所有者会收到错误消息并通知您file_error
。
open(ArgL) -> open_ret() | dist_open_ret()
类型
参数ArgL
是下列选项的列表:
{name, Log}
指定日志名称。在所有后续日志记录操作中,必须将此名称作为参数传递。必须始终提供名称。
{file, FileName}
指定用于记录术语的文件的名称。如果省略此值并且日志名称是原子或字符串,则文件名默认lists:concat([Log, ".LOG"])
为停止日志。
对于换行日志,这是文件的基本名称。包装日志中的每个文件都被调用<base_name>.N,其中N是一个整数。每个换行日志还有两个名为<base_name>.idx和的文件<base_name>.siz。
{linkto, LinkTo}
如果LinkTo
是pid,它将成为日志的所有者。如果LinkTo
是none
,日志会记录它在某些进程中通过递增users
计数器匿名使用。默认情况下,调用的进程open/1
拥有日志。
{repair, Repair}
如果Repair
是true
,则根据需要修复当前日志文件。在启动恢复时,会在错误日志上输出一条消息。如果false
指定,则不会尝试自动修复。相反,{error, {need_repair, Log}}
如果试图打开损坏的日志文件,则会返回元组。如果truncate
指定,则日志文件将被截断,从而创建一个空日志。默认为true
,它对以只读模式打开的日志没有影响。
{type, Type}
日志类型。默认为halt
。
{format, Format}
磁盘日志格式。默认为internal
。
{size, Size}
原木大小。
当暂停日志达到其最大大小时,所有记录更多项的尝试都将被拒绝。默认为infinity
,这意味着没有最大的大小。
对于换行日志,参数Size
可以是一对{MaxNoBytes, MaxNoFiles}
或者一对infinity
。在后一种情况下,如果可以找到具有相同名称的现有换行日志的文件,则从现有换行日志读取大小,否则返回错误。
换行日志MaxNoBytes
在每个文件上写入大多数字节,并MaxNoFiles
在全部使用第一个换行日志文件开始之前使用文件。无论如何MaxNoBytes
,在包装到下一个文件之前,每个包装日志文件上至少会写入标题(如果有)和一个项目。
打开现有的包装日志时,不需要为选项提供值。Size
,但任何提供的值都必须等于当前日志大小,否则为元组。{error, {size_mismatch, CurrentSize, NewSize}}
会被归还。
{distributed, Nodes}
此选项可用于向分布式磁盘日志添加成员。默认为[]
,这意味着日志在当前节点上是本地的。
{notify, boolean()}
如果true
,当某些日志事件发生时,将通知日志所有者。默认为false
当发生事件时,向所有者发送下列消息之一:
{disk_log, Node, Log, {wrap, NoLostItems}}
当包装日志已填充其一个文件并打开一个新文件时发送。NoLostItems
在截断现有文件时丢失的以前记录的项的数目。
{disk_log, Node, Log, {truncated, NoLostItems}}
当日志被截断或重新打开时发送。用于暂停日志NoLostItems
自创建磁盘日志进程以来在日志上写入的项数。用于包装日志NoLostItems
所有包装日志文件上的项数。
{disk_log, Node, Log, {read_only, Items}}
当异步日志尝试访问以只读模式打开的日志文件时发送。Items
日志尝试中的项。
{disk_log, Node, Log, {blocked_log, Items}}
当异步日志尝试发送到没有队列日志尝试的阻塞日志时发送。Items
日志尝试中的项。
{disk_log, Node, Log, {format_external, Items}}
当功能发送alog/2
或alog_terms/2
用于内部格式化日志时发送。Items
是来自日志尝试的项目。
{disk_log, Node, Log, full}
当尝试将项目记录到换行日志时,会发送比选项设置的限制更多的字节size
。
{disk_log, Node, Log, {error_status, Status}}
当错误状态改变时发送。错误状态通过登录项目日志,或截断日志,还是最后使用的函数中的最后尝试的结果定义sync/1
,inc_wrap_file/1
或change_size/2
。Status
是ok
或者{error, Error}
,前者是初始值。
**`{head, Head}`**
指定要首先在日志文件上写入的标题。如果日志是包装日志,则项Head
首先写入每个新文件。Head
如果格式是internal
,否则为字节序列。默认为none
,这意味着在文件上不首先写入任何头。
{head_func, {M,F,A}}
指定每次打开新日志文件时要调用的函数。该呼叫M:F(A)
被假定返回{ok, Head}
。该项目Head
首先写入每个文件。Head
如果格式是一个术语internal
,否则是一个字节序列。
{mode, Mode}
指定日志是以只读模式还是读写模式打开。默认为read_write
。
{quiet, Boolean}
指定是否error_logger
使用日志文件将消息发送到可恢复的错误。默认为false
。
open/1{ok, Log}
如果日志文件成功打开,则返回。如果文件成功修复,{repaired, Log, {recovered, Rec}, {badbytes, Bad}}
则返回元组,其中Rec
是在文件中找到的整个Erlang项Bad
的数量,并且是文件中非Erlang项的字节数。如果distributed
指定了参数,则open/1
返回成功答复列表和错误答复列表。每个回复标有节点名称。
当以读写模式打开磁盘日志时,将检查任何现有的日志文件。如果没有,则创建一个新的空白日志,否则现有文件将在最后一个记录项目之后的位置打开,并且从那里开始记录项目。如果格式为internal
,并且现有文件未被识别为内部格式化日志,{error, {not_a_log_file, FileName}}
则返回元组。
open/1
不能用于更改打开日志的选项值。当有业主之前或日志的用户,除了所有选项值name
,linkto
以及notify
只核对作为选项值之前提供的值的功能open/1
,change_header/2
,change_notify/3
,或change_size/2
。因此,除了name
强制性外,没有任何选项。如果某个指定值与当前值不同,{error, {arg_mismatch, OptionName, CurrentValue, Value}}
则返回一个元组。
注
如果所有者再次尝试以所有者的身份打开日志,则会使用返回值进行确认{ok, Log}
,但磁盘日志的状态不受影响。
如果具有指定名称的日志在某个节点上是本地的,并且试图打开分布在同一节点上的日志,{error, {node_already_open, Log}}
则返回该元组。如果日志分布在某个节点上,并且尝试在同一节点上本地打开日志,则返回相同的元组。首次打开单个分布式磁盘日志会将这些日志添加到(可能为空)分布式磁盘日志中。提供的选项值用于选项提到的所有节点上distributed
。单独的分布式日志对彼此的选项值一无所知,因此可以通过创建具有多个呼叫的分布式日志来给每个节点赋予唯一的选项值open/1
。
日志文件可以通过给选项赋予不同的值name
或在不同节点上分发日志时使用相同的文件多次打开。这取决于模块的用户,disk_log
以确保不超过一个磁盘日志进程具有对任何文件的写入访问权限,否则该文件可能会损坏。
如果尝试首次打开日志文件失败,则磁盘日志进程将以EXIT消息终止{{failed,Reason},[{disk_log,open,1}]}
。该函数返回{error, Reason}
所有其他错误。
pid2name(Pid) -> {ok, Log} | undefined
类型
返回给定当前节点上磁盘日志进程的PID的日志名称,或undefined
如果指定的PID不是磁盘日志进程。
此函数仅用于调试。
reopen(Log, File) -> ok | {error, reopen_error_rsn()}
reopen(Log, File, Head) -> ok | {error, reopen_error_rsn()}
breopen(Log, File, BHead) -> ok | {error, reopen_error_rsn()}
类型
将日志文件重命名为File
然后重新创建一个新的日志文件。如果存在包装日志,File
用作重命名文件的基本名称。默认情况下,给出的标头open/1
首先在新打开的日志文件中写入,但如果参数为Head
或BHead
指定时,将使用此项。头参数只使用一次。下一次打开包装日志文件时,给出的头open/1
被使用了。
reopen/2,3
用于内部格式化日志,以及breopen/3
用于外部格式化日志。
订阅通知的所有者将收到truncate
留言。
在无法重新打开日志时,磁盘日志进程将以EXIT消息终止{{failed,Error},[{disk_log,Fun,Arity}]}
。具有排队请求的其他进程接收消息{disk_log, Node, {error, disk_log_stopped}}
。
sync(Log) -> ok | {error, sync_error_rsn()}
类型
确保将日志内容写入磁盘。这通常是一个相当昂贵的操作。
truncate(Log) -> ok | {error, trunc_error_rsn()}
truncate(Log, Head) -> ok | {error, trunc_error_rsn()}
btruncate(Log, BHead) -> ok | {error, trunc_error_rsn()}
类型
从磁盘日志中删除所有项目。如果指定了参数Head
或BHead
该参数,则该项目首先写入新截断的日志中,否则使用给定的标题open/1
。标题参数只能使用一次。下一次打开日志文件时,open/1
会使用给定的标题。
truncate/1,2
用于内部格式化日志,以及btruncate/2
用于外部格式化日志。
订阅通知的所有者将收到truncate
留言。
如果尝试截断日志失败,则磁盘日志进程将以EXIT消息终止{{failed,Reason},[{disk_log,Fun,Arity}]}
。具有排队请求的其他进程接收消息{disk_log, Node, {error, disk_log_stopped}}
。
unblock(Log) -> ok | {error, unblock_error_rsn()}
类型
取消阻止日志。日志只能通过阻止进程解除阻止。
另见
file(3)
,,,pg2(3)
,,,wrap_log_reader(3)