]>
Commit | Line | Data |
---|---|---|
34e8f829 | 1 | .\" Copyright (c) 2005-2007 Apple Inc. |
3d9156a7 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 | .\" | |
224c7076 | 29 | .Dd January 11, 2007 |
3d9156a7 A |
30 | .Dt asl 3 |
31 | .Os "Mac OS X" | |
32 | .Sh NAME | |
224c7076 | 33 | .Nm asl_add_log_file , |
3d9156a7 | 34 | .Nm asl_close , |
3d9156a7 | 35 | .Nm asl_free , |
3d9156a7 | 36 | .Nm asl_get , |
3d9156a7 | 37 | .Nm asl_key , |
224c7076 A |
38 | .Nm asl_log , |
39 | .Nm asl_new , | |
40 | .Nm asl_open , | |
3d9156a7 | 41 | .Nm asl_remove_log_file , |
3d9156a7 | 42 | .Nm asl_search , |
224c7076 A |
43 | .Nm asl_send , |
44 | .Nm asl_set , | |
45 | .Nm asl_set_filter , | |
46 | .Nm asl_set_query , | |
47 | .Nm asl_unset , | |
48 | .Nm asl_vlog , | |
49 | .Nm aslresponse_free , | |
50 | .Nm aslresponse_next | |
3d9156a7 A |
51 | .Nd system log message sending and searching functions |
52 | .Sh SYNOPSIS | |
53 | .Fd #include <asl.h> | |
224c7076 A |
54 | .\" |
55 | .Ft int | |
56 | .Fo asl_add_log_file | |
57 | .Fa "aslclient asl" | |
58 | .Fa "int fd" | |
59 | .Fc | |
3d9156a7 | 60 | .Ft void |
224c7076 A |
61 | .Fo asl_close |
62 | .Fa "aslclient asl" | |
63 | .Fc | |
3d9156a7 | 64 | .Ft void |
224c7076 A |
65 | .Fo asl_free |
66 | .Fa "aslmsg msg" | |
67 | .Fc | |
3d9156a7 | 68 | .Ft const char * |
224c7076 A |
69 | .Fo asl_get |
70 | .Fa "aslmsg msg" | |
71 | .Fa "const char *key" | |
72 | .Fc | |
3d9156a7 | 73 | .Ft const char * |
224c7076 A |
74 | .Fo asl_key |
75 | .Fa "aslmsg msg" | |
76 | .Fa "uint32_t n" | |
77 | .Fc | |
3d9156a7 | 78 | .Ft int |
224c7076 A |
79 | .Fo asl_log |
80 | .Fa "aslclient asl" | |
81 | .Fa "aslmsg msg" | |
82 | .Fa "int level" | |
83 | .Fa "const char *format" | |
84 | .Fa "..." | |
85 | .Fc | |
86 | .Ft aslmsg | |
87 | .Fo asl_new | |
88 | .Fa "uint32_t type" | |
89 | .Fc | |
90 | .Ft aslclient | |
91 | .Fo asl_open | |
92 | .Fa "const char *ident" | |
93 | .Fa "const char *facility" | |
94 | .Fa "uint32_t opts" | |
95 | .Fc | |
3d9156a7 | 96 | .Ft int |
224c7076 A |
97 | .Fo asl_remove_log_file |
98 | .Fa "aslclient asl" | |
99 | .Fa "int fd" | |
100 | .Fc | |
101 | .Ft aslresponse | |
102 | .Fo asl_search | |
103 | .Fa "aslclient asl" | |
104 | .Fa "aslmsg msg" | |
105 | .Fc | |
3d9156a7 | 106 | .Ft int |
224c7076 A |
107 | .Fo asl_send |
108 | .Fa "aslclient asl" | |
109 | .Fa "aslmsg msg" | |
110 | .Fc | |
3d9156a7 | 111 | .Ft int |
224c7076 A |
112 | .Fo asl_set |
113 | .Fa "aslmsg msg" | |
114 | .Fa "const char *key" | |
115 | .Fa "const char *value" | |
116 | .Fc | |
3d9156a7 | 117 | .Ft int |
224c7076 A |
118 | .Fo asl_set_filter |
119 | .Fa "aslclient asl" | |
120 | .Fa "int f" | |
121 | .Fc | |
3d9156a7 | 122 | .Ft int |
224c7076 A |
123 | .Fo asl_set_query |
124 | .Fa "aslmsg msg" | |
125 | .Fa "const char *key" | |
126 | .Fa "const char *value" | |
127 | .Fa "uint32_t op" | |
128 | .Fc | |
3d9156a7 | 129 | .Ft int |
224c7076 A |
130 | .Fo asl_unset |
131 | .Fa "aslmsg msg" | |
132 | .Fa "const char *key" | |
133 | .Fc | |
134 | .Ft int | |
135 | .Fo asl_vlog | |
136 | .Fa "aslclient asl" | |
137 | .Fa "aslmsg msg" | |
138 | .Fa "int level" | |
139 | .Fa "const char *format" | |
140 | .Fa "va_list ap" | |
141 | .Fc | |
3d9156a7 | 142 | .Ft void |
224c7076 | 143 | .Fo aslresponse_free |
b5d655f7 | 144 | .Fa "aslresponse r" |
224c7076 A |
145 | .Fc |
146 | .Ft aslmsg | |
147 | .Fo aslresponse_next | |
148 | .Fa "aslresponse r" | |
149 | .Fc | |
3d9156a7 | 150 | .Sh DESCRIPTION |
224c7076 | 151 | These routines provide an interface to the Apple System Log facility. |
3d9156a7 A |
152 | They are intended to be a replacement for the |
153 | .Xr syslog 3 | |
154 | API, which will continue to be supported for backwards compatibility. | |
224c7076 A |
155 | The new API allows client applications |
156 | to create flexible, structured messages and send them to the | |
3d9156a7 A |
157 | .Nm syslogd |
158 | server, where they may undergo additional processing. | |
224c7076 A |
159 | Messages received by the server are saved in a data store |
160 | (subject to input filtering constraints). | |
161 | This API permits clients to create queries | |
162 | and search the message data store for matching messages. | |
b5d655f7 A |
163 | .Pp |
164 | An introduction to the concepts underlying this interface follows the interface summary below. | |
165 | .Ss INTERFACE SUMMARY | |
166 | .Fo asl_open | |
167 | .Fa ident | |
168 | .Fa facility | |
169 | .Fa opts | |
170 | .Fc | |
171 | creates and returns a client handle, or NULL if an error occurs in the library. | |
172 | Messages sent using this handle will default to having the string | |
173 | .Ar ident | |
174 | as the value assocated with the ASL_KEY_SENDER key, and the value | |
175 | .Ar facility | |
176 | assocated with the ASL_KEY_FACILITY key. | |
177 | Several options are available, as described in the | |
178 | .Sx CLIENT HANDLES | |
179 | section. | |
180 | .Pp | |
181 | Multi-threaded applications should create one client handle for each thread that logs messages. | |
182 | A client may use NULL as a client handle, in which case a default handle managed by the library will be used. | |
183 | A NULL handle may be used safely by multiple threads, but the threads will contend for a single internal lock when | |
184 | sending log messages using a NULL handle. | |
185 | .Pp | |
186 | .Fo asl_close | |
187 | .Fa asl | |
188 | .Fc | |
189 | closes the client handle | |
190 | .Ar asl | |
191 | and releases its associated resources. | |
192 | .Pp | |
193 | .Fo asl_add_log_file | |
194 | .Fa asl | |
195 | .Fa fd | |
196 | .Fc | |
197 | adds the file descriptor | |
198 | .Ar fd | |
199 | to the a set of file descriptors associated with the client handle | |
200 | .Ar asl . | |
201 | Each log message sent by that client handle is also written to these file descriptors. | |
202 | Returns 0 on success, non-zero on failure. | |
203 | .Pp | |
204 | .Fo asl_remove_log_file | |
205 | .Fa asl | |
206 | .Fa fd | |
207 | .Fc | |
208 | removes a file descriptor from the set of file descriptors associated with a client handle. | |
209 | Returns 0 on success, non-zero on failure. | |
210 | .Pp | |
211 | .Fo asl_new | |
212 | .Fa type | |
213 | .Fc | |
214 | allocates and returns an aslmsg structure, or NULL in the case of a failure in the library. | |
215 | The | |
216 | .Ar type | |
217 | argument must be ASL_TYPE_MSG or ASL_TYPE_QUERY. | |
218 | .Pp | |
219 | .Fo asl_free | |
220 | .Fa msg | |
221 | .Fc | |
222 | frees an aslmsg and releases resources associated with the structure. | |
223 | .Pp | |
224 | .Fo asl_set | |
225 | .Fa msg | |
226 | .Fa key | |
227 | .Fa value | |
228 | .Fc | |
229 | creates a new key and value in an aslmsg structure, or replaces the value of an existing key. | |
230 | Returns 0 on success, non-zero on failure. | |
231 | .Pp | |
232 | .Fo asl_set_query | |
233 | .Fa msg | |
234 | .Fa key | |
235 | .Fa op | |
236 | .Fa value | |
237 | .Fc | |
238 | is used to construct searches. | |
239 | It is similar to | |
240 | .Fn asl_set , | |
241 | except that it takes an additional | |
242 | .Ar op | |
243 | (operation) argument. | |
244 | Creates a new (key, op, value) triple in an aslmsg structure, | |
245 | or replaces the value and operation for an existing key. | |
246 | See the | |
247 | .Sx SEARCHING | |
248 | section for more information. | |
249 | Returns 0 on success, non-zero on failure. | |
250 | .Pp | |
251 | .Fo asl_unset | |
252 | .Fa msg | |
253 | .Fa key | |
254 | .Fc | |
255 | removes a key and its associated value from an aslmsg structure. | |
256 | Returns 0 on success, non-zero on failure. | |
257 | .Pp | |
258 | .Fo asl_key | |
259 | .Fa msg | |
260 | .Fa n | |
261 | .Fc | |
262 | returns the nth key in an aslmsg (beginning at zero), | |
263 | allowing an application to iterate through the keys. | |
264 | Returns NULL if | |
265 | .Ar n | |
266 | indexes beyond the number of keys in | |
267 | .Ar msg . | |
268 | .Pp | |
269 | .Fo asl_get | |
270 | .Fa msg | |
271 | .Fa key | |
272 | .Fc | |
273 | returns the value associated with | |
274 | .Ar key | |
275 | in the aslmsg | |
276 | .Ar msg . | |
277 | Returns NULL if | |
278 | .Ar msg | |
279 | does not contain | |
280 | . Ar key . | |
281 | .Pp | |
282 | .Fo asl_set_filter | |
283 | .Fa asl | |
284 | .Fa f | |
285 | .Fc | |
286 | sets a filter for messages being sent to the server. | |
287 | The filter is a bitmask representing priority levels. | |
288 | Only messages having a priority level with a corresponding bit set in the filter mask are sent to the | |
289 | .Nm syslogd | |
290 | server. | |
291 | The filter does not control writes to additional files associated with the client handle using | |
292 | .Fn asl_add_log_file . | |
293 | Returns the previous filter value. | |
294 | .Pp | |
295 | .Fo asl_log | |
296 | .Fa asl | |
297 | .Fa msg | |
298 | .Fa level | |
299 | .Fa format | |
300 | .Fa args... | |
301 | .Fc | |
302 | sends a log to the server (subject to filtering, see | |
303 | .Fn asl_set_filter | |
304 | above) and to any file descriptors associated with the client handle | |
305 | .Ar asl . | |
306 | The | |
307 | .Ar msg | |
308 | argument may contain any keys and values, which will be formatted as part of the log message. | |
309 | The value for ASL_KEY_LEVEL is supplied by the | |
310 | .Ar level | |
311 | argument. | |
312 | The value for ASL_KEY_MESSAGE is computed from | |
313 | .Ar format | |
314 | and the associated arguments | |
315 | .Ar args... . | |
316 | Normal | |
317 | .Fn printf | |
318 | style argument processing is applied to the format and the arguments. | |
319 | The format may also contain | |
320 | .Dq %m | |
321 | which will be substituted with the string value corresponding to the current | |
322 | .Em errno . | |
323 | .Pp | |
324 | .Fo asl_vlog | |
325 | .Fa asl | |
326 | .Fa msg | |
327 | .Fa level | |
328 | .Fa format | |
329 | .Fa ap | |
330 | .Fc | |
331 | is similar to | |
332 | .Fn asl_log | |
333 | except that it takes a va_list argument. | |
334 | .Pp | |
335 | .Fo asl_send | |
336 | .Fa asl | |
337 | .Fa msg | |
338 | .Fc | |
339 | is similar to | |
340 | .Fn asl_log , | |
341 | exceopt the value for ASL_KEY_MESSAGE is taken from | |
342 | .Ar msg | |
343 | rather than being constructed using a | |
344 | .Fn printf | |
345 | style syntax. | |
346 | .Pp | |
347 | .Fo asl_search | |
348 | .Fa asl | |
349 | .Fa msg | |
350 | .Fc | |
351 | searches for messages that match the keys and values in | |
352 | .Ar msg , | |
353 | subject to matching operations associated with those keys and values. | |
354 | The | |
355 | .Ar msg | |
356 | argument should be constructed using | |
357 | .Fn asl_set_query . | |
358 | See the | |
359 | .Sx SEARCHING | |
360 | section for details on constructing queries. | |
361 | Returns an aslresponse structure that contains matching log messages. | |
362 | NULL is returned in case of error or if there are no matching messages in the ASL database. | |
363 | .Pp | |
364 | .Fo aslresponse_next | |
365 | .Fa r | |
366 | .Fc | |
367 | iterates over an aslresponse structure returned by | |
368 | .Fn asl_search . | |
369 | Each call returns the next aslmsg in the response. | |
370 | Returns NULL when there are no further messages. | |
371 | .Pp | |
372 | .Fo aslresponse_free | |
373 | .Fa r | |
374 | .Fc | |
375 | frees the aslresponse structure | |
376 | .Ar r | |
377 | and all of its associated resources. | |
3d9156a7 A |
378 | .Ss MESSAGES |
379 | At the core of this API is the aslmsg structure. | |
224c7076 A |
380 | Although the structure is opaque and may not be directly manipulated, |
381 | it contains a list of key/value pairs. | |
b5d655f7 | 382 | All keys and values are NUL-character terminated C language strings. |
3d9156a7 A |
383 | UTF-8 encoding may be used for non-ASCII characters. |
384 | .Pp | |
224c7076 A |
385 | Message structures are generally used to send log messages, |
386 | and are created thusly: | |
3d9156a7 A |
387 | .Pp |
388 | aslmsg m = asl_new(ASL_TYPE_MSG); | |
389 | .Pp | |
224c7076 A |
390 | Another message type, ASL_TYPE_QUERY, |
391 | is used to create queries when searching the data store. | |
3d9156a7 A |
392 | Query type messages and searching are described in detail in the |
393 | .Sx SEARCHING | |
b5d655f7 | 394 | section. |
224c7076 A |
395 | For the remainder of this section, |
396 | the messages described will be of the ASL_TYPE_MSG variety. | |
3d9156a7 | 397 | .Pp |
224c7076 A |
398 | Each aslmsg contains a default set of keys |
399 | and values that are associated with them. | |
3d9156a7 A |
400 | These keys are listed in the asl.h header file. |
401 | They are: | |
402 | .Pp | |
224c7076 A |
403 | #define ASL_KEY_TIME "Time" |
404 | #define ASL_KEY_HOST "Host" | |
405 | #define ASL_KEY_SENDER "Sender" | |
406 | #define ASL_KEY_FACILITY "Facility" | |
407 | #define ASL_KEY_PID "PID" | |
408 | #define ASL_KEY_UID "UID" | |
409 | #define ASL_KEY_GID "GID" | |
410 | #define ASL_KEY_LEVEL "Level" | |
411 | #define ASL_KEY_MSG "Message" | |
3d9156a7 A |
412 | .Pp |
413 | Many of these correspond to equivalent parts of messages described in the | |
414 | .Xr syslog 3 | |
415 | API. | |
416 | Values associated with these message keys are assigned appropriate defaults. | |
417 | The value for ASL_KEY_HOST is the local host name, | |
418 | the value associated with ASL_KEY_SENDER is the process name, | |
419 | the ASL_KEY_PID is the client's process ID number, and so on. | |
420 | .Pp | |
421 | Note the addition of the UID and GID keys. | |
422 | The values for UID and GID are set in library code by the message sender. | |
224c7076 A |
423 | The server will attempt to confirm the values, |
424 | but no claim is made that these values cannot be maliciously overridden | |
425 | in an attempt to deceive a log message reader | |
426 | as to the identity of the sender of a message. | |
3d9156a7 A |
427 | The contents of log messages must be regarded as insecure. |
428 | .Pp | |
3d9156a7 A |
429 | The |
430 | .Xr asl 3 | |
431 | API does not require a process to choose a facility name. | |
432 | The | |
433 | .Nm syslogd | |
434 | server will use a default value of | |
435 | .Dq user | |
436 | if a facility is not set. | |
224c7076 A |
437 | However, a client may set a facility name as an argument in the |
438 | .Nm asl_open | |
439 | call, or by setting a specific value for the ASL_KEY_FACILITY in a message: | |
3d9156a7 | 440 | .Pp |
224c7076 | 441 | asl_set(m, ASL_KEY_FACILITY, "com.somename.greatservice"); |
3d9156a7 A |
442 | .Pp |
443 | An application may choose any facility name at will. | |
224c7076 A |
444 | Different facility names may be attached to different messages, perhaps to distinguish different subsystems in log messages. |
445 | Developers are encouraged to adopt a | |
446 | .Dq Reverse ICANN | |
447 | naming convention to avoid conflicting facility names. | |
448 | .Pp | |
449 | Default values are set in the message for each of the keys listed above, | |
450 | except for ASL_KEY_MSG, | |
451 | which may be explicitly set at any time using the | |
3d9156a7 A |
452 | .Nm asl_set |
453 | routine, or implicitly set at the time the message is sent using the | |
454 | .Nm asl_log | |
455 | or | |
456 | .Nm asl_vlog | |
457 | routines. | |
224c7076 A |
458 | These two routines also have an integer-level parameter |
459 | for specifying the log priority. | |
3d9156a7 | 460 | The ASL_KEY_LEVEL value is set accordingly. |
224c7076 A |
461 | Finally, the value associated with ASL_KEY_TIME |
462 | is set in the sending routine. | |
3d9156a7 | 463 | .Pp |
224c7076 A |
464 | Although it may appear that there is significant overhead required |
465 | to send a log message using this API, | |
3d9156a7 A |
466 | the opposite is actually true. |
467 | A simple | |
468 | .Dq Hello World | |
469 | program requires only: | |
470 | .Pp | |
471 | #include <asl.h> | |
472 | ... | |
473 | asl_log(NULL, NULL, ASL_LEVEL_INFO, "Hello World!"); | |
474 | .Pp | |
475 | Both | |
476 | .Nm asl_log | |
477 | and | |
478 | .Nm asl_vlog | |
224c7076 A |
479 | will provide the appropriate default values |
480 | when passed a NULL aslmsg argument. | |
3d9156a7 A |
481 | .Pp |
482 | .Pp | |
483 | In this example, the aslclient argument is NULL. | |
484 | This is sufficient for a single-threaded application, | |
485 | or for an application which only sends log messages from a single thread. | |
224c7076 | 486 | When logging from multiple threads, |
b5d655f7 A |
487 | each thread |
488 | .Em should | |
489 | open a separate client handle using | |
3d9156a7 A |
490 | .Nm asl_open . |
491 | The client handle may then be closed when it is no longer required using | |
492 | .Nm asl_close . | |
b5d655f7 A |
493 | Multiple threads may log messages safely using a NULL aslclient argument, |
494 | but the library will use an internal lock, so that in fact only one thread | |
495 | will log at a time. | |
3d9156a7 | 496 | .Pp |
224c7076 A |
497 | When an application requires additional keys and values |
498 | to be associated with each log message, | |
3d9156a7 A |
499 | a single message structure may be allocated and set up as |
500 | .Dq template | |
501 | message of sorts: | |
502 | .Pp | |
503 | aslmsg m = asl_new(ASL_TYPE_MSG); | |
224c7076 | 504 | asl_set(m, ASL_KEY_FACILITY, "com.secrets.r.us"); |
3d9156a7 A |
505 | asl_set(m, "Clearance", "Top Secret"); |
506 | ... | |
507 | asl_log(NULL, m, ASL_LEVEL_NOTICE, "Message One"); | |
508 | ... | |
509 | asl_log(NULL, m, ASL_LEVEL_ERR, "Message Two"); | |
510 | .Pp | |
511 | The message structure will carry the values set for the | |
512 | .Dq Facility | |
513 | and | |
514 | .Dq Clearance | |
515 | keys so that they are used in each call to | |
516 | .Nm asl_log , | |
224c7076 A |
517 | while the log level and the message text |
518 | are taken from the calling parameters. | |
519 | .Pp | |
520 | The | |
521 | .Ar format | |
522 | argument to | |
523 | .Nm asl_log | |
524 | and | |
525 | .Nm asl_vlog | |
526 | is identical to | |
527 | .Xr printf 3 , | |
528 | and may include | |
529 | .Ql %m , | |
530 | which is replaced by the current error message | |
531 | (as denoted by the global variable | |
532 | .Va errno ; | |
533 | see | |
534 | .Xr strerror 3 . ) | |
3d9156a7 A |
535 | .Pp |
536 | Key/value pairs may be removed from a message structure with | |
537 | .Nm asl_unset . | |
538 | A message may be freed using | |
539 | .Nm asl_free . | |
540 | .Pp | |
541 | The | |
542 | .Nm asl_send | |
543 | routine is used by | |
544 | .Nm asl_log | |
545 | and | |
546 | .Nm asl_vlog | |
547 | to transmit a message to the server. | |
224c7076 A |
548 | This routine sets the value associated with ASL_KEY_TIME |
549 | and sends the message. | |
550 | It may be called directly if all of a message's key/value pairs | |
551 | have been created using | |
3d9156a7 | 552 | .Nm asl_set . |
224c7076 A |
553 | .Ss SECURITY |
554 | Messages that are sent to the | |
555 | .Nm syslogd | |
556 | server may be saved in a message store. | |
557 | The store may be searched using | |
558 | .Nm asl_search , | |
559 | as described below. | |
560 | By default, all messages are readable by any user. | |
561 | However, some applications may wish to restrict read access | |
562 | for some messages. | |
563 | To accomodate this, | |
564 | a client may set a value for the "ReadUID" and "ReadGID" keys. | |
565 | These keys may be associated with a value | |
566 | containing an ASCII representation of a numeric UID or GID. | |
567 | Only the root user (UID 0), | |
568 | the user with the given UID, | |
569 | or a member of the group with the given GID | |
570 | may fetch access-controlled messages from the database. | |
571 | .Pp | |
572 | Although the ASL system does not require a "Facility" key in a message, | |
573 | many processes specify a "Facility" value similar | |
574 | to the common usage of the BSD | |
575 | .Nm syslog | |
576 | API, although developers are encouraged to adopt facility names that make sense for their application. | |
577 | A | |
578 | .Dq Reverse ICANN | |
579 | naming convention (e.g. "com.apple.system.syslog") should be adopted to avoid conflicting names. | |
580 | The ASL system generally allows any string to be used as a facility value, | |
581 | with one exception. | |
582 | The value "com.apple.system", | |
583 | or any string that has "com.apple.system" as a prefix, | |
584 | may only be used by processes running with the UID 0. | |
585 | This allows system processes to log messages that can not be "spoofed" by user processes. | |
586 | Non-UID 0 client processes that specify "com.apple.system" as a facility, will be assigned the value "user" | |
587 | by the | |
588 | .Nm syslogd | |
589 | server. | |
3d9156a7 A |
590 | .Ss CLIENT HANDLES |
591 | When logging is done from a single thread, | |
224c7076 A |
592 | a NULL value may be used in any of the routines |
593 | that require an aslclient argument. | |
594 | In this case, the library will open an internal client handle | |
595 | on behalf of the application. | |
3d9156a7 A |
596 | .Pp |
597 | If multiple threads must do logging, | |
598 | or if client options are desired, | |
599 | then the application should call | |
600 | .Nm asl_open | |
601 | to create a client handle for each thread. | |
602 | As a convenience, | |
603 | the | |
604 | .Nm asl_open | |
605 | routine may be given an ident argument, | |
606 | which becomes the default value for the ASL_KEY_SENDER key, | |
607 | and a facility argument, | |
224c7076 | 608 | which becomes the value associated with the ASL_KEY_FACILITY key. |
3d9156a7 A |
609 | .Pp |
610 | Several options are available when creating a client handle. | |
611 | They are: | |
612 | .Pp | |
613 | .Bl -tag -width "ASL_OPT_NO_REMOTE" -compact | |
614 | .It ASL_OPT_STDERR | |
615 | adds stderr as an output file descriptor | |
616 | .It ASL_OPT_NO_DELAY | |
617 | connects to the server immediately | |
618 | .It ASL_OPT_NO_REMOTE | |
619 | disables remote-control filter adjustment | |
620 | .El | |
621 | .Pp | |
b5d655f7 A |
622 | ASL_OPT_NO_DELAY makes the client library connect to the |
623 | .Nm syslogd | |
624 | server at the time that | |
625 | .Nm asl_open | |
626 | is called, rather than waiting for the first message to be sent. | |
627 | Opening the connection is quite fast, but some applications may want to avoid any unnecessary delays when calling | |
628 | .Nm asl_log , | |
629 | .Nm asl_vlog , | |
630 | or | |
631 | .Nm asl_send . | |
632 | .Pp | |
3d9156a7 A |
633 | See the FILTERING section below, and the |
634 | .Xr syslog 1 | |
635 | for additional details on filter controls. | |
636 | .Pp | |
637 | A client handle is closed and it's resources released using | |
638 | .Nm asl_close . | |
224c7076 A |
639 | Note that if additional file descriptors were added to the handle, |
640 | either using the ASL_OPT_STDERR option | |
641 | or afterwards with the | |
3d9156a7 A |
642 | .Nm asl_add_log_file |
643 | routine, those file descriptors are not closed by | |
644 | .Nm asl_close . | |
645 | .Ss LOGGING TO ADDITIONAL FILES | |
646 | If a client handle is opened with the ASL_OPT_STDERR option to | |
647 | .Nm asl_open , | |
648 | a copy of each log message will be sent to stderr. | |
649 | Additional output streams may be include using | |
650 | .Nm asl_add_log_file . | |
224c7076 A |
651 | .Pp |
652 | Messages sent to stderr or other files are printed in the "standard" message format | |
653 | also used as a default format by the | |
654 | .Xr syslog 1 | |
655 | command line utility. | |
b5d655f7 A |
656 | Non-ASCII characters in a message are encoded using the |
657 | .Dq safe | |
658 | encoding style used by | |
659 | .Xr syslog 1 | |
660 | with the | |
661 | .Fl E Ar safe | |
662 | option. | |
663 | Backspace characters are printed as ^H. | |
664 | Carriage returns are mapped to newlines. | |
665 | A tab character is appended after newlines so that message text is indented. | |
224c7076 A |
666 | .Pp |
667 | File descriptors may be removed from the list of outputs associated | |
668 | with a client handle with | |
3d9156a7 A |
669 | .Nm asl_remove_log_file . |
670 | This routine simply removes the file descriptor from the output list. | |
671 | The file is not closed as a result. | |
672 | .Pp | |
224c7076 A |
673 | The ASL_OPT_STDERR option may not be unset |
674 | after a client handle has been opened. | |
3d9156a7 A |
675 | .Ss SEARCHING |
676 | The | |
677 | .Nm syslogd | |
224c7076 A |
678 | server archives received messages in a data store |
679 | that may be searched using the | |
3d9156a7 A |
680 | .Nm asl_search , |
681 | .Nm aslresponse_next , | |
682 | and | |
683 | .Nm aslresponse_free | |
684 | routines. | |
685 | A query message is created using: | |
686 | .Pp | |
687 | aslmsg q = asl_new(ASL_TYPE_QUERY); | |
688 | .Pp | |
689 | Search settings are made in the query using | |
690 | .Nm asl_set_query . | |
691 | A search is performed on the data store with | |
692 | .Nm asl_search . | |
693 | It returns an | |
694 | .Ft aslresponse | |
695 | structure. | |
696 | The caller may then call | |
697 | .Nm aslresponse_next | |
698 | to iterate through matching messages. | |
699 | The | |
700 | .Ft aslresponse | |
701 | structure may be freed with | |
702 | .Nm aslresponse_free . | |
703 | .Pp | |
704 | Like other messages, ASL_TYPE_QUERY messages contain keys and values. | |
705 | They also associate an operation with each key and value. | |
706 | The operation is used to decide if a message matches the query. | |
707 | The simplest operation is ASL_QUERY_OP_EQUAL, which tests for equality. | |
224c7076 A |
708 | For example, the following code snippet searches for messages |
709 | with a Sender value equal to | |
3d9156a7 A |
710 | .Dq MyApp . |
711 | .Pp | |
712 | aslmsg m; | |
713 | aslresponse r; | |
714 | q = asl_new(ASL_TYPE_QUERY); | |
715 | asl_set_query(q, ASL_KEY_SENDER, "MyApp", ASL_QUERY_OP_EQUAL); | |
716 | r = asl_search(NULL, q); | |
717 | .Pp | |
718 | More complex searches may be performed using other query operations. | |
719 | .Pp | |
720 | .Bl -tag -width "ASL_QUERY_OP_GREATER_EQUAL" -compact | |
721 | .It ASL_QUERY_OP_EQUAL | |
722 | value equality | |
723 | .It ASL_QUERY_OP_GREATER | |
724 | value greater than | |
725 | .It ASL_QUERY_OP_GREATER_EQUAL | |
726 | value greater than or equal to | |
727 | .It ASL_QUERY_OP_LESS | |
728 | value less than | |
729 | .It ASL_QUERY_OP_LESS_EQUAL | |
730 | value less than or equal to | |
731 | .It ASL_QUERY_OP_NOT_EQUAL | |
732 | value not equal | |
733 | .It ASL_QUERY_OP_REGEX | |
734 | regular expression search | |
735 | .It ASL_QUERY_OP_TRUE | |
736 | always true - use to test for the existence of a key | |
737 | .El | |
738 | .Pp | |
739 | Regular expression search uses | |
740 | .Xr regex 3 | |
741 | library. | |
742 | Patterns are compiled using the REG_EXTENDED and REG_NOSUB options. | |
743 | .Pp | |
224c7076 A |
744 | Modifiers that change the behavior of these operations |
745 | may also be specified by ORing the modifier value with the operation. | |
3d9156a7 A |
746 | The modifiers are: |
747 | .Pp | |
748 | .Bl -tag -width "ASL_QUERY_OP_SUBSTRING" -compact | |
749 | .It ASL_QUERY_OP_CASEFOLD | |
750 | string comparisons are case-folded | |
751 | .It ASL_QUERY_OP_PREFIX | |
752 | match a leading substring | |
753 | .It ASL_QUERY_OP_SUFFIX | |
754 | match a trailing substring | |
755 | .It ASL_QUERY_OP_SUBSTRING | |
756 | match any substring | |
757 | .It ASL_QUERY_OP_NUMERIC | |
758 | values are converted to integer using | |
759 | .Nm atoi | |
760 | .El | |
761 | .Pp | |
224c7076 A |
762 | The only modifier that is checked |
763 | for ASL_QUERY_OP_REGEX search is ASL_QUERY_OP_CASEFOLD. | |
764 | This causes the regular expression to be compiled | |
765 | with the REG_ICASE option. | |
3d9156a7 A |
766 | .Pp |
767 | If a query message contains more than one set of key/value/operation triples, | |
768 | the result will be a logical AND. For example, to find messages from | |
769 | .Dq MyApp | |
770 | with a priority level less than or equal to | |
771 | .Dq 3 : | |
772 | .Pp | |
773 | aslmsg q; | |
774 | aslresponse r; | |
775 | q = asl_new(ASL_TYPE_QUERY); | |
776 | asl_set_query(q, ASL_KEY_SENDER, "MyApp", ASL_QUERY_OP_EQUAL); | |
777 | asl_set_query(q, ASL_KEY_LEVEL, "3", | |
778 | ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC); | |
779 | r = asl_search(NULL, q); | |
780 | .Pp | |
781 | After calling | |
782 | .Nm asl_search | |
783 | to get an | |
784 | .Ft aslresponse | |
785 | structure, use | |
786 | .Nm aslresponse_next | |
787 | to iterate through all matching messages. | |
788 | To iterate through the keys and values in a message, use | |
789 | .Nm asl_key | |
790 | to iterate through the keys, then call | |
791 | .Nm asl_get | |
792 | to get the value associated with each key. | |
793 | .Pp | |
794 | aslmsg q, m; | |
795 | int i; | |
796 | const char *key, *val; | |
797 | .Pp | |
798 | ... | |
799 | r = asl_search(NULL, q); | |
800 | while (NULL != (m = aslresponse_next(r))) | |
801 | { | |
802 | for (i = 0; (NULL != (key = asl_key(m, i))); i++) | |
803 | { | |
804 | val = asl_get(m, key); | |
805 | ... | |
806 | } | |
807 | } | |
808 | aslresponse_free(r); | |
809 | .Pp | |
810 | .Ss FILTERING AND REMOTE CONTROL | |
811 | Clients may set a filter mask value with | |
812 | .Nm asl_set_filter . | |
813 | The mask specifies which messages should be sent to the | |
814 | .Nm syslogd | |
815 | daemon by specifying a yes/no setting for each priority level. | |
224c7076 A |
816 | Clients typically set a filter mask |
817 | to avoid sending relatively unimportant messages. | |
818 | For example, Debug or Info priority level messages | |
819 | are generally only useful for debugging operations. | |
820 | By setting a filter mask, a process can improve performance | |
821 | by avoiding sending messages that are in most cases unnecessary. | |
822 | .Pp | |
823 | .Nm asl_set_filter returns the previous value of the filter, i.e. the value of the filter before the routine was called. | |
3d9156a7 A |
824 | .Pp |
825 | As a convenience, the macros ASL_FILTER_MASK(level) and ASL_FILTER_MASK_UPTO(level) | |
826 | may be used to construct a bit mask corresponding to a given priority level, | |
224c7076 A |
827 | or corresponding to a bit mask for all priority levels |
828 | from ASL_LEVEL_EMERG to a given input level. | |
3d9156a7 A |
829 | .Pp |
830 | The default filter mask is ASL_FILTER_MASK_UPTO(ASL_LEVEL_NOTICE). | |
224c7076 A |
831 | This means that by default, |
832 | and in the absence of remote-control changes (described below), | |
833 | ASL_LEVEL_DEBUG and ASL_LEVEL_INFO priority level messages | |
834 | are not sent to the | |
3d9156a7 A |
835 | .Mn syslogd |
836 | server. | |
837 | .Pp | |
838 | Three different filters exist for each application. | |
839 | The first is the filter mask set using | |
840 | .Nm asl_set_filter | |
841 | as described above. | |
842 | The Apple System Log facility also manages a | |
843 | .Dq master | |
844 | filter mask. | |
224c7076 A |
845 | The master filter mask usually has a value |
846 | that indicates to the library that it is | |
3d9156a7 A |
847 | .Dq off , |
848 | and thus it has no effect. | |
224c7076 A |
849 | However, the mask filter mask may be enabled |
850 | by giving it a value using the | |
3d9156a7 A |
851 | .Nm syslog |
852 | command, using the | |
853 | .Fl c | |
854 | 0 option. | |
855 | When the master filter mask has been set, | |
856 | it takes precedence over the client's filter mask. | |
224c7076 A |
857 | The client's mask is unmodified, |
858 | and will become active again if remote-control filtering is disabled. | |
3d9156a7 A |
859 | .Pp |
860 | In addition to the master filter mask, | |
224c7076 A |
861 | The Apple System Log facility |
862 | also manages a per-client remote-control filter mask. | |
3d9156a7 A |
863 | Like the master filter mask, the per-client mask is usually |
864 | .Dq off , | |
865 | having no effect on a client. | |
866 | If a per-client filter mask is set using the | |
867 | .Nm syslog | |
868 | command, using the | |
869 | .Fl c Ar process | |
224c7076 A |
870 | option, then it takes precedence |
871 | over both the client's filter mask and the master filter mask. | |
872 | As is the case with the master filter mask, | |
873 | a per-client mask ceases having any effect when if is disabled. | |
3d9156a7 A |
874 | .Pp |
875 | The ASL_OPT_NO_REMOTE option to | |
876 | .Nm asl_open | |
224c7076 A |
877 | causes both the master and per-client remote-control masks |
878 | to be ignored in the library. | |
879 | In that case, only the client's own filter mask | |
880 | is used to determine which messages are sent to the server. | |
881 | This may be useful for Applications that produce log messages | |
882 | that should never be filtered, due to security considerations. | |
883 | Note that root (administrator) access is required | |
884 | to set or change the master filter mask, | |
885 | and that only root may change a per-client remote-control filter mask | |
886 | for a root (UID 0) process. | |
34e8f829 A |
887 | .Pp |
888 | The per-process remote control filter value is kept as a state value | |
889 | associated with a key managed by | |
890 | .Nm notifyd . | |
891 | The key is protected by an access control mechanism that only permits the | |
892 | filter value to be accessed and modified by the same effective UID as the | |
893 | ASL client at the time that the first ASL connection was created. | |
894 | Remote filter control using | |
895 | .Nm syslog Fl c | |
896 | will fail for processes that change effective UID after starting an ASL connection. | |
897 | Those processes should close all ASL client handles and then re-open ASL connections | |
898 | if remote filter control support is desired. | |
3d9156a7 A |
899 | .Sh HISTORY |
900 | These functions first appeared in | |
901 | Mac OS X 10.4. | |
902 | .Sh SEE ALSO | |
224c7076 A |
903 | .Xr syslog 1 , |
904 | .Xr strvis 3 , | |
905 | .Xr syslogd 8 |