There are three basic parts of daemon: UDP listener, message processor and
message writer.
All these parts run in separate threads:
the listener receives messages as fast as possible and passes them to the
message processor,
the message processor performs time-consuming tasks and
message writer performs asynchronous output to files.
Datagrams are received by the UDP listener.
The listener emits raw messages (struct raw_message) which contain content
of datagram, sender address and reference to a source described
in configuration file.
Raw messages are passed to the main processing thread via queue.
Message processing involves the following tasks:
parse datagram:
pick out PRI, TIMESTAMP, HOSTNAME, TAG an CONTENT according to
RFC 3164;
convert CONTENT's encoding if specified;
determine sender host name if option is set or just
convert IP address to string;
the result is saved in hostname cache to speed up subsequent resolutions;
multiplex message to logpaths and apply filters in logpaths;
in other words, messages are multiplexed to logpaths through filters;
messages in logpaths are represented with references to message structure
and message structure contains reference count;
Because destination file name may be a pattern, further multiplexing is
performed. Messages with similar HOSTNAME, TAG and CONTENT are coalesced.
Log rotation is initiated at process startup or at writing thread startup.
Old log files are deleted by the purger which is launched at process startup
or by the writing thread after file is closed.
mark message
+-------------------------------------------------+
| |
| +----------------+ +-----+ message +--------------+
+--->|internal sources|--->|queue|-------->| - - - - - |
| (log_internal) | +-----+ | \ |
+----------------+ | main loop \ |
| \| message
+------------+ raw message +-----+ | +------+ /|--------->
|UDP listener|------------>|queue|-------->|-|parser|- - |
+------------+ +-----+ | +------+ |
+--------------+
+------+ +-----------------+ +-----------+
--->|filter|--->| multiplexer |-+->|destination|+
| | |charset converter| | | ||
+------+ +-----------------+ +->+-----------+|+
^ +-> +-----------+|
| +-----------+
+-------+
|logpath|+
+-------+|+
+-------+|
+-------+
file +-----------+ +-----+ +--------------+
destination: >--|multiplexer|-+->|queue|+ ---> |writing thread|+
+-----------+ +->+-----+|+ ---> +--------------+|+
^ +-> +-----+| ---> +--------------+|
| +-----+ +--------------+
+----------------+
|filename pattern|
+----------------+
relay +--------+
destination: >--|sendto()|
+--------+