1 .\" Copyright (c) 2005-2013 Apple Inc.
2 .\" All rights reserved.
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\" notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\" notice, this list of conditions and the following disclaimer in the
11 .\" documentation and/or other materials provided with the distribution.
12 .\" 4. Neither the name of Apple Computer nor the names of its contributors
13 .\" may be used to endorse or promote products derived from this software
14 .\" without specific prior written permission.
16 .\" THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER AND CONTRIBUTORS ``AS IS'' AND
17 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 .Nm asl_add_log_file ,
34 .Nm asl_add_outout_file ,
37 .Nm asl_close_auxiliary_file ,
39 .Nm asl_create_auxiliary_file ,
40 .Nm asl_decode_buffer ,
41 .Nm asl_encode_buffer ,
42 .Nm asl_fetch_key_val_op ,
50 .Nm asl_log_auxiliary_location ,
51 .Nm asl_log_descriptor ,
56 .Nm asl_open_from_file ,
61 .Nm asl_remove_index ,
62 .Nm asl_remove_log_file ,
63 .Nm asl_reset_iteration ,
69 .Nm asl_set_output_file_filter ,
73 .Nm aslresponse_free ,
75 .Nd system log message sending and searching functions
81 .Fa "asl_object_t client"
85 .Fo asl_add_output_file
86 .Fa "asl_object_t client"
88 .Fa "const char *msg_fmt"
89 .Fa "const char *time_fmt"
91 .Fa "int text_encoding"
95 .Fa "asl_object_t obj"
96 .Fa "asl_object_t msg"
101 .Fa "asl_object_t obj"
104 .Fo asl_close_auxiliary_file
109 .Fa "asl_object_t obj"
112 .Fo asl_create_auxiliary_file
113 .Fa "asl_object_t msg"
114 .Fa "const char *title"
115 .Fa "const char *uti"
116 .Fa "int *out_descriptor"
119 .Fo asl_decode_buffer
125 .Fo asl_encode_buffer
130 .Fo asl_fetch_key_val_op
131 .Fa "asl_object_t msg"
133 .Fa "const char **key"
134 .Fa "const char **val"
139 .Fa "asl_object_t msg"
140 .Fa "const char *msg_fmt"
141 .Fa "const char *time_fmt"
142 .Fa "uint32_t text_encoding"
144 .Ft [DEPRECATED] void
146 .Fa "asl_object_t obj"
150 .Fa "asl_object_t msg"
151 .Fa "const char *key"
155 .Fa "asl_object_t list"
160 .Fa "asl_object_t obj"
164 .Fa "asl_object_t msg"
169 .Fa "asl_object_t obj"
170 .Fa "asl_object_t msg"
172 .Fa "const char *format"
176 .Fo asl_log_auxiliary_location
177 .Fa "asl_object_t msg"
178 .Fa "const char *title"
179 .Fa "const char *uti"
180 .Fa "const char *url"
183 .Fo asl_log_descriptor
184 .Fa "asl_object_t client"
185 .Fa "asl_object_t msg"
188 .Fa "uint32_t fd_type"
193 .Fa "const char *format"
198 .Fa "asl_object_t obj"
199 .Fa "asl_object_t querylist"
203 .Fa "uint32_t duration"
204 .Fa "int32_t direction"
212 .Fa "asl_object_t obj"
216 .Fa "const char *ident"
217 .Fa "const char *facility"
221 .Fo asl_open_from_file
223 .Fa "const char *ident"
224 .Fa "const char *facility"
228 .Fa "const char *path"
233 .Fa "asl_object_t obj"
234 .Fa "asl_object_t msg"
238 .Fa "asl_object_t obj"
242 .Fa "asl_object_t obj"
246 .Fa "asl_object_t list"
250 .Fo asl_remove_log_file
251 .Fa "asl_object_t asl"
255 .Fo asl_reset_iteration
256 .Fa "asl_object_t obj"
257 .Fa "size_t position"
261 .Fa "asl_object_t obj"
265 .Fa "asl_object_t obj"
266 .Fa "asl_object_t query"
270 .Fa "asl_object_t obj"
271 .Fa "asl_object_t msg"
275 .Fa "asl_object_t msg"
276 .Fa "const char *key"
277 .Fa "const char *value"
281 .Fa "asl_object_t asl"
285 .Fo asl_set_output_file_filter
286 .Fa "asl_object_t asl"
292 .Fa "asl_object_t msg"
293 .Fa "const char *key"
294 .Fa "const char *value"
299 .Fa "asl_object_t msg"
300 .Fa "const char *key"
304 .Fa "asl_object_t obj"
305 .Fa "asl_object_t msg"
307 .Fa "const char *format"
310 .Ft [DEPRECATED] void
312 .Fa "asl_object_t obj"
314 .Ft [DEPRECATED] asl_object_t
316 .Fa "asl_object_t obj"
319 These routines provide an interface to the Apple System Log facility and to various
320 data bearing memory objects, files, and storage directories.
322 The API allows client applications to create and manipulate
323 flexible, structured messages, send them to the
325 server, where they may undergo additional processing.
326 Messages received by the server are saved in a data store
327 (subject to input filtering constraints).
329 Log messages may also be written directly to the filesystem from the ASL library.
330 This output may go to plain text files, to ASL-format data files, or to ASL databases.
332 This API permits clients to create queries
333 and search the system ASL database, ASL-format files, or other ASL databases for matching messages.
335 Clients that simply need to send messages to the ASL server may do so using
336 .Fn asl_log_message .
337 Other routines allow for more complex logging tasks.
339 An introduction to the concepts underlying this interface follows the interface summary below.
340 .Ss INTERFACE SUMMARY
346 sends a message to the ASL server
349 is an integer between 7 (ASL_LEVEL_DEBUG) and 0 (ASL_LEVEL_EMERG),
350 indicating the priority of the message.
351 Note that message priority levels are used as the basis of filtering
352 messages in several places in the ASL system.
353 In general, messages with level ASL_LEVEL_DEBUG and ASL_LEVEL_INFO are often excluded from long-term storage,
354 or have shorter time-to-live durations.
357 is a printf-like format string.
358 In addition to the conversion specifications supported by
363 conversion, which is converted to the current error string returned by the
365 function for the current value of
369 is a simplified version of the
372 It uses the default (NULL) ASL client handle.
373 This interface is thread-safe, although callers will contend for a mutex lock when using this routine.
374 Applications that log from multiple threads or dispatch queues may experience undesired performance
375 characteristics when using this routine.
383 is advised for applications that log from multiple threads.
392 prepares a message, normally to be sent to the ASL server
396 may be an asl_object_t of any type.
397 It is typically of type ASL_TYPE_CLIENT.
398 In this case the settings and options associated with the ASL client handle
400 are used when preparing the message.
401 The client may direct the ASL library to
402 print copies of the message to various output files as well as sending it to the ASL server.
403 Filter settings in the client may further direct the library in selecting where the message
404 will be sent, and may in fact prevent the message from being sent to the ASL server at all.
405 ASL client handles are created using
407 and are described extensively below.
409 ASL message are dictionaries.
412 routine combines information carried in the ASL client handle
414 and the ASL message dictionary
418 string and the associated arguments to construct a final message to be sent
419 to the ASL server and/or to be written to output files.
420 In general, the ASL client handle will provide the values for the
421 ASL_KEY_SENDER and ASL_KEY_FACILITY keys.
424 is non-NULL, it may override the values for ASL_KEY_SENDER and ASL_KEY_FACILITY,
425 and it may supply additional key/value pairs.
428 string and it's associated arguments are used to construct a string value for the
429 ASL_KEY_MSG key in the final log message dictionary.
433 parameter is of a type other than ASL_TYPE_CLIENT, then
435 creates a message as if it were to be sent to
437 but rather than sending the message, it stores the message in the
442 is of type ASL_TYPE_FILE or ASL_TYPE_STORE that has been opened for writing,
443 then the message is saved to the file or ASL data store.
446 is of type ASL_TYPE_LIST, then the message is appended to the list.
449 is of type ASL_TYPE_MSG, then the message key/value pairs constructed by
453 In a merge operation, existing keys and values in
458 message are attached.
459 Although this routine works for type ASL_TYPE_QUERY,
460 new key/value pairs are attached with an operation value of zero.
462 The ASL_PREFILTER_LOG(obj, msg, level, format, ...) macro may be used in
467 is of type ASL_TYPE_CLIENT.
468 The macro avoids processing the variable argument list in those cases where
469 the message would be filtered out due to filter settings, would not be
470 written to a log file associated with the asl_object_t, or would not be
472 The macro may provide a performance benefit for some applications.
473 Details on filter setting, additional log files, and asl_object_t options
474 are described below in this manual.
485 except that it takes a va_list argument.
493 except the value for ASL_KEY_MESSAGE is taken from
495 rather than being constructed using a
504 creates and returns a client handle, or NULL if an error occurs in the library.
505 Messages sent using this handle will default to having the string
507 as the value associated with the ASL_KEY_SENDER key, and the value
509 associated with the ASL_KEY_FACILITY key.
512 is NULL, the library uses the sending process name.
515 is NULL, the library will use the
517 facility for processes with non-zero UID, and
519 for processes with zero UID.
521 Several options are available, as described in the
525 Each client handle holds state information that is used when a message is logged using that handle.
526 This information includes the
530 strings and the options from the
533 Client handles also contain various filter, file descriptor, and control data.
535 The state information in a client handle is not protected by locking or thread synchronization mechanisms,
536 except for one special case where NULL is used as a client handle.
537 That special case is described below.
539 It is not safe for two or more threads to use a single client handle simultaneously.
540 Multi-threaded applications should generally create one client handle for each thread
541 or serial dispatch queue that logs messages.
542 A client handle may only be safely shared amongst multiple threads if the application uses locks or some
543 synchronization strategy to ensure single-threaded access.
545 As a special case, the ASL library allows the use of NULL in place of a client handle.
546 In this case, the library uses an internal structure which contains its own lock.
547 Multiple threads may safely use NULL in place of an ASL client handle,
548 although there may be contention for the lock.
550 Applications that use libdispatch may use NULL in place of a client handle,
551 although this may cause undesirable synchronization behavior and degraded performance because of lock contention.
552 A better design is often to use one or more serial dispatch queues specifically for logging.
553 Each such serial queue should use a separate client handle.
559 opens an ASL data store or ASL data file for read or write access.
560 Returns an object of type ASL_TYPE_STORE or ASL_TYPE_FILE,
561 depending on the input parameters.
562 By default, the ASL store or file is opened for reading.
563 The routine checks the filesystem type of
565 and returns an object of type ASL_TYPE_STORE for an ASL data store (a directory in the filesystem)
566 or an object of type ASL_TYPE_FILE for an ASL data file.
569 is NULL, the system's ASL database (/var/log/asl) is opened.
571 If the ASL_OPT_OPEN_WRITE option is specified, an existing file or database is
573 New messages may be added to the file or database using
579 Existing messages in the store or file may not be deleted or modified.
581 If the path does not exist in the filesystem,
583 will create a new data store if ASL_OPT_CREATE_STORE is set in the options,
584 The file will be created with the user's effective UID and GID as owner and group.
585 The mode will be 0644.
586 If a different mode, UID, or GID is desired, an empty file or directory may be
587 pre-created with the desired settings.
592 closes the client handle
594 and releases its associated resources.
596 may also be used to close a client handle.
602 sets a filter for messages being sent to the server.
603 The filter is a bitmask representing priority levels.
604 Only messages having a priority level with a corresponding bit set in the filter mask are sent to the
607 The filter does not control writes to additional files associated with the client handle using
608 .Fn asl_add_output_file .
610 returns the previous filter value.
612 .Fo asl_add_output_file
620 adds the file descriptor
622 to the a set of file descriptors associated with the client handle
624 Each log message sent by that client handle is also written to these file descriptors
625 (depending on the setting of the
628 The message format is specified by the
631 The format for timestamps is specified by the
633 argument, although custom format strings may specify more advanced formats for timestamps.
634 Details on custom format strings are below.
636 Each output file has an associated
639 The filter determines which messages are formatted and written to the file based on the message priority level.
641 Special handling for certain characters is specified by the
644 The supported values and their effect are described below.
648 argument is a character string that tells the library how to format each message written to the output file.
649 There are several pre-defined message formats, described below.
650 Custom formats are also supported,
651 giving complete control over which ASL message keys should be written
652 and the overall format of each output line.
653 The pre-defined formats are identified by constants in the asl.h header file.
655 .Bl -tag -width "ASL_MSG_FMT_RAW" -compact
657 The contents of the ASL message dictionaries are formatted as a list,
658 with each key-value pair formatted as
662 Messages are formatted using the standard ASL message format of the form
664 .Dl Time Host Sender[PID] <Level>: Message
666 Time formats are described below.
669 The legacy format used for plain-text log files.
670 Similar to the ASL_MSG_FMT_STD format, but the message priority level is excluded.
673 The output line contains only the value of the Message key in each ASL message dictionary.
676 Produces multiple lines of output for each ASL message.
677 The message is formatted as an XML dictionary:
680 .Dl \t<key>ASLMessageKey1</key>
681 .Dl \t<string>Key 1 Value</string>
682 .Dl \t<key>ASLMessageKey2</key>
683 .Dl \t<string>Key 2 Value</string>
691 causes the library to use the ASL_MSG_FMT_STD format.
693 Custom format strings may contain a mix of characters that are directly copied to the output line
694 and variables, which are a dollar sign
696 followed by specific ASL message dictionary keys, whose values will be interpolated into the output.
697 For example, the format string:
699 .Dl This message from $Sender PID=$PID at $Time *** $Message
701 would result in lines in the output file like, e.g.:
703 .Dl This message from login PID=982 at Jul 27 08:41:27 *** USER_PROCESS: 330 ttys000
704 .Dl This message from Mail PID=987 at Jul 27 08:42:16 *** Using V2 Layout
706 Normally, a space character terminates a variable name.
707 However, the name may be wrapped in parentheses if a space character is not desired in the output.
710 .Dl $(Sender)[$(PID)]: $Message
712 A third form for specifying variables may be used for the ASL
719 specification using one of the forms below will override the
721 argument to the function.
723 The following forms are recognized:
725 .Bl -tag -width "$((Time)([+|-]HH[:MM]))"
727 Formats a Level value as a string, for example
732 Note that $(Level) or $Level formats the value as an integer 0 through 7.
734 Formats a Level value as a single character from the set
736 for levels 0 through 7.
737 These are abbreviations for Panic, Alert, Critical, Error, Warning, Notice, Info, and Debug.
739 Formats a Time value as the number of seconds since the Epoch.
741 Alias for $((Time)(sec)).
743 Formats a Time value as a string of the form
744 .Dq "Mmm dd hh:mm:ss" ,
745 where Mmm is the abbreviation for the month, dd is the date (1 - 31) and hh:mm:ss is the time.
746 The local timezone is used.
748 Alias for $((Time)(local)).
750 Formats a Time value as a string of the form
751 .Dq "yyyy-mm-dd hh:mm:ssZ" ,
752 using Coordinated Universal Time, or the
756 Alias for $((Time)(utc)).
758 Where X may be any letter in the range A - Z or a - z.
759 Formats the Time using the format
760 .Dq "yyyy-mm-dd hh:mm:ssX" ,
761 using the specified nautical timezone.
762 Z is the same as UTC/Zulu time. Timezones A - M (except J) decrease by one hour to the east of the
764 Timezones N - Y increase by one hour to the west of Z.
765 M and Y have the same clock time, but differ by one day.
766 J is used to indicate the local timezone.
767 When printing using $((Time)(J)), the output format is
768 .Dq "yyyy-mm-dd hh:mm:ss" ,
769 without a trailing timezone letter.
771 Specifies the local timezone.
772 The timezone offset from UTC follows the date and time.
773 The time is formatted as
774 .Dq "yyyy-mm-dd hh:mm:ss[+|-]HH[:MM]" .
775 Minutes in the timezone offset are only printed if they are non-zero.
776 .It $((Time)(ISO8601))
777 Specifies the local timezone, formatted as specified by ISO 8601.
778 The timezone offset from UTC follows the date and time.
779 The time is formatted as
780 .Dq "yyyy-mm-ddThh:mm:ss[+|-]HH[:MM]" .
781 Minutes in the timezone offset are only printed if they are non-zero.
782 Note that this differs from
784 format only in that a
786 character separates the date and time.
787 .It $((Time)([+|-]HH[:MM]))
788 Specifies an offset (+ or -) of the indicated number of hours (HH) and optionally minutes (MM) to UTC.
789 The value is formatted as a string of the form
790 .Dq "yyyy-mm-dd hh:mm:ss[+|-]HH[:MM]" .
791 Minutes in the timezone offset are only printed if they are non-zero.
794 Unless a custom message format uses one of the specialized forms for
796 described above, then any timestamps in an output message will be formatted according the the
799 The known formats are identified by constants in the asl.h header file.
801 .Bl -tag -width "ASL_TIME_FMT_SEC"
803 Formats timestamps as the number of seconds since the Epoch.
806 Formats a Time value as a string of the form
807 .Dq "yyyy-mm-dd hh:mm:ssZ" ,
808 using Coordinated Universal Time, or the
812 Formats a Time value as a string of the form
813 .Dq "Mmm dd hh:mm:ss" ,
814 where Mmm is the abbreviation for the month, dd is the date (1 - 31) and hh:mm:ss is the time.
815 The local timezone is used.
818 A value of NULL for the
820 argument will cause the default format ASL_TIME_FMT_LCL to be used.
824 parameter specifies how certain characters are to be treated when preparing a message for output.
825 The known encodings are:
826 .Bl -tag -width "ASL_ENCODE_NONE"
828 No special character encode is done.
831 Newlines and tabs are also encoded as "\\n" and "\\t" respectively.
834 format, space characters embedded in log message keys are encoded as "\\s"
835 and embedded brackets are escaped to print as "\\[" and "\\]".
838 Encodes backspace characters as ^H.
839 Carriage returns are mapped to newlines.
840 A tab character is appended after newlines so that message text is indented.
843 This encoding should be used when formatting messages using ASL_MSG_FMT_XML.
844 XML format output requires that keys are valid UTF8 strings.
845 Keys which are not valid UTF8 are ignored, and the associated value is not printed.
847 Values that contain legal UTF8 are printed as strings.
848 Ampersand, less than, greater than, quotation mark, and apostrophe characters are encoded according to XML conventions.
849 Embedded control characters are encoded as
851 where NN is the character's hexadecimal value.
853 Values that do not contain legal UTF8 are encoded in base-64 and printed as data objects.
856 .Fn asl_add_output_file
857 Returns 0 on success, non-zero on failure.
866 .Dl asl_add_output_file(asl, descriptor, ASL_MSG_FMT_STD, ASL_TIME_FMT_LCL, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG), ASL_ENCODE_SAFE);
868 Returns 0 on success, non-zero on failure.
870 .Fo asl_set_output_file_filter
875 replaces the current filter value associated with a file descriptor that has been added to a client handle.
876 Returns the previous filter value.
878 .Fo asl_remove_log_file
882 removes a file descriptor from the set of file descriptors associated with a client handle.
883 Returns 0 on success, non-zero on failure.
893 object using the message format string, time format string, and text encoding specified.
894 Message formatting is described above for the
895 .Fn asl_add_output_file
897 The caller must free the returned character string.
902 allocates and returns an asl_object_t structure, or NULL in the case of a failure in the library.
905 argument should be ASL_TYPE_MSG, ASL_TYPE_QUERY, or ASL_TYPE_LIST.
910 Returns the type of the object
912 or ASL_TYPE_UNDEF if the object is not a recognized type.
917 Increments an internal reference count for
919 ASL objects are created with a reference count of 1.
920 Objects returned by ASL routines should be retained if they are used outside
921 of the immediate scope of the call that returned them.
926 Decrements the internal reference count for
928 It frees the object and its associated resources when the reference count becomes zero.
934 This interface is deprecated in favor of
936 It is implemented as a call to
944 creates a new key and value in an asl_object_t structure, or replaces the value of an existing key.
945 Returns 0 on success, non-zero on failure.
953 is used to construct searches.
956 except that it takes an additional
958 (operation) argument.
959 Creates a new (key, op, value) triple in an asl_object_t structure,
960 or replaces the value and operation for an existing key.
963 section for more information.
964 Returns 0 on success, non-zero on failure.
970 removes a key and its associated value from an asl_object_t structure.
971 Returns 0 on success, non-zero on failure.
977 returns the nth key in an asl_object_t (beginning at zero),
978 allowing an application to iterate through the keys.
981 indexes beyond the number of keys in
988 returns the value associated with
997 .Fo asl_fetch_key_val_op
1009 output parameters, the key, value, and operation (for ASL_TYPE_QUERY) at index
1015 should be of type ASL_TYPE_MSG or ASL_TYPE_QUERY.
1016 Returns 0 on success, or non-zero otherwise.
1017 Any of the output parameters may be NULL, in which case that parameter value will not
1023 returns a count of the number of elements contained in
1025 For objects of type ASL_TYPE_MSG or ASL_TYPE_QUERY,
1026 this is the number of dictionary keys.
1027 For ASL_TYPE_LIST, it is the number of items in the list.
1028 For ASL_TYPE_FILE, returns the number of messages contained in the file.
1029 Returns zero for ASL_TYPE_STORE and ASL_TYPE_CLIENT.
1037 object, which is typically of type ASL_TYPE_MSG or ASL_TYPE_QUERY, to the target
1041 is typically a type that contains a collection of messages,
1042 i.e. ASL_TYPE_LIST, ASL_TYPE_FILE, ASL_TYPE_STORE, or ASL_TYPE_CLIENT
1043 (where the collection is the system ASL database).
1047 object to the end of the target
1052 is of type ASL_TYPE_LIST and
1054 is of type ASL_TYPE_LIST, ASL_TYPE_FILE, ASL_TYPE_STORE, or ASL_TYPE_CLIENT,
1055 the each message in the
1057 list is appended in sequence to the the target
1064 are of type ASL_TYPE_MSG or ASL_TYPE_QUERY, then the message dictionary from
1071 For keys that are in
1075 the key and its value and operation are added to
1086 object is prepended to the target
1088 In the case where both parameters are of type ASL_TYPE_MSG or ASL_TYPE_QUERY,
1093 Existing keys are not preserved.
1098 returns the next item in the target
1100 which may be of type ASL_TYPE_LIST, ASL_TYPE_FILE, ASL_TYPE_STORE, or of type ASL_TYPE_CLIENT
1101 in which case the routine fetches messages consecutively from the system ASL database.
1102 Returned objects are of type ASL_TYPE_MSG, or of type ASL_TYPE_QUERY if the target object is a
1103 list containing query objects.
1104 Returns NULL when there are no more objects to return from the target.
1111 except that it returns objects in reverse order.
1112 Objects that contain messages have an internal index for the
1118 simply return the current item and move the index forward or backward.
1119 The index position can be set using
1120 .Fn asl_reset_iteration .
1122 .Fo asl_reset_iteration
1126 sets the current position index used be
1132 may be zero to set the position index for
1134 at the beginning of its contents,
1135 or it may be SIZE_MAX to set the position index for
1137 at the end of its contents.
1138 For objects of type ASL_TYPE_LIST, the position index is an actual index into the list.
1139 For other message containing objects, the index is an ID number which may not be sequential.
1145 returns the object at position
1149 object, which must be of type ASL_TYPE_LIST.
1150 Returns NULL if the index is out of range or if
1154 .Fo asl_remove_index
1158 removes the object at position
1162 object, which must be of type ASL_TYPE_LIST.
1164 .Fo asl_log_descriptor
1171 provides functionality to use file descriptors to send logging data to ASL.
1173 is retained by ASL and must still be closed by the caller by calling
1175 if the caller loses reference to it.
1177 is copied by ASL and similarly must still be releaser by the caller by calling
1179 if the caller loses reference to it. Any changes made to it after calling
1180 .Fn asl_log_descriptor()
1181 are not applicable to the message used.
1182 .Ar descriptor is treated differently based on the value of
1187 is ASL_LOG_DESCRIPTOR_READ, the descriptor must be open for read access. ASL
1190 to read from the descriptor as data becomes available. These data are line
1191 buffered and passed to
1193 When EOF is read, ASL will
1199 is ASL_LOG_DESCRIPTOR_WRITE, the descriptor is closed and a new writable
1200 descriptor is created with the same fileno. Any data written to this new
1201 descriptor are line buffered and passed to
1203 When EOF is sent, no further data are read. The caller is responsible for
1204 closing the new descriptor. One common use for this API is to redirect writes
1205 to stdout or stderr to ASL by passing STDOUT_FILENO or STDERR_FILENO as
1212 searches messages in the
1214 object for messages that match the keys and values in
1216 subject to matching operations associated with those keys and values.
1217 The return returns an object of type ASL_TYPE_LIST containing matching messages,
1218 or NULL if no matches are found.
1221 argument should be constructed using
1225 section for details on constructing queries.
1229 parameter may be any ASL object.
1230 For type ASL_TYPE_CLIENT, the main ASL system database is searched.
1231 If the object type is ASL_TYPE_STORE or ASL_TYPE_FILE,
1232 then the corresponding data store or data file is searched.
1233 For ASL_TYPE_LIST, matches are found in a message list.
1236 is of type ASL_TYPE_MSG and query is of type ASL_TYPE_QUERY,
1238 is matched against the query,
1239 and a list containing
1241 is returned if the match succeeds.
1246 are objects of type ASL_TYPE_MSG or both are of type ASL_TYPE_QUERY,
1247 they are tested for exact match.
1250 is returned if the match is exact.
1253 is of type ASL_TYPE_QUERY and
1255 is of type ASL_TYPE_MSG, the routine returns NULL.
1268 but allows more advanced searching of ASL objects.
1271 parameter may be of any type, as with
1275 parameter must be an object of type ASL_TYPE_LIST,
1276 containing zero or more objects of type ASL_TYPE_QUERY.
1279 or a list containing zero objects matches all messages in the target
1282 The caller may provide a starting ASL message ID, a direction, and a count.
1285 ID value of 0 means that matching should commence at the beginning of the target
1287 A value of SIZE_MAX indicates that matching should commence at the end (most recent message)
1291 value is supplied, the routine will return when it has found that many messages,
1292 or it has checked all messages.
1295 is supplied, the routine will return after the specified time (in microseconds).
1300 are non-zero, the routine will return when the desired number of items has been matched
1301 or when the specified duration has been exceeded, whichever occurs first.
1302 The search direction may be ASL_MATCH_DIRECTION_FORWARD or ASL_MATCH_DIRECTION_REVERSE.
1303 The routine sets the value of the out parameter
1305 to be an index of the last message checked while matching.
1306 To fetch matching messages in batches (using a small count or duration value), the
1308 value for each iteration should be set to
1310 + 1 if searching forward, or
1312 - 1 for reverse search.
1315 .Fo aslresponse_next
1318 This interface is deprecated in favor of
1320 It is implemented as a call to
1324 .Fo aslresponse_free
1327 This interface is deprecated in favor of
1329 It is implemented as a call to
1332 .Fo asl_create_auxiliary_file
1338 Creates an auxiliary file that may be used by the client to save arbitrary data.
1339 When the file is closed using
1340 .Fo asl_close_auxiliary_file
1343 will log the specified
1347 and the Uniform Type Identifier provided by
1349 If a NULL value is supplied for
1356 application will display the message with a link to the file.
1358 Auxiliary files are saved in the ASL data store.
1359 They are automatically deleted at the same time that the log message expires.
1360 Messages expire in 7 days by default.
1361 A value set for the ASLExpireTime key will override the default.
1362 Read access for the auxiliary file will be the same as read access for
1364 By default, messages (and auxiliary files) are world-readable.
1365 Access may be limited by setting values for the ReadUID and ReadGID keys.
1367 .Fo asl_close_auxiliary_file
1370 closes the file descriptor
1372 previously returned by a call to
1373 .Fn asl_create_auxiliary_file .
1375 .Fo asl_log_auxiliary_location
1381 will log the specified
1385 the Uniform Type Identifier provided by
1387 and the Uniform Resource Locator provided by
1391 application will display the message with a link to the file.
1392 This allows a client to save data in an auxiliary file, but unlike
1393 .Fn asl_create_auxiliary_file ,
1394 the life-cycle of this file must be managed by some external system.
1395 The file will not be removed when the corresponding log message expired from the ASL data store.
1397 .Fo asl_open_from_file
1402 creates a client handle for an open file descriptor
1404 This routine may be used in conjunction with
1405 .Fn asl_create_auxiliary_file
1407 .Fn asl_log_auxiliary_location
1408 to save ASL format log messages in an auxiliary file.
1410 .Dq com.apple.asl-file
1411 should be used for ASL format auxiliary files.
1413 Files with this format may be read from the command line using
1414 .Nm syslog Fl f Ar file ,
1419 The file must be open for read and write access.
1420 The file will be truncated and its existing contents will be lost.
1423 must be called to close the client handle when logging to this file is complete.
1424 The file should be closed using
1425 .Fo asl_close_auxiliary_file
1427 if it was returned by
1428 .Fo asl_create_auxiliary_file
1435 The client handle returned by
1436 .Fn asl_open_from_file
1437 contains an internal lock, and may be used safely by multiple threads or from independent dispatch queues.
1438 Note that callers will contend for the internal lock when saving log messages to a file.
1440 Note that messages with ReadUID or ReadGID values will simply be saved to the file,
1441 and will not effect read access to either the message or the file itself.
1442 Similarly, messages with ASLExpireTime values will be saved, but will not effect the
1443 life-cycle of either the individual messages or the file.
1445 .Fo asl_encode_buffer
1449 is a utility routine for encoding arbitrary data buffers.
1450 ASL message dictionary keys and values are nul-terminated C strings.
1451 If an application wishes to include arbitrary data which may contain zero bytes,
1452 the data buffer must first be encoded in a manner that eliminates any embedded zeros.
1454 .Fn asl_encode_buffer
1455 routine will encode an arbitrary data buffer at the address
1459 bytes (octets) of data.
1460 The output of the routine is a nul-terminated C string.
1461 The encoded string may be decoded using the companion
1462 .Fn asl_decode_buffer
1465 This utility is used by the ASL server
1467 to encode the value associated with ASL_KEY_AUX_DATA in an ASL_TYPE_MSG object.
1468 An ASL_KEY_AUX_DATA key/value pair is used to hold the data written to a file descriptor
1470 .Fn asl_create_auxiliary_file
1471 on iOS systems, where the ASL database is stored in memory.
1473 .Fo asl_decode_buffer
1478 decodes a C string previously created by
1479 .Fn asl_encode_buffer
1480 back into a buffer, possibly containing embedded zero bytes (octets).
1481 The routine allocates memory for the buffer and returns a pointer in an output
1484 The caller is responsible for freeing the buffer.
1486 This routine should be used to decode the value associated with an
1487 ASL_KEY_AUX_DATA key in an ASL_TYPE_MSG object.
1490 At the core of this API is the asl_object_t structure.
1491 Although the structure is opaque and may not be directly manipulated,
1492 it contains a list of key/value pairs.
1493 All keys and values are NUL-character terminated C language strings.
1494 UTF-8 encoding may be used for non-ASCII characters.
1496 Message structures are generally used to send log messages,
1497 and are created thusly:
1499 asl_object_t m = asl_new(ASL_TYPE_MSG);
1501 Another message type, ASL_TYPE_QUERY,
1502 is used to create queries when searching the data store.
1503 Query type messages and searching are described in detail in the
1506 For the remainder of this section,
1507 the messages described will be of the ASL_TYPE_MSG variety.
1509 Each asl_object_t contains a default set of keys
1510 and values that are associated with them.
1511 These keys are listed in the asl.h header file.
1514 #define ASL_KEY_TIME "Time"
1515 #define ASL_KEY_HOST "Host"
1516 #define ASL_KEY_SENDER "Sender"
1517 #define ASL_KEY_FACILITY "Facility"
1518 #define ASL_KEY_PID "PID"
1519 #define ASL_KEY_UID "UID"
1520 #define ASL_KEY_GID "GID"
1521 #define ASL_KEY_LEVEL "Level"
1522 #define ASL_KEY_MSG "Message"
1524 Many of these correspond to equivalent parts of messages described in the
1527 Values associated with these message keys are assigned appropriate defaults.
1528 The value for ASL_KEY_HOST is the local host name,
1529 the value associated with ASL_KEY_SENDER is the process name,
1530 the ASL_KEY_PID is the client's process ID number, and so on.
1532 Note the addition of the UID and GID keys.
1533 The values for UID and GID are set in library code by the message sender.
1534 The server will attempt to confirm the values,
1535 but no claim is made that these values cannot be maliciously overridden
1536 in an attempt to deceive a log message reader
1537 as to the identity of the sender of a message.
1538 The contents of log messages must be regarded as insecure.
1542 API does not require a process to choose a facility name.
1545 server will use a default value of
1547 if a facility is not set.
1548 However, a client may set a facility name as an argument in the
1550 call, or by setting a specific value for the ASL_KEY_FACILITY in a message:
1552 asl_set(m, ASL_KEY_FACILITY, "com.somename.greatservice");
1554 An application may choose any facility name at will.
1555 Different facility names may be attached to different messages, perhaps to distinguish different subsystems in log messages.
1556 Developers are encouraged to adopt a
1558 naming convention to avoid conflicting facility names.
1560 Default values are set in the message for each of the keys listed above,
1561 except for ASL_KEY_MSG,
1562 which may be explicitly set at any time using the
1564 routine, or implicitly set at the time the message is sent using the
1565 .Fn asl_log_message ,
1570 These three routines also have an integer-level parameter
1571 for specifying the log priority.
1572 The ASL_KEY_LEVEL value is set accordingly.
1573 Finally, the value associated with ASL_KEY_TIME
1574 is set in the sending routine.
1576 When logging from multiple threads,
1579 open a separate client handle using
1581 The client handle may then be closed when it is no longer required using
1583 Multiple threads may log messages safely using a NULL asl_object_t argument,
1584 but the library will use an internal lock, so that in fact only one thread
1587 When an application requires additional keys and values
1588 to be associated with each log message,
1589 a single message structure may be allocated and set up as
1593 asl_object_t m = asl_new(ASL_TYPE_MSG);
1594 asl_set(m, ASL_KEY_FACILITY, "com.secrets.r.us");
1595 asl_set(m, "Clearance", "Top Secret");
1597 asl_log(NULL, m, ASL_LEVEL_NOTICE, "Message One");
1599 asl_log(NULL, m, ASL_LEVEL_ERR, "Message Two");
1601 The message structure will carry the values set for the
1605 keys so that they are used in each call to
1607 while the log level and the message text
1608 are taken from the calling parameters.
1620 which is replaced by the current error message
1621 (as denoted by the global variable
1626 Key/value pairs may be removed from a message structure with
1628 A message may be freed using
1637 to transmit a message to the server.
1638 This routine sets the value associated with ASL_KEY_TIME
1639 and sends the message.
1640 It may be called directly if all of a message's key/value pairs
1641 have been created using
1644 Messages that are sent to the
1646 server may be saved in a message store.
1647 The store may be searched using
1650 By default, all messages are readable by any user.
1651 However, some applications may wish to restrict read access
1653 To accommodate this,
1654 a client may set a value for the "ReadUID" and "ReadGID" keys.
1655 These keys may be associated with a value
1656 containing an ASCII representation of a numeric UID or GID.
1657 Only the root user (UID 0),
1658 the user with the given UID,
1659 or a member of the group with the given GID
1660 may fetch access-controlled messages from the database.
1662 Although the ASL system does not require a "Facility" key in a message,
1663 many processes specify a "Facility" value similar
1664 to the common usage of the BSD
1666 API, although developers are encouraged to adopt facility names that make sense for their application.
1669 naming convention (e.g. "com.apple.system.syslog") should be adopted to avoid conflicting names.
1670 The ASL system generally allows any string to be used as a facility value,
1672 The value "com.apple.system",
1673 or any string that has "com.apple.system" as a prefix,
1674 may only be used by processes running with the UID 0.
1675 This allows system processes to log messages that can not be "spoofed" by user processes.
1676 Non-UID 0 client processes that specify "com.apple.system" as a facility, will be assigned the value "user"
1681 A client handle contains various parameters and control settings that are used when a message is logged.
1682 This includes an identification string, a facility name, filtering controls, additional file descriptors, and other data.
1683 Client handles are not thread-safe.
1684 Applications that log from multiple threads should create a client handle for each thread.
1686 Applications that use libdispatch must also avoid using a single client handle from multiple dispatch queues if those queues may run concurrently.
1687 A good approach is to create one or more serial dispatch queues specifically for logging.
1688 Each such queue should use its own ASL client handle.
1690 If a single handle must be accessed by multiple dispatch queues,
1691 then the application must use locks, semaphores, or some other mechanism to prevent concurrent access to a client handle.
1693 A NULL value may be used in any of the routines
1694 that require an asl_object_t argument.
1695 In this case, the library will use an internal client handle.
1696 This internal handle contains its own lock, allowing multiple threads to safely use the NULL client handle.
1697 Note, however, that contention for the lock may cause undesirable synchronization behavior or reduced performance.
1701 routine may be given an ident argument,
1702 which becomes the default value for the ASL_KEY_SENDER key,
1703 and a facility argument,
1704 which becomes the value associated with the ASL_KEY_FACILITY key.
1705 If NULL is passed as the value for
1707 the name of the currently running program will be used.
1708 If NULL is passed as the value for
1712 will be used for non UID 0 processes, and
1715 will be used for UID 0 processes.
1717 Several options are available when creating a client handle.
1720 .Bl -tag -width "ASL_OPT_NO_REMOTE" -compact
1722 adds stderr as an output file descriptor
1723 .It ASL_OPT_NO_DELAY
1724 connects to the server immediately
1725 .It ASL_OPT_NO_REMOTE
1726 disables remote-control filter adjustment
1729 See the FILTERING section below, and the
1731 for additional details on filter controls.
1733 A client handle is closed and its resources released using
1735 Note that if additional file descriptors were added to the handle,
1736 either using the ASL_OPT_STDERR option
1737 or afterwards with the
1738 .Fn asl_add_log_file
1739 routine, those file descriptors are not closed by
1741 .Ss LOGGING TO ADDITIONAL FILES
1742 If a client handle is opened with the ASL_OPT_STDERR option to
1744 a copy of each log message will be sent to stderr.
1745 Additional output streams may be include using
1746 .Fn asl_add_log_file .
1748 Messages sent to stderr or other files are printed in the "standard" message format
1749 also used as a default format by the
1751 command line utility.
1752 Non-ASCII characters in a message are encoded using the
1754 encoding style used by
1759 Backspace characters are printed as ^H.
1760 Carriage returns are mapped to newlines.
1761 A tab character is appended after newlines so that message text is indented.
1763 File descriptors may be removed from the list of outputs associated
1764 with a client handle with
1765 .Fn asl_remove_log_file .
1766 This routine simply removes the file descriptor from the output list.
1767 The file is not closed as a result.
1769 The ASL_OPT_STDERR option may not be unset
1770 after a client handle has been opened.
1774 server archives received messages in a data store
1775 that may be searched using the
1781 A query message is created using:
1783 asl_object_t q = asl_new(ASL_TYPE_QUERY);
1785 Search settings are made in the query using
1787 A search is performed on the data store with
1789 It returns an object of type ASL_TYPE_LIST.
1790 The caller may use routines that operate on lists, such as
1795 to access the matching messages.
1797 Like other messages, ASL_TYPE_QUERY messages contain keys and values.
1798 They also associate an operation with each key and value.
1799 The operation is used to decide if a message matches the query.
1800 The simplest operation is ASL_QUERY_OP_EQUAL, which tests for equality.
1801 For example, the following code snippet searches for messages
1802 with a Sender value equal to
1806 q = asl_new(ASL_TYPE_QUERY);
1807 asl_set_query(q, ASL_KEY_SENDER, "MyApp", ASL_QUERY_OP_EQUAL);
1808 r = asl_search(NULL, q);
1810 More complex searches may be performed using other query operations.
1812 .Bl -tag -width "ASL_QUERY_OP_GREATER_EQUAL" -compact
1813 .It ASL_QUERY_OP_EQUAL
1815 .It ASL_QUERY_OP_GREATER
1817 .It ASL_QUERY_OP_GREATER_EQUAL
1818 value greater than or equal to
1819 .It ASL_QUERY_OP_LESS
1821 .It ASL_QUERY_OP_LESS_EQUAL
1822 value less than or equal to
1823 .It ASL_QUERY_OP_NOT_EQUAL
1825 .It ASL_QUERY_OP_REGEX
1826 regular expression search
1827 .It ASL_QUERY_OP_TRUE
1828 always true - use to test for the existence of a key
1831 Regular expression search uses
1834 Patterns are compiled using the REG_EXTENDED and REG_NOSUB options.
1836 Modifiers that change the behavior of these operations
1837 may also be specified by ORing the modifier value with the operation.
1840 .Bl -tag -width "ASL_QUERY_OP_SUBSTRING" -compact
1841 .It ASL_QUERY_OP_CASEFOLD
1842 string comparisons are case-folded
1843 .It ASL_QUERY_OP_PREFIX
1844 match a leading substring
1845 .It ASL_QUERY_OP_SUFFIX
1846 match a trailing substring
1847 .It ASL_QUERY_OP_SUBSTRING
1849 .It ASL_QUERY_OP_NUMERIC
1850 values are converted to integer using
1854 The only modifier that is checked
1855 for ASL_QUERY_OP_REGEX search is ASL_QUERY_OP_CASEFOLD.
1856 This causes the regular expression to be compiled
1857 with the REG_ICASE option.
1859 If a query message contains more than one set of key/value/operation triples,
1860 the result will be a logical AND. For example, to find messages from
1862 with a priority level less than or equal to
1866 q = asl_new(ASL_TYPE_QUERY);
1867 asl_set_query(q, ASL_KEY_SENDER, "MyApp", ASL_QUERY_OP_EQUAL);
1868 asl_set_query(q, ASL_KEY_LEVEL, "3",
1869 ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC);
1870 r = asl_search(NULL, q);
1874 to get a list of matching messages, one can use
1876 to iterate through the list, and
1877 .Fn asl_fetch_key_val_op
1878 To iterate through the message dictionary.
1883 r = asl_search(NULL, q);
1884 while (NULL != (m = asl_next(r)))
1888 for (i = 0; i < n; i++)
1890 const char *key, *val;
1891 asl_fetch_key_val_op(m, i, key, val, NULL);
1897 .Ss FILTERING AND REMOTE CONTROL
1898 Clients may set a filter mask value with
1899 .Fn asl_set_filter .
1900 The mask specifies which messages should be sent to the
1902 daemon by specifying a yes/no setting for each priority level.
1903 Clients typically set a filter mask
1904 to avoid sending relatively unimportant messages.
1905 For example, Debug or Info priority level messages
1906 are generally only useful for debugging operations.
1907 By setting a filter mask, a process can improve performance
1908 by avoiding sending messages that are in most cases unnecessary.
1910 .Fn asl_set_filter returns the previous value of the filter, i.e. the value of the filter before the routine was called.
1912 As a convenience, the macros ASL_FILTER_MASK(level) and ASL_FILTER_MASK_UPTO(level)
1913 may be used to construct a bit mask corresponding to a given priority level,
1914 or corresponding to a bit mask for all priority levels
1915 from ASL_LEVEL_EMERG to a given input level.
1917 The default filter mask is ASL_FILTER_MASK_UPTO(ASL_LEVEL_NOTICE).
1918 This means that by default,
1919 and in the absence of remote-control changes (described below),
1920 ASL_LEVEL_DEBUG and ASL_LEVEL_INFO priority level messages
1925 Three different filters exist for each application.
1926 The first is the filter mask set using
1929 The Apple System Log facility also manages a
1932 The master filter mask usually has a value
1933 that indicates to the library that it is
1935 and thus it has no effect.
1936 However, the mask filter mask may be enabled
1937 by giving it a value using the
1942 When the master filter mask has been set,
1943 it takes precedence over the client's filter mask.
1944 The client's mask is unmodified,
1945 and will become active again if remote-control filtering is disabled.
1947 In addition to the master filter mask,
1948 The Apple System Log facility
1949 also manages a per-client remote-control filter mask.
1950 Like the master filter mask, the per-client mask is usually
1952 having no effect on a client.
1953 If a per-client filter mask is set using the
1957 option, then it takes precedence
1958 over both the client's filter mask and the master filter mask.
1959 As is the case with the master filter mask,
1960 a per-client mask ceases having any effect when if is disabled.
1962 The ASL_OPT_NO_REMOTE option to
1964 causes both the master and per-client remote-control masks
1965 to be ignored in the library.
1966 In that case, only the client's own filter mask
1967 is used to determine which messages are sent to the server.
1968 This may be useful for Applications that produce log messages
1969 that should never be filtered, due to security considerations.
1970 Note that root (administrator) access is required
1971 to set or change the master filter mask,
1972 and that only root may change a per-client remote-control filter mask
1973 for a root (UID 0) process.
1975 The per-process remote control filter value is kept as a state value
1976 associated with a key managed by
1978 The key is protected by an access control mechanism that only permits the
1979 filter value to be accessed and modified by the same effective UID as the
1980 ASL client at the time that the first ASL connection was created.
1981 Remote filter control using
1983 will fail for processes that change effective UID after starting an ASL connection.
1984 Those processes should close all ASL client handles and then re-open ASL connections
1985 if remote filter control support is desired.
1987 These functions first appeared in