aboutsummaryrefslogblamecommitdiffstats
path: root/README
blob: c95480e4c37404bb979699c6eec03ac35ce2cfbc (plain) (tree)




























































































































































































































                                                                             
This is an implementation of syslog daemon and client for native win32.
This stuff is dedicated to those who is writing portable software or
porting unix software to native win32.

COMPILING
---------

You need Glib to compile this stuff.

Compiling from CVS:

Run autogen.sh. I used automake 1.8.5, autoconf 2.59 and libtool 1.5.10.
With earlier versions it may not work because some command line options
aren't supported.
Then use configure script as described below.

Compiling from source tarball:

Just use configure && make.
Option --enable-relocatable affects the location of configuration directory:
if specified, sysconfdir is prepended with '.'.
For example, if you run ./configure --sysconfdir=/etc --enable-relocateble
then syslogd.exe and client will read their configuration file from etc
subdirectory located in the same directory with executable file.

Building binary distribution:

Use build.sh. It does all you need.
You should have some packages -- look into the script to see which ones.
Also, you should have Inno Setup (http://www.jrsoftware.org) with ISPP
installed on your system.

  on unix:

You should have cross compiler and Wine installed. Wine is required to run
Inno Setup Compiler and the directory in which you are going to build should
be accessible via some drive letter.
Assuming target triplet is i686-pc-mingw32, iscc is in its default directory
"c:\program files\inno setup 5" and required packages are in "./distfiles":

DISTFILES=distfiles \
ISCC=c:\\program\ files\\inno\ setup\ 5\\iscc.exe \
HOST=i686-pc-mingw32 \
./build.sh

  on windows:

I noticed that Msys has troubles running some native command-line
applications. So you'll have to run Inno Setup by hand.

DISTFILES=<path to the directory with packages> \
./build.sh


CONFIGURATION
-------------

The configuration file for client is optional. Its name is syslog.host
and it should contain host name or address optionally followed by the
colon and the port number. By default, port is 514.
This may look a bit ugly but if you have a better idea, send me a patch.
But keep in mind that client should not have any dependencies like daemon.

The configuration file for daemon has XML format. It is not intended to be
convinient for human because should be generated by GUI configuration tool.
The root element is 'conf'.
+-------------+-----------+-------------------------------------------------+
| Element     | Attribute | Description                                     |
+=============+===========+=================================================+
| source      | name      | The name of message source.                     |
|             | type      | There are two source types: 'internal' and      |
|             |           | 'udp'. Internal type corresponds to syslogd     |
|             |           | itself and 'udp' defines a listening UDP socket.|
|             | interface | Optional. If source type is udp, it defines     |
|             |           | interface the socket will be bound to. Default  |
|             |           | is 0.0.0.0.                                     |
|             | port      | Optional. If source type is udp, it defines     |
|             |           | listening port number. Default is 514.          |
+-------------+-----------+-------------------------------------------------+
| destination | name      | The name of the destination.                    |
|             | file      | The pattern for the file name. See below.       |
|             | rotate    | daily/weekly/monthly                            |
|             | size      | Log files are rotated when they grow bigger     |
|             |           | then size bytes. If size is followed by M, the  |
|             |           | size if assumed to be in megabytes. If the k is |
|             |           | used, the size is in kilobytes. So size  100,   |
|             |           | size 100k, and size 100M are all valid.         |
|             | backlogs  | Number of backlog files.                        |
|             | ifempty   | yes/no: rotate the log file even if it is       |
|             |           | empty; default is yes.                          |
|             | olddir    | Logs are moved to this directory for rotation.  |
|             |           | If value is a relative path then this directory |
|             |           | will be located in the same	directory with      |
|             |           | syslogd executable.                             |
|             | compresscmd Command (with options) to use to compress log   |
|             |           | file.                                           |
|             | compressoptions  Command line options may be passed to the  |
|             |           | compression program, if one is in use. Options  |
|             |           | may contain $PATHNAME and $FILENAME substrings  |
|             |           | which will be replaced with backlog pathname    |
|             |           | basename respectively.                          |
+-------------+-----------+-------------------------------------------------+
| filter      | name      | The name of the filter.                         |
|             |           | This element has a set of sub-elements          |
|             |           | 'facility' and 'priority'. Each of them defines |
|             |           | one value with attribute 'value' in numeric     |
|             |           | form or 'name' in verbose form.                 |
+-------------+-----------+-------------------------------------------------+
| logpath     | source    | The name of the source.                         |
|             | filter    | Optional. The name of the filter.               |
|             | destination The name of the destination.                    |
+-------------+-----------+-------------------------------------------------+
| purge       | directory | Directory to purge. Must be a relative path     |
|             |           | inside logdir (see configuration options below) |
|             | keep_days | How long to keep files.                         |
+-------------+-----------+-------------------------------------------------+
| options     | See below |                                                 |
+-------------+-----------+-------------------------------------------------+

Format characters for the file name pattern:

	%Y	four-digit year
	%M	two-digit month, 01...12
	%m	month, 1...12
	%D	two-digit day of month, 01...31
	%d	day of month, 1...31
	%W	day of week, 1...7, 1 for sunday
	%F	facility name
	%f	facility in numeric form
	%L	priority level name
	%l	priority level in numeric form
	%H	source host name (a 'device', according to RFC3164)
	%h	sender host name (datagram sender, which may be device
		or relay)
	%P	program name
	%%      % character

Attributes for the element 'options':

        logdir          directory for the log files; if value is a relative
        		path then this directory will be located in the same
        		directory where syslogd executable is.

	dns		yes/no: use resolver to determine sender host name;
			default is yes.

	source_encoding	convert incoming messages from specified encoding
			to 'destination_encoding'; do not convert by default.

	destination_encoding	see 'source_encoding'

	mark_interval	interval in second between emissions of mark message;
			0 means do not emit mark messages, this is the
			default value.

	mark_message	content of mark message; "-- MARK --" by default.

	hold		number of seconds to hold a single message in queue;
			minimum is 1, default is 3 seconds.
			During this time identical messages are coalesced.


IMPLEMENTATION
--------------

There are three basic parts of daemon: 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 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 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 usedns 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.


+--------+ raw message +-----+    +------+ message +-----------------+
|listener|------------>|queue|--->|parser|-------->|charset converter|--->
+--------+             +-----+    +------+         +-----------------+

    +------+    +-----------+    +-----------+
--->|filter|--->|multiplexer|-+->|destination|+
    +------+    +-----------+ +->+-----------+|+
                      ^       +-> +-----------+|
                      |            +-----------+
                  +-------+
                  |logpath|+
                  +-------+|+
                   +-------+|
                    +-------+


                +-----------+    +-----+        +--------------+
destination: >--|multiplexer|-+->|queue|+  ---> |writing thread|+
                +-----------+ +->+-----+|+ ---> +--------------+|+
                      ^       +-> +-----+| --->  +--------------+|
                      |            +-----+        +--------------+
              +----------------+
              |filename pattern|
              +----------------+