Basic logging facility
The purpose of this module is to define a mutable logging function
which ensures to be always pointing to a valid logging implementation.
By default, the function prints the messages to stderr, prepended
by a timestamp. In Netplex context, the implementation is changed so
that the Netplex logger is used instead (see [root:Netplex_log]), and
logf functions below have the same effect as
the counterparts in [root:Netplex_cenv] with the same name.
The log levels (syslog-like)
The variable containing the current logger function.
channel_logger stderr `Debug at program startup.
Assign something else to this variable in order to change the
log destination or the log level.
The level names indexed by weight
format_timestamp fmt digits (seconds,nanos): Formats the timestamp
(seconds,nanos) and returns the string. Pass in
digits the number
of digits for fractional seconds.
`Std: This is the "%c" format of
`ISO: ISO-8601 format
Controlling messages for debugging Ocamlnet
Many Ocamlnet modules can emit debug messages. For a module
M (e.g. [root:Rpc_client]) there is usually a sub module
M.Debug providing functions controlling the debug messages.
These functions send the messages to this
Debug module, and from here
they are forwarded to Netlog.log (with a level of
In this module everything is by default initialized to enable
debug messages (i.e.,
current_dlogger is set to
and this function sends the messages to
current_logger where they are
channel_logger stderr `Debug). However, the debugged
modules also need to be enabled individually. One can do this
by setting the variable
true, or by calling
enable_all (see below).
Although this debug interface is mainly intended for Ocamlnet
itself, it is not restricted to this. In order to use it for
a user module, one has to register the boolean variable that
controls whether debug messages are enabled (see
below). This should be done at module initialization time, and
before any thread is spawned.
Debug logger: The first string is the module name, and the second is the message
The standard debug logger simply prepends the module name to the message (separated by ": "), and calls the current logger to print it
Writes a log message
Enable or disable the passed module
enable_module "Rpc_client"). No exception is raised when
the module name is invalid! Because of this, it is usually safer
to change the variable
M.Debug.enable directly (e.g.
Rpc_client.Debug.enable := true).
Enable all modules
Disable all modules (the default)
Return the possible module names for
Netlog.Debug also has a little hash table that maps file descriptors
to an info record. This allows it to track file descriptors more
easily, and to find file descriptor leaks, and "double close" bugs.
All long-living descriptors managed by Ocamlnet should go into this
A serial number for the optional tracking of ownership
track_fd ~owner ~descr fd: Enters the descriptor
fd into the
descriptor table. The
owner string should be set to the module
descr one can give additional information, e.g. about
the purpose, and details like the file name.
It is not an error if there is also an entry for the descriptor
fd. However, a warning is emitted (using the debug logger).
true, this warning can be suppressed.
The old entry is overwritten by the new one.
anchor can be an arbitrary boxed value. When the garbage
collector calls the finaliser for
anchor the descriptor is
marked as dead, and will be tagged in the
fd_table as such.
sn to a new serial number, the knowledge of this
number is required to update the descriptor entry later,
and to release the descriptor. If the entry is tried to be
updated or released with the wrong serial number, a warning
is emitted (to the debug logger).
Removes this descriptor from the descriptor table.
It is not an error if the descriptor does not exist in the table. However, a warning is emitted (using the debug logger).
release_fd must be invoked before the descriptor is actually
force: If set, all warnings are suppressed
Return a string for generating debug messages. By default, the string only includes the numeric descriptor value.
owner is set to true, the string also includes the owner.
descr is set to true, the string also includes the description.
The full version of this string looks like "76(Http_client - 18.104.22.168:80)". An untracked descriptor looks like "76(?)".
Returns the table of descriptors as list of lines.
One can easily print them to stdout using
List.iter print_endline (fd_table()).