|
|
|
@ -0,0 +1,320 @@
|
|
|
|
|
/*
|
|
|
|
|
* $Id$
|
|
|
|
|
*
|
|
|
|
|
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
|
|
|
|
|
|
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
|
modification, are permitted provided that the following conditions
|
|
|
|
|
are met:
|
|
|
|
|
1. Redistributions of source code must retain the above copyright
|
|
|
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
|
notice, this list of conditions and the following disclaimer in the
|
|
|
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
|
|
|
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef _QSE_SI_LOG_H_
|
|
|
|
|
#define _QSE_SI_LOG_H_
|
|
|
|
|
|
|
|
|
|
#include <qse/types.h>
|
|
|
|
|
#include <qse/macros.h>
|
|
|
|
|
#include <qse/si/mtx.h>
|
|
|
|
|
#include <qse/si/sio.h>
|
|
|
|
|
#include <qse/si/nwad.h>
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
|
|
|
|
|
/* TODO: improve this and complete win32 portion */
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG_MSG_MAX 10204
|
|
|
|
|
#define QSE_LOG_IDENT_MAX 32
|
|
|
|
|
|
|
|
|
|
/* priority */
|
|
|
|
|
#define QSE_LOG_PANIC (1UL << 0)
|
|
|
|
|
#define QSE_LOG_ALERT (1UL << 1)
|
|
|
|
|
#define QSE_LOG_CRITICAL (1UL << 2)
|
|
|
|
|
#define QSE_LOG_ERROR (1UL << 3)
|
|
|
|
|
#define QSE_LOG_WARNING (1UL << 4)
|
|
|
|
|
#define QSE_LOG_NOTICE (1UL << 5)
|
|
|
|
|
#define QSE_LOG_INFO (1UL << 6)
|
|
|
|
|
#define QSE_LOG_DEBUG (1UL << 7)
|
|
|
|
|
|
|
|
|
|
/* options */
|
|
|
|
|
#define QSE_LOG_KEEP_FILE_OPEN (1UL << 13)
|
|
|
|
|
#define QSE_LOG_ENABLE_MASKED (1UL << 14)
|
|
|
|
|
#define QSE_LOG_SYSLOG_PID (1UL << 15)
|
|
|
|
|
|
|
|
|
|
/* target */
|
|
|
|
|
#define QSE_LOG_CONSOLE (1UL << 20)
|
|
|
|
|
#define QSE_LOG_FILE (1UL << 21)
|
|
|
|
|
#define QSE_LOG_SYSLOG (1UL << 22)
|
|
|
|
|
#define QSE_LOG_SYSLOG_REMOTE (1UL << 23)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG_MASK_PRIORITY 0x00000FFFUL
|
|
|
|
|
#define QSE_LOG_MASK_OPTION 0x000FF000UL
|
|
|
|
|
#define QSE_LOG_MASK_TARGET 0xFFF00000UL
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* facility */
|
|
|
|
|
enum qse_log_facility_t
|
|
|
|
|
{
|
|
|
|
|
QSE_LOG_KERN = (0<<3), /* kernel messages */
|
|
|
|
|
QSE_LOG_USER = (1<<3), /* random user-level messages */
|
|
|
|
|
QSE_LOG_MAIL = (2<<3), /* mail system */
|
|
|
|
|
QSE_LOG_DAEMON = (3<<3), /* system daemons */
|
|
|
|
|
QSE_LOG_AUTH = (4<<3), /* security/authorization messages */
|
|
|
|
|
QSE_LOG_SYSLOGD = (5<<3), /* messages from syslogd */
|
|
|
|
|
QSE_LOG_LPR = (6<<3), /* line printer subsystem */
|
|
|
|
|
QSE_LOG_NEWS = (7<<3), /* network news subsystem */
|
|
|
|
|
QSE_LOG_UUCP = (8<<3), /* UUCP subsystem */
|
|
|
|
|
QSE_LOG_CRON = (9<<3), /* clock daemon */
|
|
|
|
|
QSE_LOG_AUTHPRIV = (10<<3), /* authorization messages (private) */
|
|
|
|
|
QSE_LOG_FTP = (11<<3), /* ftp daemon */
|
|
|
|
|
QSE_LOG_LOCAL0 = (16<<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_LOCAL3 = (19<<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_LOCAL6 = (22<<3), /* reserved for local use */
|
|
|
|
|
QSE_LOG_LOCAL7 = (23<<3) /* reserved for local use */
|
|
|
|
|
};
|
|
|
|
|
typedef enum qse_log_facility_t qse_log_facility_t;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG_ENABLED(log,pri) ((pri) <= ((log)->flags & QSE_LOG_MASK_PRIORITY))
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG0(log,ident,pri,fmt) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG1(log,ident,pri,fmt,m1) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1); \
|
|
|
|
|
} while (0)
|
|
|
|
|
#define QSE_LOG2(log,ident,pri,fmt,m1,m2) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2); \
|
|
|
|
|
} while (0)
|
|
|
|
|
#define QSE_LOG3(log,ident,pri,fmt,m1,m2,m3) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3); \
|
|
|
|
|
} while (0)
|
|
|
|
|
#define QSE_LOG4(log,ident,pri,fmt,m1,m2,m3,m4) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4); \
|
|
|
|
|
} while (0)
|
|
|
|
|
#define QSE_LOG5(log,ident,pri,fmt,m1,m2,m3,m4,m5) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG6(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG7(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG8(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG9(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8,m9) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8, m9); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG10(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG11(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define QSE_LOG12(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11 ,m12); \
|
|
|
|
|
} while (0)
|
|
|
|
|
#define QSE_LOG13(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13); \
|
|
|
|
|
} while (0)
|
|
|
|
|
#define QSE_LOG14(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14); \
|
|
|
|
|
} while (0)
|
|
|
|
|
#define QSE_LOG15(log,ident,pri,fmt,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15) \
|
|
|
|
|
do { \
|
|
|
|
|
if (QSE_LOG_ENABLED(log,pri)) \
|
|
|
|
|
qse_log_report (log, ident, pri, fmt, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct qse_log_t qse_log_t;
|
|
|
|
|
struct qse_log_t
|
|
|
|
|
{
|
|
|
|
|
qse_mmgr_t* mmgr;
|
|
|
|
|
int flags;
|
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
qse_sio_t* sio;
|
|
|
|
|
} console;
|
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
qse_char_t path[/*QSE_PATH_MAX + 1*/2048]; /* TODO: use the defined macro for sizing */
|
|
|
|
|
qse_sio_t* sio;
|
|
|
|
|
} file;
|
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
int opened;
|
|
|
|
|
} syslog;
|
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
qse_skad_t addr;
|
|
|
|
|
int sock;
|
|
|
|
|
} syslog_remote;
|
|
|
|
|
} t;
|
|
|
|
|
|
|
|
|
|
qse_char_t ident[QSE_LOG_IDENT_MAX + 1];
|
|
|
|
|
qse_mbs_t* dmsgbuf;
|
|
|
|
|
qse_mtx_t mtx;
|
|
|
|
|
|
|
|
|
|
#if !defined(_WIN32)
|
|
|
|
|
qse_log_facility_t syslog_facility;
|
|
|
|
|
#endif
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct qse_log_target_t
|
|
|
|
|
{
|
|
|
|
|
const qse_char_t* file;
|
|
|
|
|
qse_skad_t syslog_remote;
|
|
|
|
|
};
|
|
|
|
|
typedef struct qse_log_target_t qse_log_target_t;
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
qse_log_t* qse_log_open (
|
|
|
|
|
qse_mmgr_t* mmgr,
|
|
|
|
|
qse_size_t xtnsize,
|
|
|
|
|
const qse_char_t* ident,
|
|
|
|
|
int potflags, /* priority + option + target bits */
|
|
|
|
|
const qse_log_target_t* target
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void qse_log_close (
|
|
|
|
|
qse_log_t* log
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void qse_log_setident (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
const qse_char_t* ident
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void qse_log_settarget (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
int flags,
|
|
|
|
|
const qse_log_target_t* target
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
int qse_log_gettarget (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
qse_log_target_t* target
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void qse_log_setpriority (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
int priority
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
int qse_log_setprioritybyname (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
const qse_char_t* name
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void qse_log_setsyslogfacility (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
qse_log_facility_t facility
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
int qse_log_setsyslogfacilitybyname (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
const qse_char_t* name
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
int qse_log_getpriority (
|
|
|
|
|
qse_log_t* log
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const qse_char_t* qse_log_getpriorityname (
|
|
|
|
|
qse_log_t* log
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void qse_log_report (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
const qse_char_t* ident,
|
|
|
|
|
int pri,
|
|
|
|
|
const qse_char_t* fmt,
|
|
|
|
|
...
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void qse_log_reportv (
|
|
|
|
|
qse_log_t* log,
|
|
|
|
|
const qse_char_t* ident,
|
|
|
|
|
int pri,
|
|
|
|
|
const qse_char_t* fmt,
|
|
|
|
|
va_list ap
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const qse_char_t* qse_get_log_priority_name (
|
|
|
|
|
int pri
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|