Types
type level = | Debug | Debugging message. They can be automatically removed by the syntax extension. |
| Info | Informational message. Suitable to be displayed when the program is in verbose mode. |
| Notice | Same as |
| Warning | Something strange happend |
| Error | An error message, which should not means the end of the program. |
| Fatal | A fatal error happened, in most cases the program will end after a fatal error. |
Type of log levels. A level determines the importance of a message
Type of a logger. A logger is responsible for dispatching messages and storing them somewhere.
Each logging message has a section. Sections can be used to structure your logs. For example you can choose different loggers according to the section.
Each section carries a level, and messages with a lower log level than than the section level will be dropped.
Section levels are initialised using the contents of the LWT_LOG environment variable, which must contain one or more rules of the form pattern -> level separated by ";". Where pattern is a string that may contain *.
For example, if LWT_LOG contains:
access -> warning;
foo[*] -> errorthen the level of the section "access" is Warning and the level of any section matching "foo[*]" is Error.
If the pattern is omited in a rule then the pattern "*" is used instead, so LWT_LOG may just contain "debug" for instance.
By default, the following rule apply : "* -> notice"
val string_of_level : level -> stringval level_of_string : string -> level optionReset the rules set when parsing the LWT_LOG environment variable using this string.
- parameter fail_on_error
defines if the function will raise Failure if it encounters a malformed rule
- raises Failure
if an invalid rule is found and
fail_on_erroris trueload_rulesparses the rules string and validates the rules before loading them. Iffail_on_erroristrue, invalid rules will cause this function to raiseFailureand leave existing rules unchanged. Iffail_on_errorisfalse(this is the default), it tries to load as many rules as possible and ignore invalid ones. If the rules string itself cannot be parsed, existing rules are always left unchanged.Example:
Lwt_log_core.load_rules ~fail_on_error:true "* -> nosuchlevel" (* Raises Failure *) Lwt_log_core.load_rules "* -> info"
val add_rule : string -> level -> unitadd_rule pattern level adds a rule for sections logging levels. The rule is added before all other rules. It takes effect immediately and affects all sections for which the level has not been set explicitly with Section.set_level. pattern may contains *. For example:
Lwt_log_core.add_rule "lwt*" Lwt_log_core.Infoval append_rule : string -> level -> unitappend_rule pattern level adds the given rule after all other rules. For example to set the default fallback rule:
Lwt_log_core.append_rule "*" Lwt_log_core.InfoLogging functions
val log : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> level:level -> string -> unit Lwt.tlog ?section ?logger ~level message logs a message.
section defaults to Section.main. If logger is not specified, then the default one is used instead (see default).
If exn is provided, then its string representation (= Printexc.to_string exn) will be append to the message, and if possible the backtrace will also be logged.
location contains the location of the logging directive, it is of the form (file_name, line, column).
val log_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> level:level -> ('a, unit, string, unit Lwt.t) Stdlib.format4 -> 'alog_f is the same as log except that it takes a format string
val ign_log : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> level:level -> string -> unitSame as log but ignore the resulting thread.
val ign_log_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> level:level -> ('a, unit, string, unit) Stdlib.format4 -> 'aSame as log_f but ignore the resulting thread.
val debug : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unit Lwt.tval debug_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit Lwt.t) Stdlib.format4 -> 'aval ign_debug : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unitval ign_debug_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit) Stdlib.format4 -> 'aval info : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unit Lwt.tval info_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit Lwt.t) Stdlib.format4 -> 'aval ign_info : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unitval ign_info_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit) Stdlib.format4 -> 'aval notice : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unit Lwt.tval notice_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit Lwt.t) Stdlib.format4 -> 'aval ign_notice : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unitval ign_notice_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit) Stdlib.format4 -> 'aval warning : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unit Lwt.tval warning_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit Lwt.t) Stdlib.format4 -> 'aval ign_warning : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unitval ign_warning_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit) Stdlib.format4 -> 'aval error : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unit Lwt.tval error_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit Lwt.t) Stdlib.format4 -> 'aval ign_error : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unitval ign_error_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit) Stdlib.format4 -> 'aval fatal : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unit Lwt.tval fatal_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit Lwt.t) Stdlib.format4 -> 'aval ign_fatal : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> string -> unitval ign_fatal_f : ?exn:exn -> ?section:section -> ?location:(string * int * int) -> ?logger:logger -> ('a, unit, string, unit) Stdlib.format4 -> 'amodule Section : sig ... endSections
Log templates
A template is for generating log messages.
It is a string which may contains variables of the form $(var), where var is one of:
messagewhich will be replaced by the message emitedlevelwhich will be replaced by a string representation of the levelsectionwhich will be replaced by the name of the message's sectionloc-filewhich will be replaced by the file name of the calling logging functionloc-linewhich will be replaced by the line number of the calling logging functionloc-columnwhich will be replaced by the column number of the calling logging function
For example:
"$(name): $(message)""$(name): $(loc-file): $(loc-line): $(loc-column): $(message)"
val render : buffer:Stdlib.Buffer.t -> template:template -> section:section -> level:level -> message:string -> unitrender ~buffer ~template ~section ~level ~message instantiate all variables of template, and store the result in buffer. The location is obtained from threads local storage.
val location_key : (string * int * int) Lwt.keyThe key for storing current location.
Loggers
val make : output:(section -> level -> string list -> unit Lwt.t) -> close:(unit -> unit Lwt.t) -> loggermake ~output ~close creates a new logger.
- parameter output
is used to write logs. It is a function which receive a section, a level and a list lines that must be logged together.
- parameter close
is used to close the logger.
val default : logger Stdlib.refThe default logger. It is used as default when no one is specified. If Lwt_core is linked (in the package lwt.unix) the default logger sends all messages to standard error. Otherwise the default logger is null.
broadcast loggers is a logger which send messages to all the given loggers.
Note: closing a broadcast logger does not close its components.
dispatch f is a logger which dispatch logging instructions to different logger according to their level and/or section.
Here is an example:
let access_logger = Lwt_log.file "access.log"
and error_logger = Lwt_log.file "error.log" in
Lwt_log_core.dispatch
(fun section level ->
match Lwt_log_core.Section.name section, level with
| "access", _ -> access_logger
| _, Lwt_log_core.Error -> error_logger)Predefined loggers
val null : loggerLogger which drops everything