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,
|
logfile_id_t id,
|
||||||
bool flush,
|
bool flush,
|
||||||
bool use_valist,
|
bool use_valist,
|
||||||
|
bool spread_down,
|
||||||
size_t len,
|
size_t len,
|
||||||
char* str,
|
char* str,
|
||||||
va_list valist);
|
va_list valist);
|
||||||
@ -485,6 +486,9 @@ static logfile_t* logmanager_get_logfile(
|
|||||||
* @param use_valist - in, use
|
* @param use_valist - in, use
|
||||||
* does write involve formatting of the string and use of valist argument
|
* 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
|
* @param str_len - in, use
|
||||||
* length of formatted string
|
* length of formatted string
|
||||||
*
|
*
|
||||||
@ -504,6 +508,7 @@ static int logmanager_write_log(
|
|||||||
logfile_id_t id,
|
logfile_id_t id,
|
||||||
bool flush,
|
bool flush,
|
||||||
bool use_valist,
|
bool use_valist,
|
||||||
|
bool spread_down,
|
||||||
size_t str_len,
|
size_t str_len,
|
||||||
char* str,
|
char* str,
|
||||||
va_list valist)
|
va_list valist)
|
||||||
@ -523,7 +528,8 @@ static int logmanager_write_log(
|
|||||||
*/
|
*/
|
||||||
err = logmanager_write_log(LOGFILE_ERROR,
|
err = logmanager_write_log(LOGFILE_ERROR,
|
||||||
TRUE,
|
TRUE,
|
||||||
FALSE,
|
FALSE,
|
||||||
|
FALSE,
|
||||||
strlen(errstr)+1,
|
strlen(errstr)+1,
|
||||||
errstr,
|
errstr,
|
||||||
valist);
|
valist);
|
||||||
@ -548,35 +554,62 @@ static int logmanager_write_log(
|
|||||||
ss_dassert(flush);
|
ss_dassert(flush);
|
||||||
logfile_flush(lf); /**< here we wake up file writer */
|
logfile_flush(lf); /**< here we wake up file writer */
|
||||||
} else {
|
} else {
|
||||||
|
int i;
|
||||||
|
|
||||||
timestamp_len = get_timestamp_len();
|
timestamp_len = get_timestamp_len();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Seek write position and register to block buffer.
|
* Write to target log. If spread_down == TRUE, then write also
|
||||||
* Then print formatted string to write position.
|
* 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);
|
for (i=id; i<=LOGFILE_LAST; i<<=1) {
|
||||||
/**
|
/**< Check if particular log is enabled */
|
||||||
* Write timestamp with at most <timestamp_len> characters to wp
|
if (!(lm->lm_enabled_logfiles & i)) {
|
||||||
*/
|
continue;
|
||||||
timestamp_len = snprint_timestamp(wp, timestamp_len);
|
}
|
||||||
/**
|
/**
|
||||||
* Write next string to overwrite terminating null character of the
|
* Seek write position and register to block buffer.
|
||||||
* timestamp string.
|
* Then print formatted string to write position.
|
||||||
*/
|
*/
|
||||||
if (use_valist) {
|
wp = blockbuf_get_writepos(&bb,
|
||||||
vsnprintf(wp+timestamp_len-1, str_len, str, valist);
|
(logfile_id_t)i,
|
||||||
} else {
|
timestamp_len-1+str_len,
|
||||||
snprintf(wp+timestamp_len-1, str_len, str);
|
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:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -905,7 +938,8 @@ static bool log_set_enabled(
|
|||||||
*/
|
*/
|
||||||
err = logmanager_write_log(LOGFILE_ERROR,
|
err = logmanager_write_log(LOGFILE_ERROR,
|
||||||
TRUE,
|
TRUE,
|
||||||
FALSE,
|
FALSE,
|
||||||
|
FALSE,
|
||||||
strlen(errstr)+1,
|
strlen(errstr)+1,
|
||||||
errstr,
|
errstr,
|
||||||
notused);
|
notused);
|
||||||
@ -930,6 +964,7 @@ static bool log_set_enabled(
|
|||||||
err = logmanager_write_log(id,
|
err = logmanager_write_log(id,
|
||||||
TRUE,
|
TRUE,
|
||||||
FALSE,
|
FALSE,
|
||||||
|
FALSE,
|
||||||
strlen(logstr)+1,
|
strlen(logstr)+1,
|
||||||
logstr,
|
logstr,
|
||||||
notused);
|
notused);
|
||||||
@ -964,12 +999,7 @@ int skygw_log_write_flush(
|
|||||||
goto return_err;
|
goto return_err;
|
||||||
}
|
}
|
||||||
CHK_LOGMANAGER(lm);
|
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.
|
* 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.
|
* Write log string to buffer and add to file write list.
|
||||||
*/
|
*/
|
||||||
va_start(valist, str);
|
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);
|
va_end(valist);
|
||||||
|
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
fprintf(stderr, "skygw_log_write_flush failed.\n");
|
fprintf(stderr, "skygw_log_write_flush failed.\n");
|
||||||
goto return_unregister;
|
goto return_unregister;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
ss_dfprintf(stderr, "skygw_log_write_flush succeeed.\n");
|
|
||||||
#endif
|
|
||||||
return_unregister:
|
return_unregister:
|
||||||
logmanager_unregister();
|
logmanager_unregister();
|
||||||
return_err:
|
return_err:
|
||||||
@ -1024,12 +1052,7 @@ int skygw_log_write(
|
|||||||
goto return_err;
|
goto return_err;
|
||||||
}
|
}
|
||||||
CHK_LOGMANAGER(lm);
|
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.
|
* 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.
|
* Write log string to buffer and add to file write list.
|
||||||
*/
|
*/
|
||||||
va_start(valist, str);
|
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);
|
va_end(valist);
|
||||||
|
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
fprintf(stderr, "skygw_log_write failed.\n");
|
fprintf(stderr, "skygw_log_write failed.\n");
|
||||||
goto return_unregister;
|
goto return_unregister;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
ss_dfprintf(stderr, "skygw_log_write succeeed.\n");
|
|
||||||
#endif
|
|
||||||
return_unregister:
|
return_unregister:
|
||||||
logmanager_unregister();
|
logmanager_unregister();
|
||||||
return_err:
|
return_err:
|
||||||
@ -1080,7 +1101,7 @@ int skygw_log_flush(
|
|||||||
goto return_err;
|
goto return_err;
|
||||||
}
|
}
|
||||||
CHK_LOGMANAGER(lm);
|
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) {
|
if (err != 0) {
|
||||||
fprintf(stderr, "skygw_log_flush failed.\n");
|
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 struct logmanager_st logmanager_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
LOGFILE_TRACE = 1,
|
LOGFILE_ERROR = 1,
|
||||||
LOGFILE_FIRST = LOGFILE_TRACE,
|
LOGFILE_FIRST = LOGFILE_ERROR,
|
||||||
LOGFILE_MESSAGE = 2,
|
LOGFILE_MESSAGE = 2,
|
||||||
LOGFILE_ERROR = 4,
|
LOGFILE_TRACE = 4,
|
||||||
LOGFILE_LAST = LOGFILE_ERROR
|
LOGFILE_LAST = LOGFILE_TRACE
|
||||||
} logfile_id_t;
|
} logfile_id_t;
|
||||||
|
|
||||||
typedef enum { FILEWRITER_INIT, FILEWRITER_RUN, FILEWRITER_DONE }
|
typedef enum { FILEWRITER_INIT, FILEWRITER_RUN, FILEWRITER_DONE }
|
||||||
|
@ -40,12 +40,14 @@ static void* thr_run_morelog(void* data);
|
|||||||
#define NTHR 256
|
#define NTHR 256
|
||||||
#define NITER 100
|
#define NITER 100
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define TEST1
|
#define TEST1
|
||||||
|
#if 0
|
||||||
#define TEST2
|
#define TEST2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEST3
|
#define TEST3
|
||||||
|
#define TEST4
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
@ -299,7 +301,36 @@ int main(int argc, char* argv[])
|
|||||||
skygw_logmanager_done();
|
skygw_logmanager_done();
|
||||||
|
|
||||||
#endif /* TEST 3 */
|
#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");
|
fprintf(stderr, ".. done.\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user