The previous interface of skygw_logmanager_init was conceptually
broken. With -o you could specify that logging should be done to
stdout. However, even if you did that, the log manager still checked
that the logging directory could be accessed. Unless it had been
specified using -j <path> the default was /var/log/maxscale.
That is, unless the program calling skygw_logmanager_init was invoked
by a user that had write access to /var/log/maxscale, there would be
a complaint even if nothing was ever written to that directory.
In practice this meant that even if -o was used you had to provide
a -j with a path that surely is writeable (e.g. "/tmp").
This has now been changed so that you explicitly must provide the
log directory and the flags -j and -o are removed.
bool skygw_logmanager_init(const char* logdir, int argc, char* argv[]);
If /logdir/ is provided then logged messages are written to a log file
in that directory. If /logdir/ is NULL then messages are logged to stdout
and no checks for access to any directory is not made.
The log manager possibility for explicitly specifying the names
of the log files has never been used. In the name of simplicity
that functionality is removed.
Some log manager refactoring to make it easier to later remove
all files but the error log.
Basically all that was done was to move everything inside the
for-loop of thr_filewriter_fun into a separate function called
thr_flush_file. Otherwise no changes in functionality was made.
logmanager_write_log did three different things - logged a message,
flushed a file and rotated a file - none of which were performed
in one go. Hence there's no reason to do all those things in that
function.
Another step on the road of log manager modifications.
- All messages are now logged to error.log. The other files are
still created but not used anymore.
- A severity prefix is added, to distinguish between messages logged
to "different" files:
LOGFILE_ERROR => "[Error]: "
LOGFILE_MESSAGE => "[Notice]: "
LOGFILE_TRACE => "[Info]: "
LOGFILE_DEBUG => "[Debug] "
That prefix is not written to syslog.
- When maxscale is built in debug mode, trace and debug messages
are no longer enabled by default.
Next step is to remove the other files entirelly.
Valist is handled before logmanager_write_log is called. So it
is quite unnecessary to always having to pass a valist whether
it is used or not (and not it is never used).
Augmentation moved to skygw_log_write_context. The severity prefix
will be added there as well. If all is done on that level, the
amount of memory needed can be figured out in one go. No need to
allocate and copy the message several times.
Straightforward indentation and whitespace modifications.
This is the first one in a series of commits that will bring
log manager in line with the coding style.
The log manager is initialized only once and skygw_log_sync_all now checks if the log manager has been successfully started before interacting with the log manager
Log message augmentation (appending of function name) can now
be enabled or disabled via the configuration file and command
line.
By default, the augmentation is disabled.
This change does not log the file name and line numbers,
but the function name. Together with the commit information
that is logged in conjunction with a crash and that MaxScale
can tell, when invoked, that is enough to be able to pinpoint
the location where a logging was made. Furthermore, that is
a lot less intrusive and less confusing for an
end-user than filename + line.
This is just a temporary workaround; the logging mechanism
needs to get an overhaul:
- Separate severity and logging target.
- Take syslog severities into use.
- Simplify what needs to be done by developer.
- etc.