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()| +--------+