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:
@ -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");
|
||||
|
@ -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 }
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user