/* vim: ts=4 sw=4 sts=4 ff=unix fenc=utf-8 :
 * =====================================================================
 *  sc_logger.h
 *  Copyright (c)  2003 - 2011  sys0tem
 *  LICENSE :
 *	LGPL (GNU Lesser General Public License - Version 3,29 June 2007)
 *	http://www.gnu.org/copyleft/lesser.html
 *	or
 *	EPL (Eclipse Public License - v1.0)
 *	http://www.eclipse.org/legal/epl-v10.html
 * =====================================================================
 *
 * 使用例
 * 最大1MBの2世代管理のログを使用する。
 *
 * ～初期設定～
 * SC_Logger_Config config;
 * config.level = LEVEL_ERR;
 * config.type  = LOGGER_FILE;
 * config.size  = 1 * 1024 * 1024;
 * config.gen   = 2;
 * config.name  = "sc.log";
 *
 * SC_Logger_setLogConfig("", &config);
 *
 * config.level = LEVEL_DEBUG;
 * SC_Logger_setLogConfig("src/sc_logger.c", &config);
 *
 *
 * ～LOGを出力する～
 * SC_Logger_log(__FILE__, LOGGER_DEBUG, "can't read file %s", fileName);
 *
 * ～後処理～
 * SC_Logger_cleanup();
 */
#ifndef __SC_LOGGER_H__
#define __SC_LOGGER_H__



typedef enum {
	LOGGER_FATAL	= 0x0001,		/*< システム使用不可	*/
	LOGGER_ALERT	= 0x0002,		/*< 直ちに対応が必要	*/
	LOGGER_CRIT		= 0x0004,		/*< 危険な状態			*/
	LOGGER_ERR		= 0x0008,		/*< エラーの状態		*/
	LOGGER_WARNING	= 0x0010,		/*< ワーニングの状態	*/
	LOGGER_NOTICE	= 0x0020,		/*< 通常だが重要な状態	*/
	LOGGER_INFO		= 0x0040,		/*< インフォメーション	*/
	LOGGER_DEBUG	= 0x0080,		/*< デバッグメッセージ	*/
} SC_LogLevel;


typedef enum {
	LOGGER_STDOUT = 0x00,
	LOGGER_STDERR = 0x01,
	LOGGER_MEMORY = 0x02,
	LOGGER_FILE   = 0x04,
	LOGGER_SYSLOG = 0x10,
} SC_LogOutputType;

typedef struct {
	SC_LogLevel      level;		/*< レベル	*/
	SC_LogOutputType type;		/*< タイプ	*/
	size_t           size;		/*< サイズ	*/
	int              gen;		/*< 世代数	*/
	const char*      name;		/*< 名前	*/
} SC_Logger_Config;


#ifdef SC_DEBUG
	#define SC_Debug(fmt, ...) \
		SC_Logger_log_(__FILE__, LOGGER_DEBUG, __FILE__, __LINE__, fmt, __VA_ARGS__)
#else
	#define SC_Debug(fmt, ...)
#endif	/* SC_DEBUG */

#define SC_Logger_log(category, level, fmt, ...) \
	SC_Logger_log_(category, level, __FILE__, __LINE__, fmt, __VA_ARGS__)

#ifdef __cplusplus
extern "C" {
#endif


bool SC_Logger_setLogConfig(const char* category, SC_Logger_Config* config);
void SC_Logger_log_(const char* category, SC_LogLevel level, const char* file, int line, const char* format, ...);
void SC_Logger_cleanup(void);


#ifdef __cplusplus
}
#endif


#endif	/* __SC_LOGGER_H__ */

