xref: /trueos/lib/libasl/asl.3 (revision e0d5dc4e99cb0cffad102c7a22a16d828ef86ae5)
1.\" Copyright (c) 2005-2013 Apple Inc.
2.\" All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
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.
15.\"
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
26.\" SUCH DAMAGE.
27.\"
28.\"
29.Dd October 1, 2011
30.Dt asl 3
31.Os "Mac OS X"
32.Sh NAME
33.Nm asl_add_log_file ,
34.Nm asl_add_outout_file ,
35.Nm asl_append ,
36.Nm asl_close ,
37.Nm asl_close_auxiliary_file ,
38.Nm asl_count ,
39.Nm asl_create_auxiliary_file ,
40.Nm asl_decode_buffer ,
41.Nm asl_encode_buffer ,
42.Nm asl_fetch_key_val_op ,
43.Nm asl_format ,
44.Nm asl_free ,
45.Nm asl_get ,
46.Nm asl_get_index ,
47.Nm asl_get_type ,
48.Nm asl_key ,
49.Nm asl_log ,
50.Nm asl_log_auxiliary_location ,
51.Nm asl_log_descriptor ,
52.Nm asl_match ,
53.Nm asl_new ,
54.Nm asl_next ,
55.Nm asl_open ,
56.Nm asl_open_from_file ,
57.Nm asl_open_path ,
58.Nm asl_prepend ,
59.Nm asl_prev ,
60.Nm asl_release ,
61.Nm asl_remove_index ,
62.Nm asl_remove_log_file ,
63.Nm asl_reset_iteration ,
64.Nm asl_retain ,
65.Nm asl_search ,
66.Nm asl_send ,
67.Nm asl_set ,
68.Nm asl_set_filter ,
69.Nm asl_set_output_file_filter ,
70.Nm asl_set_query ,
71.Nm asl_unset ,
72.Nm asl_vlog ,
73.Nm aslresponse_free ,
74.Nm aslresponse_next
75.Nd system log message sending and searching functions
76.Sh SYNOPSIS
77.Fd #include <asl.h>
78.\"
79.Ft int
80.Fo asl_add_log_file
81.Fa "asl_object_t client"
82.Fa "int descriptor"
83.Fc
84.Ft int
85.Fo asl_add_output_file
86.Fa "asl_object_t client"
87.Fa "int descriptor"
88.Fa "const char *msg_fmt"
89.Fa "const char *time_fmt"
90.Fa "int filter"
91.Fa "int text_encoding"
92.Fc
93.Ft void
94.Fo asl_append
95.Fa "asl_object_t obj"
96.Fa "asl_object_t msg"
97.Fc
98.Pp
99.Ft void
100.Fo asl_close
101.Fa "asl_object_t obj"
102.Fc
103.Ft int
104.Fo asl_close_auxiliary_file
105.Fa "int descriptor"
106.Fc
107.Ft size_t
108.Fo asl_count
109.Fa "asl_object_t obj"
110.Fc
111.Ft int
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"
117.Fc
118.Ft int
119.Fo asl_decode_buffer
120.Fa "const char *in"
121.Fa "char **buf"
122.Fa "size_t *len"
123.Fc
124.Ft char *
125.Fo asl_encode_buffer
126.Fa "const char *in"
127.Fa "size_t len"
128.Fc
129.Ft int
130.Fo asl_fetch_key_val_op
131.Fa "asl_object_t msg"
132.Fa "uint32_t n"
133.Fa "const char **key"
134.Fa "const char **val"
135.Fa "uint32_t *op"
136.Fc
137.Ft char *
138.Fo asl_format
139.Fa "asl_object_t msg"
140.Fa "const char *msg_fmt"
141.Fa "const char *time_fmt"
142.Fa "uint32_t text_encoding"
143.Fc
144.Ft [DEPRECATED] void
145.Fo asl_free
146.Fa "asl_object_t obj"
147.Fc
148.Ft const char *
149.Fo asl_get
150.Fa "asl_object_t msg"
151.Fa "const char *key"
152.Fc
153.Ft asl_object_t
154.Fo asl_get_index
155.Fa "asl_object_t list"
156.Fa "size_t index"
157.Fc
158.Ft uint32_t
159.Fo asl_get_type
160.Fa "asl_object_t obj"
161.Fc
162.Ft const char *
163.Fo asl_key
164.Fa "asl_object_t msg"
165.Fa "uint32_t n"
166.Fc
167.Ft int
168.Fo asl_log
169.Fa "asl_object_t obj"
170.Fa "asl_object_t msg"
171.Fa "int level"
172.Fa "const char *format"
173.Fa "..."
174.Fc
175.Ft int
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"
181.Fc
182.Ft int
183.Fo asl_log_descriptor
184.Fa "asl_object_t client"
185.Fa "asl_object_t msg"
186.Fa "int level"
187.Fa "int descriptor"
188.Fa "uint32_t fd_type"
189.Fc
190.Ft int
191.Fo asl_log_message
192.Fa "int level"
193.Fa "const char *format"
194.Fa "..."
195.Fc
196.Ft asl_object_t
197.Fo asl_match
198.Fa "asl_object_t obj"
199.Fa "asl_object_t querylist"
200.Fa "size_t *last"
201.Fa "size_t start"
202.Fa "size_t count"
203.Fa "uint32_t duration"
204.Fa "int32_t direction"
205.Fc
206.Ft asl_object_t
207.Fo asl_new
208.Fa "uint32_t type"
209.Fc
210.Ft asl_object_t
211.Fo asl_next
212.Fa "asl_object_t obj"
213.Fc
214.Ft asl_object_t
215.Fo asl_open
216.Fa "const char *ident"
217.Fa "const char *facility"
218.Fa "uint32_t opts"
219.Fc
220.Ft asl_object_t
221.Fo asl_open_from_file
222.Fa "int descriptor"
223.Fa "const char *ident"
224.Fa "const char *facility"
225.Fc
226.Ft asl_object_t
227.Fo asl_open_path
228.Fa "const char *path"
229.Fa "uint32_t opts"
230.Fc
231.Ft void
232.Fo asl_prepend
233.Fa "asl_object_t obj"
234.Fa "asl_object_t msg"
235.Fc
236.Ft asl_object_t
237.Fo asl_prev
238.Fa "asl_object_t obj"
239.Fc
240.Ft void
241.Fo asl_release
242.Fa "asl_object_t obj"
243.Fc
244.Ft void
245.Fo asl_remove_index
246.Fa "asl_object_t list"
247.Fa "size_t index"
248.Fc
249.Ft int
250.Fo asl_remove_log_file
251.Fa "asl_object_t asl"
252.Fa "int descriptor"
253.Fc
254.Ft void
255.Fo asl_reset_iteration
256.Fa "asl_object_t obj"
257.Fa "size_t position"
258.Fc
259.Ft asl_object_t
260.Fo asl_retain
261.Fa "asl_object_t obj"
262.Fc
263.Ft asl_object_t
264.Fo asl_search
265.Fa "asl_object_t obj"
266.Fa "asl_object_t query"
267.Fc
268.Ft int
269.Fo asl_send
270.Fa "asl_object_t obj"
271.Fa "asl_object_t msg"
272.Fc
273.Ft int
274.Fo asl_set
275.Fa "asl_object_t msg"
276.Fa "const char *key"
277.Fa "const char *value"
278.Fc
279.Ft int
280.Fo asl_set_filter
281.Fa "asl_object_t asl"
282.Fa "int filter"
283.Fc
284.Ft int
285.Fo asl_set_output_file_filter
286.Fa "asl_object_t asl"
287.Fa "int descriptor"
288.Fa "int filter"
289.Fc
290.Ft int
291.Fo asl_set_query
292.Fa "asl_object_t msg"
293.Fa "const char *key"
294.Fa "const char *value"
295.Fa "uint32_t op"
296.Fc
297.Ft int
298.Fo asl_unset
299.Fa "asl_object_t msg"
300.Fa "const char *key"
301.Fc
302.Ft int
303.Fo asl_vlog
304.Fa "asl_object_t obj"
305.Fa "asl_object_t msg"
306.Fa "int level"
307.Fa "const char *format"
308.Fa "va_list ap"
309.Fc
310.Ft [DEPRECATED] void
311.Fo aslresponse_free
312.Fa "asl_object_t obj"
313.Fc
314.Ft [DEPRECATED] asl_object_t
315.Fo aslresponse_next
316.Fa "asl_object_t obj"
317.Fc
318.Sh DESCRIPTION
319These routines provide an interface to the Apple System Log facility and to various
320data bearing memory objects, files, and storage directories.
321.Pp
322The API allows client applications to create and manipulate
323flexible, structured messages, send them to the
324.Nm syslogd
325server, where they may undergo additional processing.
326Messages received by the server are saved in a data store
327(subject to input filtering constraints).
328.Pp
329Log messages may also be written directly to the filesystem from the ASL library.
330This output may go to plain text files, to ASL-format data files, or to ASL databases.
331.Pp
332This API permits clients to create queries
333and search the system ASL database, ASL-format files, or other ASL databases for matching messages.
334.Pp
335Clients that simply need to send messages to the ASL server may do so using
336.Fn asl_log_message .
337Other routines allow for more complex logging tasks.
338.Pp
339An introduction to the concepts underlying this interface follows the interface summary below.
340.Ss INTERFACE SUMMARY
341.Fo asl_log_message
342.Fa level
343.Fa format
344.Fa "..."
345.Fc
346sends a message to the ASL server
347.Nm syslogd .
348.Fa level
349is an integer between 7 (ASL_LEVEL_DEBUG) and 0 (ASL_LEVEL_EMERG),
350indicating the priority of the message.
351Note that message priority levels are used as the basis of filtering
352messages in several places in the ASL system.
353In general, messages with level ASL_LEVEL_DEBUG and ASL_LEVEL_INFO are often excluded from long-term storage,
354or have shorter time-to-live durations.
355.Pp
356.Fa format
357is a printf-like format string.
358In addition to the conversion specifications supported by
359.Nm printf ,
360.Fn asl_log_message
361supports the
362.Dq %m
363conversion, which is converted to the current error string returned by the
364.Nm strerror
365function for the current value of
366.Fa errno .
367.Pp
368.Fn asl_log_message
369is a simplified version of the
370.Fn asl_log
371interface.
372It uses the default (NULL) ASL client handle.
373This interface is thread-safe, although callers will contend for a mutex lock when using this routine.
374Applications that log from multiple threads or dispatch queues may experience undesired performance
375characteristics when using this routine.
376The use of
377.Fn asl_open
378and
379.Fn asl_log ,
380.Fn asl_vlog ,
381or
382.Fn asl_send
383is advised for applications that log from multiple threads.
384.Pp
385.Fo asl_log
386.Fa obj
387.Fa msg
388.Fa level
389.Fa format
390.Fa "..."
391.Fc
392prepares a message, normally to be sent to the ASL server
393.Nm syslogd .
394The first parameter,
395.Fa obj ,
396may be an asl_object_t of any type.
397It is typically of type ASL_TYPE_CLIENT.
398In this case the settings and options associated with the ASL client handle
399.Fa obj
400are used when preparing the message.
401The client may direct the ASL library to
402print copies of the message to various output files as well as sending it to the ASL server.
403Filter settings in the client may further direct the library in selecting where the message
404will be sent, and may in fact prevent the message from being sent to the ASL server at all.
405ASL client handles are created using
406.Fn asl_open
407and are described extensively below.
408.Pp
409ASL message are dictionaries.
410The
411.Fn asl_log
412routine combines information carried in the ASL client handle
413.Fa client
414and the ASL message dictionary
415.Fa msg ,
416together with the
417.Fa format
418string and the associated arguments to construct a final message to be sent
419to the ASL server and/or to be written to output files.
420In general, the ASL client handle will provide the values for the
421ASL_KEY_SENDER and ASL_KEY_FACILITY keys.
422If
423.Fa msg
424is non-NULL, it may override the values for ASL_KEY_SENDER and ASL_KEY_FACILITY,
425and it may supply additional key/value pairs.
426The
427.Fa format
428string and it's associated arguments are used to construct a string value for the
429ASL_KEY_MSG key in the final log message dictionary.
430.Pp
431If the
432.Fa obj
433parameter is of a type other than ASL_TYPE_CLIENT, then
434.Fn asl_log
435creates a message as if it were to be sent to
436.Nm syslogd ,
437but rather than sending the message, it stores the message in the
438.Fa obj
439provided.
440If
441.Fa obj
442is of type ASL_TYPE_FILE or ASL_TYPE_STORE that has been opened for writing,
443then the message is saved to the file or ASL data store.
444If
445.Fa obj
446is of type ASL_TYPE_LIST, then the message is appended to the list.
447If
448.Fa obj
449is of type ASL_TYPE_MSG, then the message key/value pairs constructed by
450.Fn asl_log
451are merged with
452.Fa obj .
453In a merge operation, existing keys and values in
454.Fa obj
455are preserved.
456New values in the
457.Fn asl_log
458message are attached.
459Although this routine works for type ASL_TYPE_QUERY,
460new key/value pairs are attached with an operation value of zero.
461.Pp
462The ASL_PREFILTER_LOG(obj, msg, level, format, ...) macro may be used in
463place of
464.Fn asl_log
465when
466.Fa obj
467is of type ASL_TYPE_CLIENT.
468The macro avoids processing the variable argument list in those cases where
469the message would be filtered out due to filter settings, would not be
470written to a log file associated with the asl_object_t, or would not be
471written to stderr.
472The macro may provide a performance benefit for some applications.
473Details on filter setting, additional log files, and asl_object_t options
474are described below in this manual.
475.Pp
476.Fo asl_vlog
477.Fa obj
478.Fa msg
479.Fa level
480.Fa format
481.Fa ap
482.Fc
483is similar to
484.Fn asl_log
485except that it takes a va_list argument.
486.Pp
487.Fo asl_send
488.Fa obj
489.Fa msg
490.Fc
491is similar to
492.Fn asl_log ,
493except the value for ASL_KEY_MESSAGE is taken from
494.Ar msg
495rather than being constructed using a
496.Fn printf
497style syntax.
498.Pp
499.Fo asl_open
500.Fa ident
501.Fa facility
502.Fa opts
503.Fc
504creates and returns a client handle, or NULL if an error occurs in the library.
505Messages sent using this handle will default to having the string
506.Ar ident
507as the value associated with the ASL_KEY_SENDER key, and the value
508.Ar facility
509associated with the ASL_KEY_FACILITY key.
510If
511.Ar ident
512is NULL, the library uses the sending process name.
513If
514.Ar facility
515is NULL, the library will use the
516.Dq user
517facility for processes with non-zero UID, and
518.Dq daemon
519for processes with zero UID.
520.Pp
521Several options are available, as described in the
522.Sx CLIENT HANDLES
523section.
524.Pp
525Each client handle holds state information that is used when a message is logged using that handle.
526This information includes the
527.Ar ident
528and
529.Ar facility
530strings and the options from the
531.Ar opts
532parameter.
533Client handles also contain various filter, file descriptor, and control data.
534.Pp
535The state information in a client handle is not protected by locking or thread synchronization mechanisms,
536except for one special case where NULL is used as a client handle.
537That special case is described below.
538.Pp
539It is not safe for two or more threads to use a single client handle simultaneously.
540Multi-threaded applications should generally create one client handle for each thread
541or serial dispatch queue that logs messages.
542A client handle may only be safely shared amongst multiple threads if the application uses locks or some
543synchronization strategy to ensure single-threaded access.
544.Pp
545As a special case, the ASL library allows the use of NULL in place of a client handle.
546In this case, the library uses an internal structure which contains its own lock.
547Multiple threads may safely use NULL in place of an ASL client handle,
548although there may be contention for the lock.
549.Pp
550Applications that use libdispatch may use NULL in place of a client handle,
551although this may cause undesirable synchronization behavior and degraded performance because of lock contention.
552A better design is often to use one or more serial dispatch queues specifically for logging.
553Each such serial queue should use a separate client handle.
554.Pp
555.Fo asl_open_path
556.Fa path
557.Fa opts
558.Fc
559opens an ASL data store or ASL data file for read or write access.
560Returns an object of type ASL_TYPE_STORE or ASL_TYPE_FILE,
561depending on the input parameters.
562By default, the ASL store or file is opened for reading.
563The routine checks the filesystem type of
564.Fa path ,
565and returns an object of type ASL_TYPE_STORE for an ASL data store (a directory in the filesystem)
566or an object of type ASL_TYPE_FILE for an ASL data file.
567If
568.Fa path
569is NULL, the system's ASL database (/var/log/asl) is opened.
570.Pp
571If the ASL_OPT_OPEN_WRITE option is specified, an existing file or database is
572opened for writing.
573New messages may be added to the file or database using
574.Fn asl_log ,
575.Fn asl_vlog ,
576.Fn asl_send ,
577or
578.Fn asl_append .
579Existing messages in the store or file may not be deleted or modified.
580.Pp
581If the path does not exist in the filesystem,
582.Fn asl_open_path
583will create a new data store if ASL_OPT_CREATE_STORE is set in the options,
584The file will be created with the user's effective UID and GID as owner and group.
585The mode will be 0644.
586If a different mode, UID, or GID is desired, an empty file or directory may be
587pre-created with the desired settings.
588.Pp
589.Fo asl_close
590.Fa asl
591.Fc
592closes the client handle
593.Ar asl
594and releases its associated resources.
595.Fn asl_release
596may also be used to close a client handle.
597.Pp
598.Fo asl_set_filter
599.Fa asl
600.Fa f
601.Fc
602sets a filter for messages being sent to the server.
603The filter is a bitmask representing priority levels.
604Only messages having a priority level with a corresponding bit set in the filter mask are sent to the
605.Nm syslogd
606server.
607The filter does not control writes to additional files associated with the client handle using
608.Fn asl_add_output_file .
609.Fn asl_set_filter
610returns the previous filter value.
611.Pp
612.Fo asl_add_output_file
613.Fa asl
614.Fa descriptor
615.Fa msg_fmt
616.Fa time_fmt
617.Fa filter
618.Fa text_encoding
619.Fc
620adds the file descriptor
621.Ar descriptor
622to the a set of file descriptors associated with the client handle
623.Ar asl .
624Each log message sent by that client handle is also written to these file descriptors
625(depending on the setting of the
626.Ar filter
627argument).
628The message format is specified by the
629.Ar msg_fmt
630argument.
631The format for timestamps is specified by the
632.Ar time_fmt
633argument, although custom format strings may specify more advanced formats for timestamps.
634Details on custom format strings are below.
635.Pp
636Each output file has an associated
637.Ar filter
638value.
639The filter determines which messages are formatted and written to the file based on the message priority level.
640.Pp
641Special handling for certain characters is specified by the
642.Ar text_encoding
643argument.
644The supported values and their effect are described below.
645.Pp
646The
647.Ar msg_format
648argument is a character string that tells the library how to format each message written to the output file.
649There are several pre-defined message formats, described below.
650Custom formats are also supported,
651giving complete control over which ASL message keys should be written
652and the overall format of each output line.
653The pre-defined formats are identified by constants in the asl.h header file.
654.Pp
655.Bl -tag -width "ASL_MSG_FMT_RAW" -compact
656.It ASL_MSG_FMT_RAW
657The contents of the ASL message dictionaries are formatted as a list,
658with each key-value pair formatted as
659.Dq [Key Value] .
660.Pp
661.It ASL_MSG_FMT_STD
662Messages are formatted using the standard ASL message format of the form
663.Pp
664.Dl Time Host Sender[PID] <Level>: Message
665.Pp
666Time formats are described below.
667.Pp
668.It ASL_MSG_FMT_BSD
669The legacy format used for plain-text log files.
670Similar to the ASL_MSG_FMT_STD format, but the message priority level is excluded.
671.Pp
672.It ASL_MSG_FMT_MSG
673The output line contains only the value of the Message key in each ASL message dictionary.
674.Pp
675.It ASL_MSG_FMT_XML
676Produces multiple lines of output for each ASL message.
677The message is formatted as an XML dictionary:
678.Pp
679.Dl <dict>
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>
684.Dl	\t\t...
685.Dl </dict>
686.Pp
687.El
688.Pp
689A NULL value for
690.Ar msg_fmt
691causes the library to use the ASL_MSG_FMT_STD format.
692.Pp
693Custom format strings may contain a mix of characters that are directly copied to the output line
694and variables, which are a dollar sign
695.Sq $
696followed by specific ASL message dictionary keys, whose values will be interpolated into the output.
697For example, the format string:
698.Pp
699.Dl This message from $Sender PID=$PID at $Time *** $Message
700.Pp
701would result in lines in the output file like, e.g.:
702.Pp
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
705.Pp
706Normally, a space character terminates a variable name.
707However, the name may be wrapped in parentheses if a space character is not desired in the output.
708For example:
709.Pp
710.Dl $(Sender)[$(PID)]: $Message
711.Pp
712A third form for specifying variables may be used for the ASL
713.Dq Level
714and
715.Dq Time
716message keys.
717Note that a
718.Dq Time
719specification using one of the forms below will override the
720.Ar time_fmt
721argument to the function.
722.Pp
723The following forms are recognized:
724.Pp
725.Bl -tag -width "$((Time)([+|-]HH[:MM]))"
726.It $((Level)(str))
727Formats a Level value as a string, for example
728.Dq Error ,
729.Dq Alert ,
730.Dq Warning ,
731and so on.
732Note that $(Level) or $Level formats the value as an integer 0 through 7.
733.It $((Level)(char))
734Formats a Level value as a single character from the set
735.Dq PACEWNID ,
736for levels 0 through 7.
737These are abbreviations for Panic, Alert, Critical, Error, Warning, Notice, Info, and Debug.
738.It $((Time)(sec))
739Formats a Time value as the number of seconds since the Epoch.
740.It $((Time)(raw))
741Alias for $((Time)(sec)).
742.It $((Time)(local))
743Formats a Time value as a string of the form
744.Dq "Mmm dd hh:mm:ss" ,
745where Mmm is the abbreviation for the month, dd is the date (1 - 31) and hh:mm:ss is the time.
746The local timezone is used.
747.It $((Time)(lcl))
748Alias for $((Time)(local)).
749.It $((Time)(utc))
750Formats a Time value as a string of the form
751.Dq "yyyy-mm-dd hh:mm:ssZ" ,
752using Coordinated Universal Time, or the
753.Dq Zulu
754time zone.
755.It $((Time)(zulu))
756Alias for $((Time)(utc)).
757.It $((Time)(X))
758Where X may be any letter in the range A - Z or a - z.
759Formats the Time using the format
760.Dq "yyyy-mm-dd hh:mm:ssX" ,
761using the specified nautical timezone.
762Z is the same as UTC/Zulu time.  Timezones A - M (except J) decrease by one hour to the east of the
763Zulu time zone.
764Timezones N - Y increase by one hour to the west of Z.
765M and Y have the same clock time, but differ by one day.
766J is used to indicate the local timezone.
767When printing using $((Time)(J)), the output format is
768.Dq "yyyy-mm-dd hh:mm:ss" ,
769without a trailing timezone letter.
770.It $((Time)(JZ))
771Specifies the local timezone.
772The timezone offset from UTC follows the date and time.
773The time is formatted as
774.Dq "yyyy-mm-dd hh:mm:ss[+|-]HH[:MM]" .
775Minutes in the timezone offset are only printed if they are non-zero.
776.It $((Time)(ISO8601))
777Specifies the local timezone, formatted as specified by ISO 8601.
778The timezone offset from UTC follows the date and time.
779The time is formatted as
780.Dq "yyyy-mm-ddThh:mm:ss[+|-]HH[:MM]" .
781Minutes in the timezone offset are only printed if they are non-zero.
782Note that this differs from
783.Dq JZ
784format only in that a
785.Dq T
786character separates the date and time.
787.It $((Time)([+|-]HH[:MM]))
788Specifies an offset (+ or -) of the indicated number of hours (HH) and optionally minutes (MM) to UTC.
789The value is formatted as a string of the form
790.Dq "yyyy-mm-dd hh:mm:ss[+|-]HH[:MM]" .
791Minutes in the timezone offset are only printed if they are non-zero.
792.El
793.Pp
794Unless a custom message format uses one of the specialized forms for
795.Dq Time
796described above, then any timestamps in an output message will be formatted according the the
797.Ar time_fmt
798argument.
799The known formats are identified by constants in the asl.h header file.
800.Pp
801.Bl -tag -width "ASL_TIME_FMT_SEC"
802.It ASL_TIME_FMT_SEC
803Formats timestamps as the number of seconds since the Epoch.
804.Pp
805.It ASL_TIME_FMT_UTC
806Formats a Time value as a string of the form
807.Dq "yyyy-mm-dd hh:mm:ssZ" ,
808using Coordinated Universal Time, or the
809.Dq Zulu
810time zone.
811.It ASL_TIME_FMT_LCL
812Formats a Time value as a string of the form
813.Dq "Mmm dd hh:mm:ss" ,
814where Mmm is the abbreviation for the month, dd is the date (1 - 31) and hh:mm:ss is the time.
815The local timezone is used.
816.El
817.Pp
818A value of NULL for the
819.Ar time_fmt
820argument will cause the default format ASL_TIME_FMT_LCL to be used.
821.Pp
822The
823.Ar encoding
824parameter specifies how certain characters are to be treated when preparing a message for output.
825The known encodings are:
826.Bl -tag -width "ASL_ENCODE_NONE"
827.It ASL_ENCODE_NONE
828No special character encode is done.
829.Pp
830.It ASL_ENCODE_ASL
831Newlines and tabs are also encoded as "\\n" and "\\t" respectively.
832In
833.Dq ASL_MSG_FMT_RAW
834format, space characters embedded in log message keys are encoded as "\\s"
835and embedded brackets are escaped to print as "\\[" and "\\]".
836.Pp
837.It ASL_ENCODE_SAFE
838Encodes backspace characters as ^H.
839Carriage returns are mapped to newlines.
840A tab character is appended after newlines so that message text is indented.
841.Pp
842.It ASL_ENCODE_XML
843This encoding should be used when formatting messages using ASL_MSG_FMT_XML.
844XML format output requires that keys are valid UTF8 strings.
845Keys which are not valid UTF8 are ignored, and the associated value is not printed.
846.Pp
847Values that contain legal UTF8 are printed as strings.
848Ampersand, less than, greater than, quotation mark, and apostrophe characters are encoded according to XML conventions.
849Embedded control characters are encoded as
850.Dq &#xNN;
851where NN is the character's hexadecimal value.
852.Pp
853Values that do not contain legal UTF8 are encoded in base-64 and printed as data objects.
854.El
855.Pp
856.Fn asl_add_output_file
857Returns 0 on success, non-zero on failure.
858.Pp
859.Pp
860.Fo asl_add_log_file
861.Fa asl
862.Fa descriptor
863.Fc
864Is equivalent to
865.Pp
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);
867.Pp
868Returns 0 on success, non-zero on failure.
869.Pp
870.Fo asl_set_output_file_filter
871.Fa asl
872.Fa descriptor
873.Fa filter
874.Fc
875replaces the current filter value associated with a file descriptor that has been added to a client handle.
876Returns the previous filter value.
877.Pp
878.Fo asl_remove_log_file
879.Fa asl
880.Fa descriptor
881.Fc
882removes a file descriptor from the set of file descriptors associated with a client handle.
883Returns 0 on success, non-zero on failure.
884.Pp
885.Fo asl_format
886.Fa msg
887.Fa msg_fmt
888.Fa time_fmt
889.Fa text_encoding
890.Fc
891formats the
892.Fa msg
893object using the message format string, time format string, and text encoding specified.
894Message formatting is described above for the
895.Fn asl_add_output_file
896routine.
897The caller must free the returned character string.
898.Pp
899.Fo asl_new
900.Fa type
901.Fc
902allocates and returns an asl_object_t structure, or NULL in the case of a failure in the library.
903The
904.Ar type
905argument should be ASL_TYPE_MSG, ASL_TYPE_QUERY, or ASL_TYPE_LIST.
906.Pp
907.Fo asl_get_type
908.Fa obj
909.Fc
910Returns the type of the object
911.Fa obj ,
912or ASL_TYPE_UNDEF if the object is not a recognized type.
913.Pp
914.Fo asl_retain
915.Fa obj
916.Fc
917Increments an internal reference count for
918.Fa obj .
919ASL objects are created with a reference count of 1.
920Objects returned by ASL routines should be retained if they are used outside
921of the immediate scope of the call that returned them.
922.Pp
923.Fo asl_release
924.Fa obj
925.Fc
926Decrements the internal reference count for
927.Fa obj .
928It frees the object and its associated resources when the reference count becomes zero.
929.Pp
930.Em DEPRECATED
931.Fo asl_free
932.Fa obj
933.Fc
934This interface is deprecated in favor of
935.Fn asl_release .
936It is implemented as a call to
937.Fn asl_release .
938.Pp
939.Fo asl_set
940.Fa msg
941.Fa key
942.Fa value
943.Fc
944creates a new key and value in an asl_object_t structure, or replaces the value of an existing key.
945Returns 0 on success, non-zero on failure.
946.Pp
947.Fo asl_set_query
948.Fa msg
949.Fa key
950.Fa op
951.Fa value
952.Fc
953is used to construct searches.
954It is similar to
955.Fn asl_set ,
956except that it takes an additional
957.Ar op
958(operation) argument.
959Creates a new (key, op, value) triple in an asl_object_t structure,
960or replaces the value and operation for an existing key.
961See the
962.Sx SEARCHING
963section for more information.
964Returns 0 on success, non-zero on failure.
965.Pp
966.Fo asl_unset
967.Fa msg
968.Fa key
969.Fc
970removes a key and its associated value from an asl_object_t structure.
971Returns 0 on success, non-zero on failure.
972.Pp
973.Fo asl_key
974.Fa msg
975.Fa n
976.Fc
977returns the nth key in an asl_object_t (beginning at zero),
978allowing an application to iterate through the keys.
979Returns NULL if
980.Ar n
981indexes beyond the number of keys in
982.Ar msg .
983.Pp
984.Fo asl_get
985.Fa msg
986.Fa key
987.Fc
988returns the value associated with
989.Ar key
990in the asl_object_t
991.Ar msg .
992Returns NULL if
993.Ar msg
994does not contain
995. Ar key .
996.Pp
997.Fo asl_fetch_key_val_op
998.Fa msg
999.Fa n
1000.Fa key
1001.Fa val
1002.Fa op
1003.Fc
1004Returns, in the
1005.Fa key ,
1006.Fa val ,
1007and
1008.Fa op
1009output parameters, the key, value, and operation (for ASL_TYPE_QUERY) at index
1010.Fa n
1011in the given object
1012.Fa msg .
1013The input
1014.Fa msg
1015should be of type ASL_TYPE_MSG or ASL_TYPE_QUERY.
1016Returns 0 on success, or non-zero otherwise.
1017Any of the output parameters may be NULL, in which case that parameter value will not
1018be returned.
1019.Pp
1020.Fo asl_count
1021.Fa obj
1022.Fc
1023returns a count of the number of elements contained in
1024.Fa obj .
1025For objects of type ASL_TYPE_MSG or ASL_TYPE_QUERY,
1026this is the number of dictionary keys.
1027For ASL_TYPE_LIST, it is the number of items in the list.
1028For ASL_TYPE_FILE, returns the number of messages contained in the file.
1029Returns zero for ASL_TYPE_STORE and ASL_TYPE_CLIENT.
1030.Pp
1031.Fo asl_append
1032.Fa obj
1033.Fa msg
1034.Fc
1035appends the
1036.Fa msg
1037object, which is typically of type ASL_TYPE_MSG or ASL_TYPE_QUERY, to the target
1038.Fa obj .
1039The target
1040.Fa obj
1041is typically a type that contains a collection of messages,
1042i.e. ASL_TYPE_LIST, ASL_TYPE_FILE, ASL_TYPE_STORE, or ASL_TYPE_CLIENT
1043(where the collection is the system ASL database).
1044.Fn asl_append
1045appends the
1046.Fa msg
1047object to the end of the target
1048.Fa obj .
1049.Pp
1050If
1051.Fa msg
1052is of type ASL_TYPE_LIST and
1053.Fa obj
1054is of type ASL_TYPE_LIST, ASL_TYPE_FILE, ASL_TYPE_STORE, or ASL_TYPE_CLIENT,
1055the each message in the
1056.Fa msg
1057list is appended in sequence to the the target
1058.Fa obj .
1059.Pp
1060If both
1061.Fa msg
1062and
1063.Fa obj
1064are of type ASL_TYPE_MSG or ASL_TYPE_QUERY, then the message dictionary from
1065.Fa msg
1066is merged with
1067.Fa obj .
1068Existing keys in
1069.Fa obj
1070are preserved.
1071For keys that are in
1072.Fa msg
1073that are not in
1074.Fa obj ,
1075the key and its value and operation are added to
1076.Fa obj .
1077.Pp
1078.Fo asl_prepend
1079.Fa obj
1080.Fa msg
1081.Fc
1082is similar to
1083.Fn asl_append ,
1084except that the
1085.Fa msg
1086object is prepended to the target
1087.Fa obj.
1088In the case where both parameters are of type ASL_TYPE_MSG or ASL_TYPE_QUERY,
1089all keys from
1090.Fa msg
1091are copied to
1092.Fa obj .
1093Existing keys are not preserved.
1094.Pp
1095.Fo asl_next
1096.Fa obj
1097.Fc
1098returns the next item in the target
1099.Fa obj ,
1100which may be of type ASL_TYPE_LIST, ASL_TYPE_FILE, ASL_TYPE_STORE, or of type ASL_TYPE_CLIENT
1101in which case the routine fetches messages consecutively from the system ASL database.
1102Returned objects are of type ASL_TYPE_MSG, or of type ASL_TYPE_QUERY if the target object is a
1103list containing query objects.
1104Returns NULL when there are no more objects to return from the target.
1105.Pp
1106.Fo asl_prev
1107.Fa obj
1108.Fc
1109is similar to
1110.Fn asl_next ,
1111except that it returns objects in reverse order.
1112Objects that contain messages have an internal index for the
1113.Dq current
1114item.
1115.Fn asl_next
1116and
1117.Fn asl_prev
1118simply return the current item and move the index forward or backward.
1119The index position can be set using
1120.Fn asl_reset_iteration .
1121.Pp
1122.Fo asl_reset_iteration
1123.Fa obj
1124.Fa position
1125.Fc
1126sets the current position index used be
1127.Fn asl_next
1128and
1129.Fn asl_prev .
1130The value of
1131.Fa position
1132may be zero to set the position index for
1133.Fa obj
1134at the beginning of its contents,
1135or it may be SIZE_MAX to set the position index for
1136.Fa obj
1137at the end of its contents.
1138For objects of type ASL_TYPE_LIST, the position index is an actual index into the list.
1139For other message containing objects, the index is an ID number which may not be sequential.
1140.Pp
1141.Fo asl_get_index
1142.Fa list
1143.Fa index
1144.Fc
1145returns the object at position
1146.Fa index
1147in the target
1148.Fa list
1149object, which must be of type ASL_TYPE_LIST.
1150Returns NULL if the index is out of range or if
1151.Fa list
1152is not a list type.
1153.Pp
1154.Fo asl_remove_index
1155.Fa list
1156.Fa index
1157.Fc
1158removes the object at position
1159.Fa index
1160from the target
1161.Fa list
1162object, which must be of type ASL_TYPE_LIST.
1163.Pp
1164.Fo asl_log_descriptor
1165.Fa asl
1166.Fa msg
1167.Fa level
1168.Fa descriptor
1169.Fa fd_type
1170.Fc
1171provides functionality to use file descriptors to send logging data to ASL.
1172.Ar asl
1173is retained by ASL and must still be closed by the caller by calling
1174.Fn asl_close
1175if the caller loses reference to it.
1176.Ar msg
1177is copied by ASL and similarly must still be releaser by the caller by calling
1178.Fn asl_release
1179if the caller loses reference to it.  Any changes made to it after calling
1180.Fn asl_log_descriptor()
1181are not applicable to the message used.
1182.Ar descriptor is treated differently based on the value of
1183.Ar fd_type .
1184.Pp
1185If
1186.Ar fd_type
1187is ASL_LOG_DESCRIPTOR_READ, the descriptor must be open for read access.  ASL
1188uses
1189.Xr dispatch 2
1190to read from the descriptor as data becomes available.  These data are line
1191buffered and passed to
1192.Fn asl_log .
1193When EOF is read, ASL will
1194.Xr close 2
1195.Ar descriptor ..
1196.Pp
1197If
1198.Ar fd_type
1199is ASL_LOG_DESCRIPTOR_WRITE, the descriptor is closed and a new writable
1200descriptor is created with the same fileno.  Any data written to this new
1201descriptor are line buffered and passed to
1202.Fn asl_log .
1203When EOF is sent, no further data are read.  The caller is responsible for
1204closing the new descriptor.  One common use for this API is to redirect writes
1205to stdout or stderr to ASL by passing STDOUT_FILENO or STDERR_FILENO as
1206.Ar descriptor .
1207.Pp
1208.Fo asl_search
1209.Fa obj
1210.Fa query
1211.Fc
1212searches messages in the
1213.Fa obj
1214object for messages that match the keys and values in
1215.Fa query ,
1216subject to matching operations associated with those keys and values.
1217The return returns an object of type ASL_TYPE_LIST containing matching messages,
1218or NULL if no matches are found.
1219The
1220.Ar query
1221argument should be constructed using
1222.Fn asl_set_query .
1223See the
1224.Sx SEARCHING
1225section for details on constructing queries.
1226.Pp
1227The
1228.Fa obj
1229parameter may be any ASL object.
1230For type ASL_TYPE_CLIENT, the main ASL system database is searched.
1231If the object type is ASL_TYPE_STORE or ASL_TYPE_FILE,
1232then the corresponding data store or data file is searched.
1233For ASL_TYPE_LIST, matches are found in a message list.
1234If
1235.Fa obj
1236is of type ASL_TYPE_MSG and query is of type ASL_TYPE_QUERY,
1237.Fa obj
1238is matched against the query,
1239and a list containing
1240.Fa obj
1241is returned if the match succeeds.
1242If both
1243.Fa obj
1244and
1245.Fa query
1246are objects of type ASL_TYPE_MSG or both are of type ASL_TYPE_QUERY,
1247they are tested for exact match.
1248A list containing
1249.Fa obj
1250is returned if the match is exact.
1251If
1252.Fa obj
1253is of type ASL_TYPE_QUERY and
1254.Fa query
1255is of type ASL_TYPE_MSG, the routine returns NULL.
1256.Pp
1257.Fo asl_match
1258.Fa obj
1259.Fa querylist
1260.Fa last
1261.Fa start
1262.Fa count
1263.Fa duration
1264.Fa direction
1265.Fc
1266is similar to
1267.Fn asl_search ,
1268but allows more advanced searching of ASL objects.
1269The
1270.Fa obj
1271parameter may be of any type, as with
1272.Fn asl_search .
1273The
1274.Fa querylist
1275parameter must be an object of type ASL_TYPE_LIST,
1276containing zero or more objects of type ASL_TYPE_QUERY.
1277A NULL
1278.Fa querylist
1279or a list containing zero objects matches all messages in the target
1280.Fa obj.
1281.Pp
1282The caller may provide a starting ASL message ID, a direction, and a count.
1283A
1284.Fa start
1285ID value of 0 means that matching should commence at the beginning of the target
1286.Fa obj .
1287A value of SIZE_MAX indicates that matching should commence at the end (most recent message)
1288in the target.
1289If a non-zero
1290.Fa count
1291value is supplied, the routine will return when it has found that many messages,
1292or it has checked all messages.
1293If a non-zero
1294.Fa duration
1295is supplied, the routine will return after the specified time (in microseconds).
1296If both
1297.Fa count
1298and
1299.Fa duration
1300are non-zero, the routine will return when the desired number of items has been matched
1301or when the specified duration has been exceeded, whichever occurs first.
1302The search direction may be ASL_MATCH_DIRECTION_FORWARD or ASL_MATCH_DIRECTION_REVERSE.
1303The routine sets the value of the out parameter
1304.Fa last
1305to be an index of the last message checked while matching.
1306To fetch matching messages in batches (using a small count or duration value), the
1307.Fa start
1308value for each iteration should be set to
1309.Fa last
1310+ 1 if searching forward, or
1311.Fa last
1312- 1 for reverse search.
1313.Pp
1314.Em DEPRECATED
1315.Fo aslresponse_next
1316.Fa r
1317.Fc
1318This interface is deprecated in favor of
1319.Fn asl_next .
1320It is implemented as a call to
1321.Fn asl_next .
1322.Pp
1323.Em DEPRECATED
1324.Fo aslresponse_free
1325.Fa r
1326.Fc
1327This interface is deprecated in favor of
1328.Fn asl_release .
1329It is implemented as a call to
1330.Fn asl_release .
1331.Pp
1332.Fo asl_create_auxiliary_file
1333.Fa msg
1334.Fa title
1335.Fa uti
1336.Fa out_descriptor
1337.Fc
1338Creates an auxiliary file that may be used by the client to save arbitrary data.
1339When the file is closed using
1340.Fo asl_close_auxiliary_file
1341.Fc ,
1342.Nm syslogd
1343will log the specified
1344.Fa msg
1345along with the
1346.Fa title
1347and the Uniform Type Identifier provided by
1348.Fa uti .
1349If a NULL value is supplied for
1350.Fa uti
1351the type
1352.Dq public.data
1353will be used.
1354The
1355.Nm Console
1356application will display the message with a link to the file.
1357.Pp
1358Auxiliary files are saved in the ASL data store.
1359They are automatically deleted at the same time that the log message expires.
1360Messages expire in 7 days by default.
1361A value set for the ASLExpireTime key will override the default.
1362Read access for the auxiliary file will be the same as read access for
1363.Fa msg .
1364By default, messages (and auxiliary files) are world-readable.
1365Access may be limited by setting values for the ReadUID and ReadGID keys.
1366.Pp
1367.Fo asl_close_auxiliary_file
1368.Fa descriptor
1369.Fc
1370closes the file descriptor
1371.Ar descriptor
1372previously returned by a call to
1373.Fn asl_create_auxiliary_file .
1374.Pp
1375.Fo asl_log_auxiliary_location
1376.Fa msg
1377.Fa title
1378.Fa uti
1379.Fa url
1380.Fc
1381will log the specified
1382.Fa msg
1383along with the
1384.Fa title ,
1385the Uniform Type Identifier provided by
1386.Fa uti ,
1387and the Uniform Resource Locator provided by
1388.Fa url .
1389The
1390.Nm Console
1391application will display the message with a link to the file.
1392This allows a client to save data in an auxiliary file, but unlike
1393.Fn asl_create_auxiliary_file ,
1394the life-cycle of this file must be managed by some external system.
1395The file will not be removed when the corresponding log message expired from the ASL data store.
1396.Pp
1397.Fo asl_open_from_file
1398.Fa descriptor
1399.Fa facility
1400.Fa opts
1401.Fc
1402creates a client handle for an open file descriptor
1403.Fa descriptor .
1404This routine may be used in conjunction with
1405.Fn asl_create_auxiliary_file
1406or
1407.Fn asl_log_auxiliary_location
1408to save ASL format log messages in an auxiliary file.
1409The UTI type
1410.Dq com.apple.asl-file
1411should be used for ASL format auxiliary files.
1412.Pp
1413Files with this format may be read from the command line using
1414.Nm syslog Fl f Ar file ,
1415or from the
1416.Nm Console
1417utility.
1418.Pp
1419The file must be open for read and write access.
1420The file will be truncated and its existing contents will be lost.
1421.Fo asl_close
1422.Fc
1423must be called to close the client handle when logging to this file is complete.
1424The file should be closed using
1425.Fo asl_close_auxiliary_file
1426.Fc
1427if it was returned by
1428.Fo asl_create_auxiliary_file
1429.Fc ,
1430or
1431.Fo close
1432.Fc
1433otherwise.
1434.Pp
1435The client handle returned by
1436.Fn asl_open_from_file
1437contains an internal lock, and may be used safely by multiple threads or from independent dispatch queues.
1438Note that callers will contend for the internal lock when saving log messages to a file.
1439.Pp
1440Note that messages with ReadUID or ReadGID values will simply be saved to the file,
1441and will not effect read access to either the message or the file itself.
1442Similarly, messages with ASLExpireTime values will be saved, but will not effect the
1443life-cycle of either the individual messages or the file.
1444.Pp
1445.Fo asl_encode_buffer
1446.Fa in
1447.Fa len
1448.Fc
1449is a utility routine for encoding arbitrary data buffers.
1450ASL message dictionary keys and values are nul-terminated C strings.
1451If an application wishes to include arbitrary data which may contain zero bytes,
1452the data buffer must first be encoded in a manner that eliminates any embedded zeros.
1453The
1454.Fn asl_encode_buffer
1455routine will encode an arbitrary data buffer at the address
1456.Fa in
1457containing
1458.Fa len
1459bytes (octets) of data.
1460The output of the routine is a nul-terminated C string.
1461The encoded string may be decoded using the companion
1462.Fn asl_decode_buffer
1463routine.
1464.Pp
1465This utility is used by the ASL server
1466.Nm syslogd
1467to encode the value associated with ASL_KEY_AUX_DATA in an ASL_TYPE_MSG object.
1468An ASL_KEY_AUX_DATA key/value pair is used to hold the data written to a file descriptor
1469created by
1470.Fn asl_create_auxiliary_file
1471on iOS systems, where the ASL database is stored in memory.
1472.Pp
1473.Fo asl_decode_buffer
1474.Fa in
1475.Fa buf
1476.Fa len
1477.Fc
1478decodes a C string previously created by
1479.Fn asl_encode_buffer
1480back into a buffer, possibly containing embedded zero bytes (octets).
1481The routine allocates memory for the buffer and returns a pointer in an output
1482.Fa buf
1483parameter.
1484The caller is responsible for freeing the buffer.
1485.Pp
1486This routine should be used to decode the value associated with an
1487ASL_KEY_AUX_DATA key in an ASL_TYPE_MSG object.
1488.Pp
1489.Ss MESSAGES
1490At the core of this API is the asl_object_t structure.
1491Although the structure is opaque and may not be directly manipulated,
1492it contains a list of key/value pairs.
1493All keys and values are NUL-character terminated C language strings.
1494UTF-8 encoding may be used for non-ASCII characters.
1495.Pp
1496Message structures are generally used to send log messages,
1497and are created thusly:
1498.Pp
1499    asl_object_t m = asl_new(ASL_TYPE_MSG);
1500.Pp
1501Another message type, ASL_TYPE_QUERY,
1502is used to create queries when searching the data store.
1503Query type messages and searching are described in detail in the
1504.Sx SEARCHING
1505section.
1506For the remainder of this section,
1507the messages described will be of the ASL_TYPE_MSG variety.
1508.Pp
1509Each asl_object_t contains a default set of keys
1510and values that are associated with them.
1511These keys are listed in the asl.h header file.
1512They are:
1513.Pp
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"
1523.Pp
1524Many of these correspond to equivalent parts of messages described in the
1525.Xr syslog 3
1526API.
1527Values associated with these message keys are assigned appropriate defaults.
1528The value for ASL_KEY_HOST is the local host name,
1529the value associated with ASL_KEY_SENDER is the process name,
1530the ASL_KEY_PID is the client's process ID number, and so on.
1531.Pp
1532Note the addition of the UID and GID keys.
1533The values for UID and GID are set in library code by the message sender.
1534The server will attempt to confirm the values,
1535but no claim is made that these values cannot be maliciously overridden
1536in an attempt to deceive a log message reader
1537as to the identity of the sender of a message.
1538The contents of log messages must be regarded as insecure.
1539.Pp
1540The
1541.Xr asl 3
1542API does not require a process to choose a facility name.
1543The
1544.Nm syslogd
1545server will use a default value of
1546.Dq user
1547if a facility is not set.
1548However, a client may set a facility name as an argument in the
1549.Fn asl_open
1550call, or by setting a specific value for the ASL_KEY_FACILITY in a message:
1551.Pp
1552    asl_set(m, ASL_KEY_FACILITY, "com.somename.greatservice");
1553.Pp
1554An application may choose any facility name at will.
1555Different facility names may be attached to different messages, perhaps to distinguish different subsystems in log messages.
1556Developers are encouraged to adopt a
1557.Dq Reverse ICANN
1558naming convention to avoid conflicting facility names.
1559.Pp
1560Default values are set in the message for each of the keys listed above,
1561except for ASL_KEY_MSG,
1562which may be explicitly set at any time using the
1563.Fn asl_set
1564routine, or implicitly set at the time the message is sent using the
1565.Fn asl_log_message ,
1566.Fn asl_log ,
1567or
1568.Fn asl_vlog
1569routines.
1570These three routines also have an integer-level parameter
1571for specifying the log priority.
1572The ASL_KEY_LEVEL value is set accordingly.
1573Finally, the value associated with ASL_KEY_TIME
1574is set in the sending routine.
1575.Pp
1576When logging from multiple threads,
1577each thread
1578.Em should
1579open a separate client handle using
1580.Fn asl_open .
1581The client handle may then be closed when it is no longer required using
1582.Fn asl_release .
1583Multiple threads may log messages safely using a NULL asl_object_t argument,
1584but the library will use an internal lock, so that in fact only one thread
1585will log at a time.
1586.Pp
1587When an application requires additional keys and values
1588to be associated with each log message,
1589a single message structure may be allocated and set up as
1590.Dq template
1591message of sorts:
1592.Pp
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");
1596    ...
1597    asl_log(NULL, m, ASL_LEVEL_NOTICE, "Message One");
1598    ...
1599    asl_log(NULL, m, ASL_LEVEL_ERR, "Message Two");
1600.Pp
1601The message structure will carry the values set for the
1602.Dq Facility
1603and
1604.Dq Clearance
1605keys so that they are used in each call to
1606.Fn asl_log ,
1607while the log level and the message text
1608are taken from the calling parameters.
1609.Pp
1610The
1611.Ar format
1612argument to
1613.Fn asl_log
1614and
1615.Fn asl_vlog
1616is identical to
1617.Xr printf 3 ,
1618and may include
1619.Ql %m ,
1620which is replaced by the current error message
1621(as denoted by the global variable
1622.Va errno ;
1623see
1624.Xr strerror 3 . )
1625.Pp
1626Key/value pairs may be removed from a message structure with
1627.Fn asl_unset .
1628A message may be freed using
1629.Fn asl_release .
1630.Pp
1631The
1632.Fn asl_send
1633routine is used by
1634.Fn asl_log
1635and
1636.Fn asl_vlog
1637to transmit a message to the server.
1638This routine sets the value associated with ASL_KEY_TIME
1639and sends the message.
1640It may be called directly if all of a message's key/value pairs
1641have been created using
1642.Fn asl_set .
1643.Ss SECURITY
1644Messages that are sent to the
1645.Nm syslogd
1646server may be saved in a message store.
1647The store may be searched using
1648.Fn asl_search ,
1649as described below.
1650By default, all messages are readable by any user.
1651However, some applications may wish to restrict read access
1652for some messages.
1653To accommodate this,
1654a client may set a value for the "ReadUID" and "ReadGID" keys.
1655These keys may be associated with a value
1656containing an ASCII representation of a numeric UID or GID.
1657Only the root user (UID 0),
1658the user with the given UID,
1659or a member of the group with the given GID
1660may fetch access-controlled messages from the database.
1661.Pp
1662Although the ASL system does not require a "Facility" key in a message,
1663many processes specify a "Facility" value similar
1664to the common usage of the BSD
1665.Nm syslog
1666API, although developers are encouraged to adopt facility names that make sense for their application.
1667A
1668.Dq Reverse ICANN
1669naming convention (e.g. "com.apple.system.syslog") should be adopted to avoid conflicting names.
1670The ASL system generally allows any string to be used as a facility value,
1671with one exception.
1672The value "com.apple.system",
1673or any string that has "com.apple.system" as a prefix,
1674may only be used by processes running with the UID 0.
1675This allows system processes to log messages that can not be "spoofed" by user processes.
1676Non-UID 0 client processes that specify "com.apple.system" as a facility, will be assigned the value "user"
1677by the
1678.Nm syslogd
1679server.
1680.Ss CLIENT HANDLES
1681A client handle contains various parameters and control settings that are used when a message is logged.
1682This includes an identification string, a facility name, filtering controls, additional file descriptors, and other data.
1683Client handles are not thread-safe.
1684Applications that log from multiple threads should create a client handle for each thread.
1685.Pp
1686Applications that use libdispatch must also avoid using a single client handle from multiple dispatch queues if those queues may run concurrently.
1687A good approach is to create one or more serial dispatch queues specifically for logging.
1688Each such queue should use its own ASL client handle.
1689.Pp
1690If a single handle must be accessed by multiple dispatch queues,
1691then the application must use locks, semaphores, or some other mechanism to prevent concurrent access to a client handle.
1692.Pp
1693A NULL value may be used in any of the routines
1694that require an asl_object_t argument.
1695In this case, the library will use an internal client handle.
1696This internal handle contains its own lock, allowing multiple threads to safely use the NULL client handle.
1697Note, however, that contention for the lock may cause undesirable synchronization behavior or reduced performance.
1698.Pp
1699The
1700.Fn asl_open
1701routine may be given an ident argument,
1702which becomes the default value for the ASL_KEY_SENDER key,
1703and a facility argument,
1704which becomes the value associated with the ASL_KEY_FACILITY key.
1705If NULL is passed as the value for
1706.Ar ident ,
1707the name of the currently running program will be used.
1708If NULL is passed as the value for
1709.Ar facility ,
1710the value
1711.Dq user
1712will be used for non UID 0 processes, and
1713.Dq
1714daemon
1715will be used for UID 0 processes.
1716.Pp
1717Several options are available when creating a client handle.
1718They are:
1719.Pp
1720.Bl -tag -width "ASL_OPT_NO_REMOTE" -compact
1721.It ASL_OPT_STDERR
1722adds stderr as an output file descriptor
1723.It ASL_OPT_NO_DELAY
1724connects to the server immediately
1725.It ASL_OPT_NO_REMOTE
1726disables remote-control filter adjustment
1727.El
1728.Pp
1729See the FILTERING section below, and the
1730.Xr syslog 1
1731for additional details on filter controls.
1732.Pp
1733A client handle is closed and its resources released using
1734.Fn asl_close .
1735Note that if additional file descriptors were added to the handle,
1736either using the ASL_OPT_STDERR option
1737or afterwards with the
1738.Fn asl_add_log_file
1739routine, those file descriptors are not closed by
1740.Fn asl_close .
1741.Ss LOGGING TO ADDITIONAL FILES
1742If a client handle is opened with the ASL_OPT_STDERR option to
1743.Fn asl_open ,
1744a copy of each log message will be sent to stderr.
1745Additional output streams may be include using
1746.Fn asl_add_log_file .
1747.Pp
1748Messages sent to stderr or other files are printed in the "standard" message format
1749also used as a default format by the
1750.Xr syslog 1
1751command line utility.
1752Non-ASCII characters in a message are encoded using the
1753.Dq safe
1754encoding style used by
1755.Xr syslog 1
1756with the
1757.Fl E Ar safe
1758option.
1759Backspace characters are printed as ^H.
1760Carriage returns are mapped to newlines.
1761A tab character is appended after newlines so that message text is indented.
1762.Pp
1763File descriptors may be removed from the list of outputs associated
1764with a client handle with
1765.Fn asl_remove_log_file .
1766This routine simply removes the file descriptor from the output list.
1767The file is not closed as a result.
1768.Pp
1769The ASL_OPT_STDERR option may not be unset
1770after a client handle has been opened.
1771.Ss SEARCHING
1772The
1773.Nm syslogd
1774server archives received messages in a data store
1775that may be searched using the
1776.Fn asl_search ,
1777.Fn asl_next ,
1778and
1779.Fn asl_release
1780routines.
1781A query message is created using:
1782.Pp
1783    asl_object_t q = asl_new(ASL_TYPE_QUERY);
1784.Pp
1785Search settings are made in the query using
1786.Fn asl_set_query .
1787A search is performed on the data store with
1788.Fn asl_search .
1789It returns an object of type ASL_TYPE_LIST.
1790The caller may use routines that operate on lists, such as
1791.Fn asl_next ,
1792.Fn asl_prev ,
1793and
1794.Fn asl_get_index
1795to access the matching messages.
1796.Pp
1797Like other messages, ASL_TYPE_QUERY messages contain keys and values.
1798They also associate an operation with each key and value.
1799The operation is used to decide if a message matches the query.
1800The simplest operation is ASL_QUERY_OP_EQUAL, which tests for equality.
1801For example, the following code snippet searches for messages
1802with a Sender value equal to
1803.Dq MyApp .
1804.Pp
1805    asl_object_t q, r;
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);
1809.Pp
1810More complex searches may be performed using other query operations.
1811.Pp
1812.Bl -tag -width "ASL_QUERY_OP_GREATER_EQUAL" -compact
1813.It ASL_QUERY_OP_EQUAL
1814value equality
1815.It ASL_QUERY_OP_GREATER
1816value greater than
1817.It ASL_QUERY_OP_GREATER_EQUAL
1818value greater than or equal to
1819.It ASL_QUERY_OP_LESS
1820value less than
1821.It ASL_QUERY_OP_LESS_EQUAL
1822value less than or equal to
1823.It ASL_QUERY_OP_NOT_EQUAL
1824value not equal
1825.It ASL_QUERY_OP_REGEX
1826regular expression search
1827.It ASL_QUERY_OP_TRUE
1828always true - use to test for the existence of a key
1829.El
1830.Pp
1831Regular expression search uses
1832.Xr regex 3
1833library.
1834Patterns are compiled using the REG_EXTENDED and REG_NOSUB options.
1835.Pp
1836Modifiers that change the behavior of these operations
1837may also be specified by ORing the modifier value with the operation.
1838The modifiers are:
1839.Pp
1840.Bl -tag -width "ASL_QUERY_OP_SUBSTRING" -compact
1841.It ASL_QUERY_OP_CASEFOLD
1842string comparisons are case-folded
1843.It ASL_QUERY_OP_PREFIX
1844match a leading substring
1845.It ASL_QUERY_OP_SUFFIX
1846match a trailing substring
1847.It ASL_QUERY_OP_SUBSTRING
1848match any substring
1849.It ASL_QUERY_OP_NUMERIC
1850values are converted to integer using
1851.Nm atoi
1852.El
1853.Pp
1854The only modifier that is checked
1855for ASL_QUERY_OP_REGEX search is ASL_QUERY_OP_CASEFOLD.
1856This causes the regular expression to be compiled
1857with the REG_ICASE option.
1858.Pp
1859If a query message contains more than one set of key/value/operation triples,
1860the result will be a logical AND.  For example, to find messages from
1861.Dq MyApp
1862with a priority level less than or equal to
1863.Dq 3 :
1864.Pp
1865    asl_object_t q, r;
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);
1871.Pp
1872After calling
1873.Fn asl_search
1874to get a list of matching messages, one can use
1875.Fn asl_next
1876to iterate through the list, and
1877.Fn asl_fetch_key_val_op
1878To iterate through the message dictionary.
1879.Pp
1880    asl_object_t q, r;
1881.Pp
1882    ...
1883    r = asl_search(NULL, q);
1884    while (NULL != (m = asl_next(r)))
1885    {
1886        int i, n;
1887        n = asl_count(m);
1888        for (i = 0; i < n; i++)
1889        {
1890		    const char *key, *val;
1891            asl_fetch_key_val_op(m, i, key, val, NULL);
1892            ...
1893        }
1894    }
1895    asl_release(r);
1896.Pp
1897.Ss FILTERING AND REMOTE CONTROL
1898Clients may set a filter mask value with
1899.Fn asl_set_filter .
1900The mask specifies which messages should be sent to the
1901.Nm syslogd
1902daemon by specifying a yes/no setting for each priority level.
1903Clients typically set a filter mask
1904to avoid sending relatively unimportant messages.
1905For example, Debug or Info priority level messages
1906are generally only useful for debugging operations.
1907By setting a filter mask, a process can improve performance
1908by avoiding sending messages that are in most cases unnecessary.
1909.Pp
1910.Fn asl_set_filter returns the previous value of the filter, i.e. the value of the filter before the routine was called.
1911.Pp
1912As a convenience, the macros ASL_FILTER_MASK(level) and ASL_FILTER_MASK_UPTO(level)
1913may be used to construct a bit mask corresponding to a given priority level,
1914or corresponding to a bit mask for all priority levels
1915from ASL_LEVEL_EMERG to a given input level.
1916.Pp
1917The default filter mask is ASL_FILTER_MASK_UPTO(ASL_LEVEL_NOTICE).
1918This means that by default,
1919and in the absence of remote-control changes (described below),
1920ASL_LEVEL_DEBUG and ASL_LEVEL_INFO priority level messages
1921are not sent to the
1922.Nm syslogd
1923server.
1924.Pp
1925Three different filters exist for each application.
1926The first is the filter mask set using
1927.Fn asl_set_filter
1928as described above.
1929The Apple System Log facility also manages a
1930.Dq master
1931filter mask.
1932The master filter mask usually has a value
1933that indicates to the library that it is
1934.Dq off ,
1935and thus it has no effect.
1936However, the mask filter mask may be enabled
1937by giving it a value using the
1938.Nm syslog
1939command, using the
1940.Fl c
19410 option.
1942When the master filter mask has been set,
1943it takes precedence over the client's filter mask.
1944The client's mask is unmodified,
1945and will become active again if remote-control filtering is disabled.
1946.Pp
1947In addition to the master filter mask,
1948The Apple System Log facility
1949also manages a per-client remote-control filter mask.
1950Like the master filter mask, the per-client mask is usually
1951.Dq off ,
1952having no effect on a client.
1953If a per-client filter mask is set using the
1954.Nm syslog
1955command, using the
1956.Fl c Ar process
1957option, then it takes precedence
1958over both the client's filter mask and the master filter mask.
1959As is the case with the master filter mask,
1960a per-client mask ceases having any effect when if is disabled.
1961.Pp
1962The ASL_OPT_NO_REMOTE option to
1963.Fn asl_open
1964causes both the master and per-client remote-control masks
1965to be ignored in the library.
1966In that case, only the client's own filter mask
1967is used to determine which messages are sent to the server.
1968This may be useful for Applications that produce log messages
1969that should never be filtered, due to security considerations.
1970Note that root (administrator) access is required
1971to set or change the master filter mask,
1972and that only root may change a per-client remote-control filter mask
1973for a root (UID 0) process.
1974.Pp
1975The per-process remote control filter value is kept as a state value
1976associated with a key managed by
1977.Nm notifyd .
1978The key is protected by an access control mechanism that only permits the
1979filter value to be accessed and modified by the same effective UID as the
1980ASL client at the time that the first ASL connection was created.
1981Remote filter control using
1982.Nm syslog Fl c
1983will fail for processes that change effective UID after starting an ASL connection.
1984Those processes should close all ASL client handles and then re-open ASL connections
1985if remote filter control support is desired.
1986.Sh HISTORY
1987These functions first appeared in
1988Mac OS X 10.4.
1989.Sh SEE ALSO
1990.Xr syslog 1 ,
1991.Xr strvis 3 ,
1992.Xr syslogd 8
1993