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