change the logging function to support priority masking
This commit is contained in:
parent
cdc64c347f
commit
c5ac9558ab
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICAR PURPOSE ARE DISCLAIMED.
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
@ -37,64 +37,65 @@
|
|||||||
/* TODO: improve this and complete win32 portion */
|
/* TODO: improve this and complete win32 portion */
|
||||||
#define QSE_LOG_IDENT_MAX 32
|
#define QSE_LOG_IDENT_MAX 32
|
||||||
|
|
||||||
#define QSE_LOG_MASK_PRIORITY 0x00000FFFUL
|
#define QSE_LOG_PRIORITY_LEN_MAX 64
|
||||||
#define QSE_LOG_MASK_OPTION 0x000FF000UL
|
|
||||||
#define QSE_LOG_MASK_TARGET 0xFFF00000UL
|
#define QSE_LOG_MASK_PRIORITY 0x000000FF /* bit 0 to 7 */
|
||||||
|
/* bit 8 to 11 unused */
|
||||||
|
#define QSE_LOG_MASK_OPTION 0x000FF000 /* bit 12 to 19 */
|
||||||
|
#define QSE_LOG_MASK_TARGET 0xFFF00000 /* bit 20 to 31 */
|
||||||
|
|
||||||
|
|
||||||
/* priority */
|
/* priority */
|
||||||
#define QSE_LOG_PANIC 0x0000UL
|
#define QSE_LOG_PANIC (1 << 0)
|
||||||
#define QSE_LOG_ALERT 0x0001UL
|
#define QSE_LOG_ALERT (1 << 1)
|
||||||
#define QSE_LOG_CRITICAL 0x0002UL
|
#define QSE_LOG_CRITICAL (1 << 2)
|
||||||
#define QSE_LOG_ERROR 0x0003UL
|
#define QSE_LOG_ERROR (1 << 3)
|
||||||
#define QSE_LOG_WARNING 0x0004UL
|
#define QSE_LOG_WARNING (1 << 4)
|
||||||
#define QSE_LOG_NOTICE 0x0005UL
|
#define QSE_LOG_NOTICE (1 << 5)
|
||||||
#define QSE_LOG_INFO 0x0006UL
|
#define QSE_LOG_INFO (1 << 6)
|
||||||
#define QSE_LOG_DEBUG 0x0007UL
|
#define QSE_LOG_DEBUG (1 << 7)
|
||||||
|
|
||||||
/* options */
|
/* options */
|
||||||
#define QSE_LOG_KEEP_FILE_OPEN (1UL << 13)
|
#define QSE_LOG_KEEP_FILE_OPEN (1 << 13)
|
||||||
#define QSE_LOG_ENABLE_MASKED (1UL << 14)
|
#define QSE_LOG_MASKED_PRIORITY (1 << 14)
|
||||||
#define QSE_LOG_INCLUDE_PID (1UL << 15)
|
#define QSE_LOG_INCLUDE_PID (1 << 15)
|
||||||
#define QSE_LOG_HOST_IN_REMOTE_SYSLOG (1UL << 16)
|
#define QSE_LOG_HOST_IN_REMOTE_SYSLOG (1 << 16)
|
||||||
|
|
||||||
/* target */
|
/* target */
|
||||||
#define QSE_LOG_CONSOLE (1UL << 20)
|
#define QSE_LOG_CONSOLE (1 << 20)
|
||||||
#define QSE_LOG_FILE (1UL << 21)
|
#define QSE_LOG_FILE (1 << 21)
|
||||||
#define QSE_LOG_SYSLOG (1UL << 22)
|
#define QSE_LOG_SYSLOG (1 << 22)
|
||||||
#define QSE_LOG_SYSLOG_REMOTE (1UL << 23)
|
#define QSE_LOG_SYSLOG_REMOTE (1 << 23)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* facility */
|
/* facility */
|
||||||
enum qse_log_facility_t
|
enum qse_log_facility_t
|
||||||
{
|
{
|
||||||
QSE_LOG_KERN = (0<<3), /* kernel messages */
|
QSE_LOG_KERN = (0 << 3), /* kernel messages */
|
||||||
QSE_LOG_USER = (1<<3), /* random user-level messages */
|
QSE_LOG_USER = (1 << 3), /* random user-level messages */
|
||||||
QSE_LOG_MAIL = (2<<3), /* mail system */
|
QSE_LOG_MAIL = (2 << 3), /* mail system */
|
||||||
QSE_LOG_DAEMON = (3<<3), /* system daemons */
|
QSE_LOG_DAEMON = (3 << 3), /* system daemons */
|
||||||
QSE_LOG_AUTH = (4<<3), /* security/authorization messages */
|
QSE_LOG_AUTH = (4 << 3), /* security/authorization messages */
|
||||||
QSE_LOG_SYSLOGD = (5<<3), /* messages from syslogd */
|
QSE_LOG_SYSLOGD = (5 << 3), /* messages from syslogd */
|
||||||
QSE_LOG_LPR = (6<<3), /* line printer subsystem */
|
QSE_LOG_LPR = (6 << 3), /* line printer subsystem */
|
||||||
QSE_LOG_NEWS = (7<<3), /* network news subsystem */
|
QSE_LOG_NEWS = (7 << 3), /* network news subsystem */
|
||||||
QSE_LOG_UUCP = (8<<3), /* UUCP subsystem */
|
QSE_LOG_UUCP = (8 << 3), /* UUCP subsystem */
|
||||||
QSE_LOG_CRON = (9<<3), /* clock daemon */
|
QSE_LOG_CRON = (9 << 3), /* clock daemon */
|
||||||
QSE_LOG_AUTHPRIV = (10<<3), /* authorization messages (private) */
|
QSE_LOG_AUTHPRIV = (10 << 3), /* authorization messages (private) */
|
||||||
QSE_LOG_FTP = (11<<3), /* ftp daemon */
|
QSE_LOG_FTP = (11 << 3), /* ftp daemon */
|
||||||
QSE_LOG_LOCAL0 = (16<<3), /* reserved for local use */
|
QSE_LOG_LOCAL0 = (16 << 3), /* reserved for local use */
|
||||||
QSE_LOG_LOCAL1 = (17<<3), /* reserved for local use */
|
QSE_LOG_LOCAL1 = (17 << 3), /* reserved for local use */
|
||||||
QSE_LOG_LOCAL2 = (18<<3), /* reserved for local use */
|
QSE_LOG_LOCAL2 = (18 << 3), /* reserved for local use */
|
||||||
QSE_LOG_LOCAL3 = (19<<3), /* reserved for local use */
|
QSE_LOG_LOCAL3 = (19 << 3), /* reserved for local use */
|
||||||
QSE_LOG_LOCAL4 = (20<<3), /* reserved for local use */
|
QSE_LOG_LOCAL4 = (20 << 3), /* reserved for local use */
|
||||||
QSE_LOG_LOCAL5 = (21<<3), /* reserved for local use */
|
QSE_LOG_LOCAL5 = (21 << 3), /* reserved for local use */
|
||||||
QSE_LOG_LOCAL6 = (22<<3), /* reserved for local use */
|
QSE_LOG_LOCAL6 = (22 << 3), /* reserved for local use */
|
||||||
QSE_LOG_LOCAL7 = (23<<3) /* reserved for local use */
|
QSE_LOG_LOCAL7 = (23 << 3) /* reserved for local use */
|
||||||
};
|
};
|
||||||
typedef enum qse_log_facility_t qse_log_facility_t;
|
typedef enum qse_log_facility_t qse_log_facility_t;
|
||||||
|
|
||||||
|
#define QSE_LOG_ENABLED(log,pri) ((pri) & (log)->active_priority_bits)
|
||||||
/* TODO: support ENABLE_MASKED??? */
|
|
||||||
#define QSE_LOG_ENABLED(log,pri) ((pri) <= ((log)->flags & QSE_LOG_MASK_PRIORITY))
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
||||||
#define QSE_LOG(log,ident,pri,...) \
|
#define QSE_LOG(log,ident,pri,...) \
|
||||||
@ -233,6 +234,8 @@ struct qse_log_t
|
|||||||
#endif
|
#endif
|
||||||
qse_mtx_t mtx;
|
qse_mtx_t mtx;
|
||||||
|
|
||||||
|
int active_priority_bits;
|
||||||
|
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
qse_log_facility_t syslog_facility;
|
qse_log_facility_t syslog_facility;
|
||||||
#endif
|
#endif
|
||||||
@ -298,21 +301,11 @@ QSE_EXPORT void qse_log_setpriority (
|
|||||||
int priority
|
int priority
|
||||||
);
|
);
|
||||||
|
|
||||||
QSE_EXPORT int qse_log_setprioritybyname (
|
|
||||||
qse_log_t* log,
|
|
||||||
const qse_char_t* name
|
|
||||||
);
|
|
||||||
|
|
||||||
QSE_EXPORT void qse_log_setsyslogfacility (
|
QSE_EXPORT void qse_log_setsyslogfacility (
|
||||||
qse_log_t* log,
|
qse_log_t* log,
|
||||||
qse_log_facility_t facility
|
qse_log_facility_t facility
|
||||||
);
|
);
|
||||||
|
|
||||||
QSE_EXPORT int qse_log_setsyslogfacilitybyname (
|
|
||||||
qse_log_t* log,
|
|
||||||
const qse_char_t* name
|
|
||||||
);
|
|
||||||
|
|
||||||
#if defined(QSE_HAVE_INLINE)
|
#if defined(QSE_HAVE_INLINE)
|
||||||
static QSE_INLINE int qse_log_getpriority (qse_log_t* log)
|
static QSE_INLINE int qse_log_getpriority (qse_log_t* log)
|
||||||
{
|
{
|
||||||
@ -322,10 +315,6 @@ static QSE_INLINE int qse_log_getpriority (qse_log_t* log)
|
|||||||
#define qse_log_getpriority(log) ((log)->flags & QSE_LOG_MASK_PRIORITY)
|
#define qse_log_getpriority(log) ((log)->flags & QSE_LOG_MASK_PRIORITY)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const qse_char_t* qse_log_getpriorityname (
|
|
||||||
qse_log_t* log
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
QSE_EXPORT void qse_log_report (
|
QSE_EXPORT void qse_log_report (
|
||||||
qse_log_t* log,
|
qse_log_t* log,
|
||||||
@ -343,8 +332,23 @@ QSE_EXPORT void qse_log_reportv (
|
|||||||
va_list ap
|
va_list ap
|
||||||
);
|
);
|
||||||
|
|
||||||
QSE_EXPORT const qse_char_t* qse_get_log_priority_name (
|
QSE_EXPORT qse_size_t qse_get_log_priority_name (
|
||||||
int pri
|
int pri,
|
||||||
|
qse_char_t* buf,
|
||||||
|
qse_size_t len /* length of the buffer, QSE_LOG_PRIORITY_LEN_MAX + 1 is enough */
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \return an integer bitwised-ORed of priority bits if \a name is valid.
|
||||||
|
* 0 if \a name is invalid or empty.
|
||||||
|
*/
|
||||||
|
QSE_EXPORT int qse_get_log_priority_by_name (
|
||||||
|
const qse_char_t* name
|
||||||
|
);
|
||||||
|
|
||||||
|
QSE_EXPORT int qse_get_log_facility_by_name (
|
||||||
|
const qse_char_t* name,
|
||||||
|
qse_log_facility_t* fcode
|
||||||
);
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
249
qse/lib/si/log.c
249
qse/lib/si/log.c
@ -41,18 +41,6 @@
|
|||||||
#include "../cmn/syscall.h"
|
#include "../cmn/syscall.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const qse_char_t* __priority_names[] =
|
|
||||||
{
|
|
||||||
QSE_T("panic"),
|
|
||||||
QSE_T("alert"),
|
|
||||||
QSE_T("critical"),
|
|
||||||
QSE_T("error"),
|
|
||||||
QSE_T("warning"),
|
|
||||||
QSE_T("notice"),
|
|
||||||
QSE_T("info"),
|
|
||||||
QSE_T("debug")
|
|
||||||
};
|
|
||||||
|
|
||||||
static const qse_mchar_t* __syslog_month_names[] =
|
static const qse_mchar_t* __syslog_month_names[] =
|
||||||
{
|
{
|
||||||
QSE_MT("Jan"),
|
QSE_MT("Jan"),
|
||||||
@ -94,16 +82,48 @@ static const qse_mchar_t* __syslog_month_names[] =
|
|||||||
# define LOG_DEBUG 7
|
# define LOG_DEBUG 7
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int __syslog_priority[] =
|
/* use a simple look-up table for mapping a priority to a syslog value.
|
||||||
|
* i assume it's faster than getting the position of the first lowest bit set
|
||||||
|
* and use a smaller and dense table without gap-filling 0s. */
|
||||||
|
static int __syslog_priority[256] =
|
||||||
{
|
{
|
||||||
LOG_EMERG,
|
0,
|
||||||
LOG_ALERT,
|
LOG_EMERG, /* 1 */
|
||||||
LOG_CRIT,
|
LOG_ALERT, /* 2 */
|
||||||
LOG_ERR,
|
0,
|
||||||
LOG_WARNING,
|
LOG_CRIT, /* 4 */
|
||||||
LOG_NOTICE,
|
0, 0, 0,
|
||||||
LOG_INFO,
|
LOG_ERR, /* 8 */
|
||||||
LOG_DEBUG
|
0, 0, 0, 0, 0, 0, 0,
|
||||||
|
LOG_WARNING, /* 16 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
LOG_NOTICE, /* 32 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0,
|
||||||
|
LOG_INFO, /* 64 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
LOG_DEBUG, /* 128 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
@ -137,12 +157,45 @@ static struct syslog_fac_info_t __syslog_fac_info[] =
|
|||||||
{ QSE_T("local4"), QSE_LOG_LOCAL4 },
|
{ QSE_T("local4"), QSE_LOG_LOCAL4 },
|
||||||
{ QSE_T("local5"), QSE_LOG_LOCAL5 },
|
{ QSE_T("local5"), QSE_LOG_LOCAL5 },
|
||||||
{ QSE_T("local6"), QSE_LOG_LOCAL6 },
|
{ QSE_T("local6"), QSE_LOG_LOCAL6 },
|
||||||
{ QSE_T("local7"), QSE_LOG_LOCAL7 },
|
{ QSE_T("local7"), QSE_LOG_LOCAL7 }
|
||||||
|
|
||||||
{ QSE_NULL, 0 }
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static QSE_INLINE int get_active_priority_bits (int flags)
|
||||||
|
{
|
||||||
|
int priority_bits = 0;
|
||||||
|
|
||||||
|
if (flags & QSE_LOG_MASKED_PRIORITY)
|
||||||
|
{
|
||||||
|
priority_bits = flags & QSE_LOG_MASK_PRIORITY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int pri = flags & QSE_LOG_MASK_PRIORITY;
|
||||||
|
switch (pri)
|
||||||
|
{
|
||||||
|
case QSE_LOG_DEBUG:
|
||||||
|
priority_bits |= QSE_LOG_DEBUG;
|
||||||
|
case QSE_LOG_INFO:
|
||||||
|
priority_bits |= QSE_LOG_INFO;
|
||||||
|
case QSE_LOG_NOTICE:
|
||||||
|
priority_bits |= QSE_LOG_NOTICE;
|
||||||
|
case QSE_LOG_WARNING:
|
||||||
|
priority_bits |= QSE_LOG_WARNING;
|
||||||
|
case QSE_LOG_ERROR:
|
||||||
|
priority_bits |= QSE_LOG_ERROR;
|
||||||
|
case QSE_LOG_CRITICAL:
|
||||||
|
priority_bits |= QSE_LOG_CRITICAL;
|
||||||
|
case QSE_LOG_ALERT:
|
||||||
|
priority_bits |= QSE_LOG_ALERT;
|
||||||
|
case QSE_LOG_PANIC:
|
||||||
|
priority_bits |= QSE_LOG_PANIC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return priority_bits;
|
||||||
|
}
|
||||||
|
|
||||||
int qse_log_init (qse_log_t* log, qse_mmgr_t* mmgr, const qse_char_t* ident, int potflags, const qse_log_target_t* target)
|
int qse_log_init (qse_log_t* log, qse_mmgr_t* mmgr, const qse_char_t* ident, int potflags, const qse_log_target_t* target)
|
||||||
{
|
{
|
||||||
QSE_MEMSET (log, 0, QSE_SIZEOF(*log));
|
QSE_MEMSET (log, 0, QSE_SIZEOF(*log));
|
||||||
@ -169,10 +222,13 @@ int qse_log_init (qse_log_t* log, qse_mmgr_t* mmgr, const qse_char_t* ident, int
|
|||||||
if (ident) qse_strxcpy (log->ident, QSE_COUNTOF(log->ident), ident);
|
if (ident) qse_strxcpy (log->ident, QSE_COUNTOF(log->ident), ident);
|
||||||
if (qse_mtx_init(&log->mtx, mmgr) <= -1) return -1;
|
if (qse_mtx_init(&log->mtx, mmgr) <= -1) return -1;
|
||||||
|
|
||||||
|
log->active_priority_bits = get_active_priority_bits(log->flags);
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TODO: windows event logging */
|
/* TODO: windows event logging */
|
||||||
#else
|
#else
|
||||||
log->syslog_facility = QSE_LOG_USER;
|
log->syslog_facility = QSE_LOG_USER;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -328,64 +384,16 @@ void qse_log_setoption (qse_log_t* log, int option)
|
|||||||
void qse_log_setpriority (qse_log_t* log, int priority)
|
void qse_log_setpriority (qse_log_t* log, int priority)
|
||||||
{
|
{
|
||||||
log->flags = (log->flags & (QSE_LOG_MASK_TARGET | QSE_LOG_MASK_OPTION)) | (priority & QSE_LOG_MASK_PRIORITY);
|
log->flags = (log->flags & (QSE_LOG_MASK_TARGET | QSE_LOG_MASK_OPTION)) | (priority & QSE_LOG_MASK_PRIORITY);
|
||||||
|
log->active_priority_bits = get_active_priority_bits (log->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_log_setprioritybyname (qse_log_t* log, const qse_char_t* name)
|
|
||||||
{
|
|
||||||
|
|
||||||
qse_size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < QSE_COUNTOF(__priority_names); i++)
|
|
||||||
{
|
|
||||||
if (qse_strcmp(__priority_names[i], name) == 0)
|
|
||||||
{
|
|
||||||
qse_log_setpriority (log, i);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const qse_char_t* qse_log_getpriorityname (qse_log_t* log)
|
|
||||||
{
|
|
||||||
int pri = log->flags & QSE_LOG_MASK_PRIORITY;
|
|
||||||
|
|
||||||
if (pri < 0 || pri >= QSE_COUNTOF(__priority_names)) return QSE_NULL;
|
|
||||||
return __priority_names[pri];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void qse_log_setsyslogfacility (qse_log_t* log, qse_log_facility_t facility)
|
void qse_log_setsyslogfacility (qse_log_t* log, qse_log_facility_t facility)
|
||||||
{
|
{
|
||||||
#ifndef _WIN32
|
#if !defined(_WIN32)
|
||||||
log->syslog_facility = facility;
|
log->syslog_facility = facility;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_log_setsyslogfacilitybyname (qse_log_t* log, const qse_char_t* name)
|
|
||||||
{
|
|
||||||
#if defined(_WIN32)
|
|
||||||
/* do nothing */
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
struct syslog_fac_info_t* f = __syslog_fac_info;
|
|
||||||
|
|
||||||
while (f->name != QSE_NULL)
|
|
||||||
{
|
|
||||||
if (qse_strcmp (f->name, name) == 0)
|
|
||||||
{
|
|
||||||
log->syslog_facility = f->code;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
f++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static QSE_INLINE void __report_over_sio (qse_log_t* log, qse_sio_t* sio, const qse_mchar_t* tm, const qse_char_t* ident, const qse_char_t* fmt, va_list arg)
|
static QSE_INLINE void __report_over_sio (qse_log_t* log, qse_sio_t* sio, const qse_mchar_t* tm, const qse_char_t* ident, const qse_char_t* fmt, va_list arg)
|
||||||
{
|
{
|
||||||
int id_out = 0;
|
int id_out = 0;
|
||||||
@ -442,7 +450,7 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
|
|||||||
|
|
||||||
if ((log->flags & QSE_LOG_MASK_TARGET) == 0) return; /* no target */
|
if ((log->flags & QSE_LOG_MASK_TARGET) == 0) return; /* no target */
|
||||||
|
|
||||||
if (log->flags & QSE_LOG_ENABLE_MASKED)
|
if (log->flags & QSE_LOG_MASKED_PRIORITY)
|
||||||
{
|
{
|
||||||
if (!(pri & (log->flags & QSE_LOG_MASK_PRIORITY))) return;
|
if (!(pri & (log->flags & QSE_LOG_MASK_PRIORITY))) return;
|
||||||
}
|
}
|
||||||
@ -522,6 +530,7 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
|
|||||||
if (!log->wmsgbuf) goto done;
|
if (!log->wmsgbuf) goto done;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* the priority value given must have only 1 bit set. otherwise, it will translate to wrong values */
|
||||||
sl_pri = (pri < QSE_COUNTOF(__syslog_priority))? __syslog_priority[(pri & QSE_LOG_MASK_PRIORITY)]: LOG_DEBUG;
|
sl_pri = (pri < QSE_COUNTOF(__syslog_priority))? __syslog_priority[(pri & QSE_LOG_MASK_PRIORITY)]: LOG_DEBUG;
|
||||||
|
|
||||||
fplen = qse_mbs_fmt(log->dmsgbuf, QSE_MT("<%d>"), (int)(log->syslog_facility | sl_pri));
|
fplen = qse_mbs_fmt(log->dmsgbuf, QSE_MT("<%d>"), (int)(log->syslog_facility | sl_pri));
|
||||||
@ -533,7 +542,6 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
|
|||||||
cnow.hour, cnow.min, cnow.sec);
|
cnow.hour, cnow.min, cnow.sec);
|
||||||
if (fpdlen == (qse_size_t)-1) goto done;
|
if (fpdlen == (qse_size_t)-1) goto done;
|
||||||
|
|
||||||
|
|
||||||
if (log->flags & QSE_LOG_HOST_IN_REMOTE_SYSLOG)
|
if (log->flags & QSE_LOG_HOST_IN_REMOTE_SYSLOG)
|
||||||
{
|
{
|
||||||
struct utsname un;
|
struct utsname un;
|
||||||
@ -656,8 +664,91 @@ done:
|
|||||||
qse_mtx_unlock (&log->mtx);
|
qse_mtx_unlock (&log->mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
const qse_char_t* qse_get_log_priority_name (int pri)
|
/* --------------------------------------------------------------------------
|
||||||
|
* HELPER FUNCTIONS
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static const qse_char_t* __priority_names[] =
|
||||||
{
|
{
|
||||||
if (pri < 0 || pri >= QSE_COUNTOF(__priority_names)) return QSE_NULL;
|
/* NOTE: QSE_LOG_PRIORITY_LEN_MAX must be redefined if strings here
|
||||||
return __priority_names[pri];
|
* can produce a longer compositional name. e.g. panic|critical|... */
|
||||||
|
QSE_T("panic"),
|
||||||
|
QSE_T("alert"),
|
||||||
|
QSE_T("critical"),
|
||||||
|
QSE_T("error"),
|
||||||
|
QSE_T("warning"),
|
||||||
|
QSE_T("notice"),
|
||||||
|
QSE_T("info"),
|
||||||
|
QSE_T("debug")
|
||||||
|
};
|
||||||
|
|
||||||
|
qse_size_t qse_get_log_priority_name (int pri, qse_char_t* buf, qse_size_t len)
|
||||||
|
{
|
||||||
|
qse_size_t tlen, xlen, rem, i;
|
||||||
|
|
||||||
|
tlen = 0;
|
||||||
|
rem = len;
|
||||||
|
|
||||||
|
for (i = 0; i < QSE_COUNTOF(__priority_names); i++)
|
||||||
|
{
|
||||||
|
if (pri & (1UL << i))
|
||||||
|
{
|
||||||
|
if (rem <= 1) break;
|
||||||
|
|
||||||
|
xlen = (tlen <= 0)?
|
||||||
|
qse_strxcpy (&buf[tlen], rem, __priority_names[i]):
|
||||||
|
qse_strxjoin (&buf[tlen], rem, QSE_T("|"), __priority_names[i], QSE_NULL);
|
||||||
|
|
||||||
|
rem -= xlen;
|
||||||
|
tlen += xlen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len >= tlen) buf[tlen] = QSE_T('\0');
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_get_log_priority_by_name (const qse_char_t* name)
|
||||||
|
{
|
||||||
|
qse_size_t i;
|
||||||
|
qse_cstr_t tok;
|
||||||
|
const qse_char_t* ptr;
|
||||||
|
int pri = 0;
|
||||||
|
|
||||||
|
ptr = name;
|
||||||
|
while (ptr)
|
||||||
|
{
|
||||||
|
ptr = qse_strtok (ptr, QSE_T("|"), &tok);
|
||||||
|
if (tok.ptr)
|
||||||
|
{
|
||||||
|
for (i = 0; i < QSE_COUNTOF(__priority_names); i++)
|
||||||
|
{
|
||||||
|
if (qse_strxcmp(tok.ptr, tok.len, __priority_names[i]) == 0)
|
||||||
|
{
|
||||||
|
pri |= (1UL << i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i >= QSE_COUNTOF(__priority_names)) return 0; /* unknown name included */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pri;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int qse_get_log_facility_by_name (const qse_char_t* name, qse_log_facility_t* fcode)
|
||||||
|
{
|
||||||
|
qse_size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < QSE_COUNTOF(__syslog_fac_info); i++)
|
||||||
|
{
|
||||||
|
if (qse_strcmp (__syslog_fac_info[i].name, name) == 0)
|
||||||
|
{
|
||||||
|
*fcode = __syslog_fac_info[i].code;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,47 @@
|
|||||||
#include <qse/si/nwad.h>
|
#include <qse/si/nwad.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
void t1 (void)
|
static void t1_sub001 (qse_log_t* log)
|
||||||
|
{
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
const qse_char_t* name;
|
||||||
|
int pri;
|
||||||
|
} xtab[] =
|
||||||
|
{
|
||||||
|
{ QSE_T(""), 0 },
|
||||||
|
{ QSE_T(" "), 0 },
|
||||||
|
{ QSE_T("|"), 0 },
|
||||||
|
{ QSE_T("debug|xinfo|panic"), 0 },
|
||||||
|
{ QSE_T("debug|info|panic"), (QSE_LOG_DEBUG | QSE_LOG_INFO | QSE_LOG_PANIC) },
|
||||||
|
{ QSE_T("debug|notice|debug|panic"), (QSE_LOG_DEBUG | QSE_LOG_NOTICE | QSE_LOG_PANIC) },
|
||||||
|
{ QSE_T("notice"), QSE_LOG_NOTICE }
|
||||||
|
};
|
||||||
|
qse_size_t i;
|
||||||
|
qse_char_t buf[QSE_LOG_PRIORITY_LEN_MAX + 1];
|
||||||
|
qse_size_t len;
|
||||||
|
|
||||||
|
for (i = 0; i < QSE_COUNTOF(xtab); i++)
|
||||||
|
{
|
||||||
|
len = qse_get_log_priority_name (xtab[i].pri, buf, QSE_COUNTOF(buf));
|
||||||
|
QSE_LOG3 (log, QSE_NULL, QSE_LOG_INFO, QSE_T("%x => %s [%d]"), xtab[i].pri, buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < QSE_COUNTOF(xtab); i++)
|
||||||
|
{
|
||||||
|
int pri;
|
||||||
|
if ((pri = qse_get_log_priority_by_name(xtab[i].name)) == xtab[i].pri)
|
||||||
|
{
|
||||||
|
QSE_LOG2 (log, QSE_NULL, QSE_LOG_INFO, QSE_T("SUCCESS: %s => %x"), xtab[i].name, pri);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QSE_LOG3 (log, QSE_NULL, QSE_LOG_INFO, QSE_T("FAILURE: %s => got %x expected %x"), xtab[i].name, pri, xtab[i].pri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void t1 (void)
|
||||||
{
|
{
|
||||||
qse_log_t* log;
|
qse_log_t* log;
|
||||||
qse_log_target_t t;
|
qse_log_target_t t;
|
||||||
@ -32,6 +72,8 @@ void t1 (void)
|
|||||||
QSE_ASSERT (qse_log_getoption (log) == (QSE_LOG_INCLUDE_PID | QSE_LOG_HOST_IN_REMOTE_SYSLOG));
|
QSE_ASSERT (qse_log_getoption (log) == (QSE_LOG_INCLUDE_PID | QSE_LOG_HOST_IN_REMOTE_SYSLOG));
|
||||||
QSE_ASSERT (qse_log_gettarget (log, QSE_NULL) == (QSE_LOG_CONSOLE | QSE_LOG_FILE | QSE_LOG_SYSLOG | QSE_LOG_SYSLOG_REMOTE));
|
QSE_ASSERT (qse_log_gettarget (log, QSE_NULL) == (QSE_LOG_CONSOLE | QSE_LOG_FILE | QSE_LOG_SYSLOG | QSE_LOG_SYSLOG_REMOTE));
|
||||||
|
|
||||||
|
t1_sub001 (log);
|
||||||
|
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user