Logfiles are ordered by their id as follows:

LOGFILE_ERROR   = 1
LOGFILE_MESSAGE = 2
LOGFILE_TRACE   = 4

What is written to file n, will be written to all files m, m>n. Applies to user log writes. Some internal messages are such that they apply to one specific file, such as enable/disable notifications.
This commit is contained in:
vraatikka
2013-08-19 10:28:28 +03:00
parent 97b3da1d79
commit c2743e7543
3 changed files with 104 additions and 52 deletions

View File

@ -176,6 +176,7 @@ static int logmanager_write_log(
logfile_id_t id,
bool flush,
bool use_valist,
bool spread_down,
size_t len,
char* str,
va_list valist);
@ -485,6 +486,9 @@ static logfile_t* logmanager_get_logfile(
* @param use_valist - in, use
* does write involve formatting of the string and use of valist argument
*
* @param spread_down - in, use
* if TRUE, log string is spread to all logs having larger id.
*
* @param str_len - in, use
* length of formatted string
*
@ -504,6 +508,7 @@ static int logmanager_write_log(
logfile_id_t id,
bool flush,
bool use_valist,
bool spread_down,
size_t str_len,
char* str,
va_list valist)
@ -523,7 +528,8 @@ static int logmanager_write_log(
*/
err = logmanager_write_log(LOGFILE_ERROR,
TRUE,
FALSE,
FALSE,
FALSE,
strlen(errstr)+1,
errstr,
valist);
@ -548,35 +554,62 @@ static int logmanager_write_log(
ss_dassert(flush);
logfile_flush(lf); /**< here we wake up file writer */
} else {
int i;
timestamp_len = get_timestamp_len();
/**
* Seek write position and register to block buffer.
* Then print formatted string to write position.
* Write to target log. If spread_down == TRUE, then write also
* to all logs with greater logfile id.
* LOGFILE_ERROR = 1,
* LOGFILE_MESSAGE = 2,
* LOGFILE_TRACE = 4
*
* So everything written to error log will appear in message and
* trace log. Messages will be written in trace log.
*/
wp = blockbuf_get_writepos(&bb, id, timestamp_len-1+str_len, flush);
/**
* Write timestamp with at most <timestamp_len> characters to wp
*/
timestamp_len = snprint_timestamp(wp, timestamp_len);
/**
* Write next string to overwrite terminating null character of the
* timestamp string.
*/
if (use_valist) {
vsnprintf(wp+timestamp_len-1, str_len, str, valist);
} else {
snprintf(wp+timestamp_len-1, str_len, str);
for (i=id; i<=LOGFILE_LAST; i<<=1) {
/**< Check if particular log is enabled */
if (!(lm->lm_enabled_logfiles & i)) {
continue;
}
/**
* Seek write position and register to block buffer.
* Then print formatted string to write position.
*/
wp = blockbuf_get_writepos(&bb,
(logfile_id_t)i,
timestamp_len-1+str_len,
flush);
/**
* Write timestamp with at most <timestamp_len> characters
* to wp
*/
timestamp_len = snprint_timestamp(wp, timestamp_len);
/**
* Write next string to overwrite terminating null character
* of the timestamp string.
*/
if (use_valist) {
vsnprintf(wp+timestamp_len-1, str_len, str, valist);
} else {
snprintf(wp+timestamp_len-1, str_len, str);
}
/** remove double line feed */
if (wp[timestamp_len-1+str_len-2] == '\n') {
wp[timestamp_len-1+str_len-2]=' ';
}
wp[timestamp_len-1+str_len-1]='\n';
/** lock-free unregistration, includes flush if bb_isfull */
blockbuf_unregister(bb);
if (!spread_down) {
break;
}
}
/** remove double line feed */
if (wp[timestamp_len-1+str_len-2] == '\n') {
wp[timestamp_len-1+str_len-2]=' ';
}
wp[timestamp_len-1+str_len-1]='\n';
/** lock-free unregistration, includes flush if bb_isfull */
blockbuf_unregister(bb);
}
return_err:
return err;
}
@ -905,7 +938,8 @@ static bool log_set_enabled(
*/
err = logmanager_write_log(LOGFILE_ERROR,
TRUE,
FALSE,
FALSE,
FALSE,
strlen(errstr)+1,
errstr,
notused);
@ -930,6 +964,7 @@ static bool log_set_enabled(
err = logmanager_write_log(id,
TRUE,
FALSE,
FALSE,
strlen(logstr)+1,
logstr,
notused);
@ -964,12 +999,7 @@ int skygw_log_write_flush(
goto return_err;
}
CHK_LOGMANAGER(lm);
#if 0
ss_dfprintf(stderr,
"skygw_log_write_flush writes to %s :\n\t%s.\n",
STRLOGID(id),
str);
#endif
/**
* If particular log is disabled only unregister and return.
*/
@ -991,16 +1021,14 @@ int skygw_log_write_flush(
* Write log string to buffer and add to file write list.
*/
va_start(valist, str);
err = logmanager_write_log(id, TRUE, TRUE, len, str, valist);
err = logmanager_write_log(id, TRUE, TRUE, TRUE, len, str, valist);
va_end(valist);
if (err != 0) {
fprintf(stderr, "skygw_log_write_flush failed.\n");
goto return_unregister;
}
#if 0
ss_dfprintf(stderr, "skygw_log_write_flush succeeed.\n");
#endif
return_unregister:
logmanager_unregister();
return_err:
@ -1024,12 +1052,7 @@ int skygw_log_write(
goto return_err;
}
CHK_LOGMANAGER(lm);
#if 0
ss_dfprintf(stderr,
"skygw_log_write writes to %s :\n\t%s.\n",
STRLOGID(id),
str);
#endif
/**
* If particular log is disabled only unregister and return.
*/
@ -1051,16 +1074,14 @@ int skygw_log_write(
* Write log string to buffer and add to file write list.
*/
va_start(valist, str);
err = logmanager_write_log(id, FALSE, TRUE, len, str, valist);
err = logmanager_write_log(id, FALSE, TRUE, TRUE, len, str, valist);
va_end(valist);
if (err != 0) {
fprintf(stderr, "skygw_log_write failed.\n");
goto return_unregister;
}
#if 0
ss_dfprintf(stderr, "skygw_log_write succeeed.\n");
#endif
return_unregister:
logmanager_unregister();
return_err:
@ -1080,7 +1101,7 @@ int skygw_log_flush(
goto return_err;
}
CHK_LOGMANAGER(lm);
err = logmanager_write_log(id, TRUE, FALSE, 0, NULL, valist);
err = logmanager_write_log(id, TRUE, FALSE, FALSE, 0, NULL, valist);
if (err != 0) {
fprintf(stderr, "skygw_log_flush failed.\n");

View File

@ -23,11 +23,11 @@ typedef struct fnames_conf_st fnames_conf_t;
typedef struct logmanager_st logmanager_t;
typedef enum {
LOGFILE_TRACE = 1,
LOGFILE_FIRST = LOGFILE_TRACE,
LOGFILE_ERROR = 1,
LOGFILE_FIRST = LOGFILE_ERROR,
LOGFILE_MESSAGE = 2,
LOGFILE_ERROR = 4,
LOGFILE_LAST = LOGFILE_ERROR
LOGFILE_TRACE = 4,
LOGFILE_LAST = LOGFILE_TRACE
} logfile_id_t;
typedef enum { FILEWRITER_INIT, FILEWRITER_RUN, FILEWRITER_DONE }

View File

@ -40,12 +40,14 @@ static void* thr_run_morelog(void* data);
#define NTHR 256
#define NITER 100
#if 0
#define TEST1
#if 0
#define TEST2
#endif
#define TEST3
#define TEST4
int main(int argc, char* argv[])
{
@ -299,7 +301,36 @@ int main(int argc, char* argv[])
skygw_logmanager_done();
#endif /* TEST 3 */
#if defined(TEST4)
r = skygw_logmanager_init(argc, argv);
ss_dassert(r);
logstr = ("1.\tWrite to ERROR and thus also to MESSAGE and TRACE logs.");
err = skygw_log_write(LOGFILE_ERROR, logstr);
ss_dassert(err == 0);
logstr = ("1.\tWrite to MESSAGE and thus to TRACE logs.");
err = skygw_log_write(LOGFILE_MESSAGE, logstr);
ss_dassert(err == 0);
logstr = ("1.\tWrite to TRACE log only.");
err = skygw_log_write(LOGFILE_TRACE, logstr);
ss_dassert(err == 0);
skygw_log_disable(LOGFILE_MESSAGE);
logstr = ("1.\tWrite to ERROR and thus also to TRACE log. MESSAGE is disabled");
err = skygw_log_write(LOGFILE_ERROR, logstr);
ss_dassert(err == 0);
logstr = ("1.\tThis should not appear anywhere since MESSAGE is disabled.");
err = skygw_log_write(LOGFILE_MESSAGE, logstr);
ss_dassert(err != 0);
skygw_logmanager_done();
#endif /* TEST 4 */
fprintf(stderr, ".. done.\n");
return err;
}