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