Index: /trunk/include/cf_base.h
===================================================================
--- /trunk/include/cf_base.h	(revision 39)
+++ /trunk/include/cf_base.h	(revision 40)
@@ -48,19 +48,4 @@
 #define NAME_LENGTH						128
 
-/** 오류 코드 베이스 넘버 */
-#define CF_ERROR_BASE					CF_ERROR * 1000
-/** @see cf_file.h */
-#define CF_ERROR_FILE					CF_ERROR_BASE * 2
-/** @see cf_socket.h */
-#define CF_ERROR_SOCKET					CF_ERROR_BASE * 3
-/** @see cf_thread.h */
-#define CF_ERROR_THREAD					CF_ERROR_BASE * 4
-/** @see cf_thread.h */
-#define CF_ERROR_MUTEX					CF_ERROR_BASE * 5
-/** @see cf_debug.h */
-#define CF_ERROR_DEBUG					CF_ERROR_BASE * 6
-/** @see cf_log.h */
-#define CF_ERROR_LOG					CF_ERROR_BASE * 7
-
 /** Windows 에서의 함수 EXPORT 구문 정의 */
 #ifdef _WIN32
Index: /trunk/include/cf_debug.h
===================================================================
--- /trunk/include/cf_debug.h	(revision 39)
+++ /trunk/include/cf_debug.h	(revision 40)
@@ -20,9 +20,4 @@
 
 #include <stdio.h>
-
-#define CF_ERROR_DEBUG_INVALID_CTX			CF_ERROR_DEBUG - 1
-#define CF_ERROR_DEBUG_SET_OUTPUT_FD		CF_ERROR_DEBUG - 2
-#define CF_ERROR_DEBUG_PUSH_CALLSTACK		CF_ERROR_DEBUG - 3
-#define CF_ERROR_DEBUG_POP_CALLSTACK		CF_ERROR_DEBUG - 4
 
 /** Windows 함수 이름 매크로 재정의 */
Index: /trunk/include/cf_error.h
===================================================================
--- /trunk/include/cf_error.h	(revision 40)
+++ /trunk/include/cf_error.h	(revision 40)
@@ -0,0 +1,88 @@
+#ifndef __CF_ERROR_H__
+#define __CF_ERROR_H__
+
+#include "cf_base.h"
+
+/** 오류 코드 베이스 넘버 */
+#define CF_ERROR_BASE						CF_ERROR * 1000
+
+/* socket {{{ */
+#define CF_ERROR_FILE						CF_ERROR_BASE * 2
+/*------------------------------------------------------------*/
+#define CF_ERROR_FILE_OPEN					CF_ERROR_FILE - 1
+#define CF_ERROR_FILE_INVALID_ARGS			CF_ERROR_FILE - 2
+#define CF_ERROR_FILE_READ					CF_ERROR_FILE - 3
+#define CF_ERROR_FILE_WRITE					CF_ERROR_FILE - 4
+#define CF_ERROR_FILE_CREATE				CF_ERROR_FILE - 5
+#define CF_ERROR_FILE_CLOSE					CF_ERROR_FILE - 6
+#define CF_ERROR_FILE_GET_SIZE				CF_ERROR_FILE - 7
+
+/* }}} socket */
+
+/* socket {{{ */
+#define CF_ERROR_SOCKET						CF_ERROR_BASE * 3
+/*------------------------------------------------------------*/
+#define CF_ERROR_SOCKET_INITIALIZE			CF_ERROR_SOCKET - 1
+#define CF_ERROR_SOCKET_NOT_INITIALIZED		CF_ERROR_SOCKET - 2
+#define CF_ERROR_SOCKET_FINALIZE			CF_ERROR_SOCKET - 3
+#define CF_ERROR_SOCKET_CLOSE				CF_ERROR_SOCKET - 4
+#define CF_ERROR_SOCKET_CREATE				CF_ERROR_SOCKET - 5
+#define CF_ERROR_SOCKET_CONNECT				CF_ERROR_SOCKET - 6
+#define CF_ERROR_SOCKET_SET_OPTION			CF_ERROR_SOCKET - 7
+#define CF_ERROR_SOCKET_GET_OPTION			CF_ERROR_SOCKET - 8
+#define CF_ERROR_SOCKET_SET_TIMEOUT			CF_ERROR_SOCKET - 9
+#define CF_ERROR_SOCKET_INVALID_ARGS		CF_ERROR_SOCKET - 10
+#define CF_ERROR_SOCKET_INVALID_SOCKET		CF_ERROR_SOCKET - 11
+#define CF_ERROR_SOCKET_GET_HOST			CF_ERROR_SOCKET - 12
+#define CF_ERROR_SOCKET_BIND				CF_ERROR_SOCKET - 13
+#define CF_ERROR_SOCKET_LISTEN				CF_ERROR_SOCKET - 14
+#define CF_ERROR_SOCKET_ACCEPT				CF_ERROR_SOCKET - 15
+#define CF_ERROR_SOCKET_SEND				CF_ERROR_SOCKET - 16
+#define CF_ERROR_SOCKET_RECV				CF_ERROR_SOCKET - 17
+/* }}} socket */
+
+/* thread {{{ */
+#define CF_ERROR_THREAD						CF_ERROR_BASE * 4
+/*------------------------------------------------------------*/
+#define CF_ERROR_THREAD_CREATE				CF_ERROR_THREAD - 1
+#define CF_ERROR_THREAD_INVALID_ARGS		CF_ERROR_THREAD - 2
+/* }}} thread */
+
+/* mutex {{{ */
+#define CF_ERROR_MUTEX						CF_ERROR_BASE * 5
+/*------------------------------------------------------------*/
+#define CF_ERROR_MUTEX_CREATE				CF_ERROR_MUTEX - 1
+#define CF_ERROR_MUTEX_INVALID_ARGS			CF_ERROR_MUTEX - 2
+/* }}} mutex */
+
+/* debug {{{ */
+#define CF_ERROR_DEBUG						CF_ERROR_BASE * 6
+/*------------------------------------------------------------*/
+#define CF_ERROR_DEBUG_INVALID_CTX			CF_ERROR_DEBUG - 1
+#define CF_ERROR_DEBUG_SET_OUTPUT_FD		CF_ERROR_DEBUG - 2
+#define CF_ERROR_DEBUG_PUSH_CALLSTACK		CF_ERROR_DEBUG - 3
+#define CF_ERROR_DEBUG_POP_CALLSTACK		CF_ERROR_DEBUG - 4
+/* }}} debug */
+
+/* log {{{ */
+#define CF_ERROR_LOG						CF_ERROR_BASE * 7
+/*------------------------------------------------------------*/
+#define CF_ERROR_LOG_INITIALIZE				CF_ERROR_LOG - 1
+#define CF_ERROR_LOG_INVALID_CTX			CF_ERROR_LOG - 2
+#define CF_ERROR_LOG_SET_MULTITHREAD		CF_ERROR_LOG - 3
+#define CF_ERROR_LOG_UNSET_MULTITHREAD		CF_ERROR_LOG - 4
+#define CF_ERROR_LOG_LOCK_CTX				CF_ERROR_LOG - 5
+#define CF_ERROR_LOG_UNLOCK_CTX				CF_ERROR_LOG - 6
+#define CF_ERROR_LOG_FLUSH					CF_ERROR_LOG - 7
+#define CF_ERROR_LOG_INVALID_MAPID			CF_ERROR_LOG - 8
+#define CF_ERROR_LOG_NOT_MAPPED_ID			CF_ERROR_LOG - 9
+#define CF_ERROR_LOG_ALREADY_MAPPED_ID		CF_ERROR_LOG - 10
+#define CF_ERROR_LOG_NOT_INITIALIZE			CF_ERROR_LOG - 11
+#define CF_ERROR_LOG_INVALID_ARGS			CF_ERROR_LOG - 12
+#define CF_ERROR_LOG_ALLOCATE_CTX			CF_ERROR_LOG - 13
+#define CF_ERROR_LOG_CREATE_FILE			CF_ERROR_LOG - 14
+#define CF_ERROR_LOG_ALLOCATE_BUFFER		CF_ERROR_LOG - 15
+/* }}} log */
+
+
+#endif // #ifndef __CF_ERROR_H__
Index: /trunk/include/cf_file.h
===================================================================
--- /trunk/include/cf_file.h	(revision 39)
+++ /trunk/include/cf_file.h	(revision 40)
@@ -11,12 +11,4 @@
 #include "cf_base.h"
 #include <fcntl.h>
-
-#define CF_ERROR_FILE_OPEN				CF_ERROR_FILE - 1
-#define CF_ERROR_FILE_INVALID_ARGS		CF_ERROR_FILE - 2
-#define CF_ERROR_FILE_READ				CF_ERROR_FILE - 3
-#define CF_ERROR_FILE_WRITE				CF_ERROR_FILE - 4
-#define CF_ERROR_FILE_CREATE			CF_ERROR_FILE - 5
-#define CF_ERROR_FILE_CLOSE				CF_ERROR_FILE - 6
-#define CF_ERROR_FILE_GET_SIZE			CF_ERROR_FILE - 7
 
 /** 파일 열기 옵션 플래그 */
Index: /trunk/include/cf_log.h
===================================================================
--- /trunk/include/cf_log.h	(revision 39)
+++ /trunk/include/cf_log.h	(revision 40)
@@ -11,20 +11,8 @@
 #include "cf_base.h"
 
-#define CF_ERROR_LOG_INITIALIZE			CF_ERROR_LOG - 1
-#define CF_ERROR_LOG_INVALID_CTX		CF_ERROR_LOG - 2
-#define CF_ERROR_LOG_SET_MULTITHREAD	CF_ERROR_LOG - 3
-#define CF_ERROR_LOG_UNSET_MULTITHREAD	CF_ERROR_LOG - 4
-#define CF_ERROR_LOG_LOCK_CTX			CF_ERROR_LOG - 5
-#define CF_ERROR_LOG_UNLOCK_CTX			CF_ERROR_LOG - 6
-#define CF_ERROR_LOG_FLUSH				CF_ERROR_LOG - 7
-#define CF_ERROR_LOG_INVALID_MAPID		CF_ERROR_LOG - 8
-#define CF_ERROR_LOG_NOT_MAPPED_ID		CF_ERROR_LOG - 9
-#define CF_ERROR_LOG_ALREADY_MAPPED_ID	CF_ERROR_LOG - 10
-#define CF_ERROR_LOG_NOT_INITIALIZE		CF_ERROR_LOG - 11
-
 /**
  * 로그의 버퍼 크기를 기본 값으로 설정
  *
- * @see CF_Log_CreateCtx, CF_LOG_OPEN
+ * @see CF_Log_Open
  */
 #define CF_LOG_BUFFER_DEFAULT			-1
@@ -33,45 +21,7 @@
  * 로그 기록 시 버퍼를 사용하지 않고 즉시 기록
  *
- * @see CF_Log_CreateCtx, CF_LOG_OPEN, CF_Log_Initialize
+ * @see CF_Log_Open
  */
 #define CF_LOG_BUFFER_NO				0
-
-/**
- * 로그에 아이디 넘버를 부여하여 생성 <br />
- * 로그 기록 시, 아이디 넘버를 사용하면 해당 로그로 기록할 수 있음
- *
- * @param __id		부여할 아이디 넘버
- * @param __file	로그 파일 경로
- * @param __memsize	로그 버퍼 크기
- *
- * @see CF_Log_MapCtxID
- */
-#define CF_LOG_OPEN(__id,__file,__memsize)				\
-	CF_Log_MapCtxID (__id, CF_Log_CreateCtx (__file, __memsize))
-
-/**
- * 아이디 넘버에 해당하는 로그에 쓰기
- *
- * @param __id	로그의 아이디 넘버
- * @param __pf	로그의 프리픽스 문자열
- * @param __fmt	포맷 스트링
- * @param ...	가변 인자
- *
- * @see CF_Log_GetMappedCtx
- */
-#define CF_LOG_WRITE(__id,__pf,__fmt,...)				\
-	CF_Log_Write (CF_Log_GetMappedCtx (__id),__pf,__fmt,##__VA_ARGS__)
-
-/**
- * 아이디 넘버에 해당하는 로그를 닫고 해제
- *
- * @param __id 로그의 아이디 넘버
- *
- * @see CF_Log_UnmapCtxID
- */
-#define CF_LOG_CLOSE(__id)		CF_Log_UnmapCtxID (__id)
-
-/** 로그 컨텍스트 */
-typedef void *	CF_Log_Ctx;
 
 #ifdef __cplusplus
@@ -85,34 +35,23 @@
 CF_Log_Finalize			(void);
 
-CF_EXPORT CF_Log_Ctx
-CF_Log_CreateCtx		(const char	* path,
+CF_EXPORT int
+CF_Log_Open				(const int	mapid,
+						 const char	* path,
 						 const int	memsize);
 
 CF_EXPORT int
-CF_Log_DestroyCtx		(CF_Log_Ctx ctx);
+CF_Log_Close			(const int mapid);
 
 CF_EXPORT int
-CF_Log_SetMultiThread	(CF_Log_Ctx ctx);
+CF_Log_SetMT			(const int		mapid,
+						 const CF_BOOL	flag);
 
 CF_EXPORT int
-CF_Log_UnsetMultiThread	(CF_Log_Ctx ctx);
-
-CF_EXPORT int
-CF_Log_Write			(CF_Log_Ctx	ctx,
+CF_Log_Write			(const int	mapid,
 						 const char	* prefix,
 						 const char	* fmt, ...);
 
 CF_EXPORT int
-CF_Log_Flush			(CF_Log_Ctx ctx);
-
-CF_EXPORT int
-CF_Log_MapCtxID			(const int			mapid,
-						 const CF_Log_Ctx	ctx);
-
-CF_EXPORT int
-CF_Log_UnmapCtxID		(const int mapid);
-
-CF_EXPORT CF_Log_Ctx
-CF_Log_GetMappedCtx		(const int mapid);
+CF_Log_Flush			(const int mapid);
 
 #ifdef __cplusplus
Index: /trunk/include/cf_socket.h
===================================================================
--- /trunk/include/cf_socket.h	(revision 39)
+++ /trunk/include/cf_socket.h	(revision 40)
@@ -24,22 +24,4 @@
 # include <unistd.h>
 #endif
-
-#define CF_ERROR_SOCKET_INITIALIZE		CF_ERROR_SOCKET - 1
-#define CF_ERROR_SOCKET_NOT_INITIALIZED	CF_ERROR_SOCKET - 2
-#define CF_ERROR_SOCKET_FINALIZE		CF_ERROR_SOCKET - 3
-#define CF_ERROR_SOCKET_CLOSE			CF_ERROR_SOCKET - 4
-#define CF_ERROR_SOCKET_CREATE			CF_ERROR_SOCKET - 5
-#define CF_ERROR_SOCKET_CONNECT			CF_ERROR_SOCKET - 6
-#define CF_ERROR_SOCKET_SET_OPTION		CF_ERROR_SOCKET - 7
-#define CF_ERROR_SOCKET_GET_OPTION		CF_ERROR_SOCKET - 8
-#define CF_ERROR_SOCKET_SET_TIMEOUT		CF_ERROR_SOCKET - 9
-#define CF_ERROR_SOCKET_INVALID_ARGS	CF_ERROR_SOCKET - 10
-#define CF_ERROR_SOCKET_INVALID_SOCKET	CF_ERROR_SOCKET - 11
-#define CF_ERROR_SOCKET_GET_HOST		CF_ERROR_SOCKET - 12
-#define CF_ERROR_SOCKET_BIND			CF_ERROR_SOCKET - 13
-#define CF_ERROR_SOCKET_LISTEN			CF_ERROR_SOCKET - 14
-#define CF_ERROR_SOCKET_ACCEPT			CF_ERROR_SOCKET - 15
-#define CF_ERROR_SOCKET_SEND			CF_ERROR_SOCKET - 16
-#define CF_ERROR_SOCKET_RECV			CF_ERROR_SOCKET - 17
 
 #ifdef _WIN32
Index: /trunk/include/cf_thread.h
===================================================================
--- /trunk/include/cf_thread.h	(revision 39)
+++ /trunk/include/cf_thread.h	(revision 40)
@@ -12,10 +12,4 @@
 
 #include "cf_base.h"
-
-#define CF_ERROR_THREAD_CREATE			CF_ERROR_THREAD - 1
-#define CF_ERROR_THREAD_INVALID_ARGS	CF_ERROR_THREAD - 2
-
-#define CF_ERROR_MUTEX_CREATE			CF_ERROR_MUTEX - 1
-#define CF_ERROR_MUTEX_INVALID_ARGS		CF_ERROR_MUTEX - 2
 
 #ifdef _WIN32
Index: /trunk/src/cf_debug.c
===================================================================
--- /trunk/src/cf_debug.c	(revision 39)
+++ /trunk/src/cf_debug.c	(revision 40)
@@ -6,4 +6,5 @@
 #include "cf_debug.h"
 #include "cf_local.h"
+#include "cf_error.h"
 
 #include <stdlib.h>
Index: /trunk/src/cf_file.c
===================================================================
--- /trunk/src/cf_file.c	(revision 39)
+++ /trunk/src/cf_file.c	(revision 40)
@@ -5,4 +5,5 @@
  */
 #include "cf_file.h"
+#include "cf_error.h"
 
 #ifdef _WIN32
Index: /trunk/src/cf_log.c
===================================================================
--- /trunk/src/cf_log.c	(revision 39)
+++ /trunk/src/cf_log.c	(revision 40)
@@ -12,4 +12,5 @@
 #include "cf_thread.h"
 #include "cf_local.h"
+#include "cf_error.h"
 
 #include <stdio.h>
@@ -38,4 +39,11 @@
 
 #define CF_LOG_DATETIME_LENGTH			sizeof ("0000-00-00 00:00:00.000") - 1
+
+/**
+ * 로그 컨텍스트
+ * 
+ * @remark change from public to private
+ */
+typedef void *	CF_Log_Ctx;
 
 typedef struct __cf_util_datetime__
@@ -189,4 +197,6 @@
 				   const size_t	demandSize)
 {
+	int result = CF_OK;
+
 	if( ctx->size > 0 ) /* 버퍼단위 버퍼링.... */
 	{
@@ -213,7 +223,315 @@
 		ctx->length = demandSize;
 
-		if (CF_Log_Local_Flush (ctx) < 0)
-			return CF_ERROR_LOG_FLUSH;
-	}
+		result = CF_Log_Local_Flush (ctx);
+	}
+
+	return result;
+}
+
+/**
+ * 로그 컨텍스트에 멀티쓰레드 모드 설정
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드 
+ *
+ * @param ctx 로그 컨텍스트
+ *
+ * @see CF_Log_UnsetMultiThread
+ */
+static int
+CF_Log_SetMultiThread (CF_Log_Ctx ctx)
+{
+	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
+
+	if (CHECK_INVALID_CTX (ctx))
+		return CF_ERROR_LOG_INVALID_CTX;
+
+	if (CF_Mutex_Create (&context->mutex) < 0)
+		return CF_ERROR_LOG_SET_MULTITHREAD;
+
+	return CF_OK;
+}
+
+/**
+ * 로그 컨텍스트에 멀티쓰레드 모드 설정 해제
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드 
+ *
+ * @param ctx 로그 컨텍스트
+ *
+ * @see CF_Log_SetMultiThread
+ */
+static int
+CF_Log_UnsetMultiThread (CF_Log_Ctx ctx)
+{
+	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
+
+	if (CHECK_INVALID_CTX (ctx))
+		return CF_ERROR_LOG_INVALID_CTX;
+
+	if (CF_Mutex_Destory (&context->mutex) < 0)
+		return CF_ERROR_LOG_UNSET_MULTITHREAD;
+
+	return CF_OK;
+}
+
+/**
+ * 로그 컨텍스트에 따라 로그 쓰기
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx		로그 컨텍스트
+ * @param prefix	로그의 프리픽스 문자열
+ * @param fmt		포맷 스트링
+ * @param ...		가변 인자
+ */
+static int
+CF_Log_WriteCtx (CF_Log_Ctx	ctx,
+				 const char	* prefix,
+				 const char	* fmt,
+//				 ...)
+				 va_list	valist)
+{
+	CF_LOG_CTX	* context = (CF_LOG_CTX *) ctx;
+//	va_list		valist;
+	char		buffer[16 * 1024] = {0x00,};
+	char		datetime[CF_LOG_DATETIME_LENGTH + 1] = {0x00,};
+
+	if (CHECK_INVALID_CTX (ctx))
+		return CF_ERROR_LOG_INVALID_CTX;
+
+	LOCK_LOG_CTX (context);
+//	va_start (valist, fmt);
+
+	CF_Log_Local_GetTimeString (datetime);
+	sprintf (buffer, "[%s][%s] ", datetime, prefix);
+	vsprintf (buffer + strlen (buffer), fmt, valist);
+
+	CF_Log_Local_Push (context, buffer, strlen (buffer));
+
+//	va_end (valist);
+	UNLOCK_LOG_CTX (context);
+
+	return CF_OK;
+}
+
+/**
+ * 로그 버퍼의 데이터를 즉시 로그 파일에 쓰기
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx 로그 컨텍스트
+ */
+static int
+CF_Log_FlushCtx (CF_Log_Ctx ctx)
+{
+	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
+
+	if (CHECK_INVALID_CTX (ctx))
+		return CF_ERROR_LOG_INVALID_CTX;
+
+	LOCK_LOG_CTX (context);
+	CF_Log_Local_Flush (context);
+	UNLOCK_LOG_CTX (context);
+
+	return CF_OK;
+}
+
+/**
+ * 로그 컨텍스트 해제
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드 
+ *
+ * @param ctx 로그 컨텍스트
+ */
+static int
+CF_Log_DestroyCtx (CF_Log_Ctx ctx)
+{
+	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
+
+	if (CHECK_INVALID_CTX (ctx))
+		return CF_ERROR_LOG_INVALID_CTX;
+
+	if (context->size > 0)
+	{
+		CF_Log_FlushCtx (ctx);
+		free (context->buffer);
+		context->buffer = NULL;
+		context->size = 0;
+	}
+
+	CF_File_Close (context->fd);
+
+	if (context->mutex != NULL)
+	{
+		if (CF_Mutex_Destory (&context->mutex) < 0)
+			/* do something ? */;
+
+		context->mutex = NULL;
+	}
+
+	return CF_OK;
+}
+
+/**
+ * 로그 컨텍스트 생성
+ *
+ * @return 성공 시, 로그 컨텍스트; 실패 시, NULL
+ *
+ * @param path		로그 파일 경로
+ * @param memsize	로그 버퍼 크기
+ * @param ctx		로그 컨텍스트 받을 주소
+ *
+ * @see CF_LOG_BUFFER_DEFAULT, CF_LOG_BUFFER_NO
+ */
+static int
+CF_Log_CreateCtx (const char	* path,
+				  const int		memsize,
+				  CF_Log_Ctx	* ctx)
+{
+	int result = 0;
+	int size = (memsize == CF_LOG_BUFFER_DEFAULT)
+			 ? CF_LOG_BUFFER_DEFAULT_SIZE
+			 : memsize;
+	CF_LOG_CTX	* context = NULL;
+
+	if (path == NULL)
+		return CF_ERROR_LOG_INVALID_ARGS;
+
+	TRY
+	{
+		context = (CF_LOG_CTX *) calloc (sizeof (CF_LOG_CTX), 1);
+		if (context == NULL)
+		{
+			result = CF_ERROR_LOG_ALLOCATE_CTX;
+			TRY_BREAK;
+		}
+
+		context->fd = CF_File_Create (path);
+		if (context->fd < 0)
+		{
+			result = CF_ERROR_LOG_CREATE_FILE;
+			TRY_BREAK;
+		}
+		sprintf (context->path, "%s", path);
+
+		if (size > 0)
+		{
+			context->buffer = (char *) calloc ((size_t) size + 1, 1);
+			if (context->buffer == NULL)
+			{
+				result = CF_ERROR_LOG_ALLOCATE_BUFFER;
+				TRY_BREAK;
+			}
+			context->size = (size_t) size;
+		}
+	}
+	CATCH_IF (result < 0)
+	{
+		CF_Log_DestroyCtx ((CF_Log_Ctx) context);
+		return result;
+	}
+
+	*ctx = (CF_Log_Ctx) context;
+
+	return CF_OK;
+}
+
+/**
+ * 로그 컨텍스트에 아이디 넘버 할당<br />
+ * 로그 기록 시, 아이디 넘버를 사용하면 해당 로그로 기록할 수 있음
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param mapid	부여할 아이디 넘버
+ * @param ctx	로그 컨텍스트
+ *
+ * @remark 반드시 먼저 초기화 해야하며, 초기화 시에 주어진 번호보다 작은 아이디 넘버를 사용해야 함
+ *
+ * @see CF_LOG_OPEN, CF_Log_CreateCtx
+ */
+static int
+CF_Log_MapCtxID (const int			mapid,
+				 const CF_Log_Ctx	ctx)
+{
+	int result = 0;
+
+	TRY
+	{
+		if (CHECK_INITIALIZED ())
+		{
+			result = CF_ERROR_LOG_NOT_INITIALIZE;
+			TRY_BREAK;
+		}
+		if (CHECK_INVALID_MAPID (mapid))
+		{
+			result = CF_ERROR_LOG_INVALID_MAPID;
+			TRY_BREAK;
+		}
+		if (CHECK_MAPPED_ID (mapid))
+		{
+			result = CF_ERROR_LOG_ALREADY_MAPPED_ID;
+			TRY_BREAK;
+		}
+	}
+	CATCH_IF (result < 0)
+	{
+		CF_Log_DestroyCtx (ctx);
+		return result;
+	}
+
+	gLogEnvironment.ctxPool[mapid] = ctx;
+
+	return CF_OK;
+}
+
+/**
+ * 아이디 넘버에 해당하는 로그를 닫고 해당하는 컨텍스트를 해제
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param mapid 로그의 아이디 넘버
+ *
+ * @remark 아이디 넘버에 해당하는 컨텍스트가 해제되므로 주의
+ *
+ * @see CF_LOG_CLOSE, CF_Log_DestroyCtx
+ */
+static int
+CF_Log_UnmapCtxID (const int mapid)
+{
+	if (CHECK_INITIALIZED ())
+		return CF_ERROR_LOG_NOT_INITIALIZE;
+	if (CHECK_INVALID_MAPID (mapid))
+		return CF_ERROR_LOG_INVALID_MAPID;
+	if (!CHECK_MAPPED_ID (mapid))
+		return CF_ERROR_LOG_NOT_MAPPED_ID;
+
+	CF_Log_DestroyCtx (gLogEnvironment.ctxPool[mapid]);
+
+	free (gLogEnvironment.ctxPool[mapid]);
+	gLogEnvironment.ctxPool[mapid] = NULL;
+
+	return CF_OK;
+}
+
+/**
+ * 아이디 넘버에 해당하는 로그 컨텍스트를 얻기
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param mapid	로그의 아이디 넘버
+ * @param ctx	로그 컨텍스트 받을 주소
+ */
+static int
+CF_Log_GetMappedCtx (const int	mapid,
+					 CF_Log_Ctx	* ctx)
+{
+	if (CHECK_INITIALIZED ())
+		return CF_ERROR_LOG_NOT_INITIALIZE;
+	if (CHECK_INVALID_MAPID (mapid))
+		return CF_ERROR_LOG_INVALID_MAPID;
+	if (!CHECK_MAPPED_ID (mapid))
+		return CF_ERROR_LOG_NOT_MAPPED_ID;
+
+	*ctx = gLogEnvironment.ctxPool[mapid];
 
 	return CF_OK;
@@ -268,8 +586,9 @@
 
 /**
- * 로그 컨텍스트 생성
- *
- * @return 성공 시, 로그 컨텍스트; 실패 시, NULL
- *
+ * 로그 열기
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param mapid 로그의 아이디 넘버
  * @param path		로그 파일 경로
  * @param memsize	로그 버퍼 크기
@@ -277,138 +596,40 @@
  * @see CF_LOG_BUFFER_DEFAULT, CF_LOG_BUFFER_NO
  */
-CF_Log_Ctx
-CF_Log_CreateCtx (const char	* path,
-				  const int		memsize)
-{
-	int result = 0;
-	int size = (memsize == CF_LOG_BUFFER_DEFAULT)
-			 ? CF_LOG_BUFFER_DEFAULT_SIZE
-			 : memsize;
-	CF_LOG_CTX	* context = NULL;
-
-	if (path == NULL)
-		return NULL;
-
-	TRY
-	{
-		context = (CF_LOG_CTX *) calloc (sizeof (CF_LOG_CTX), 1);
-		if (context == NULL)
-		{
-			result = -1;
-			TRY_BREAK;
-		}
-
-		context->fd = CF_File_Create (path);
-		if (context->fd < 0)
-		{
-			result = -2;
-			TRY_BREAK;
-		}
-		sprintf (context->path, "%s", path);
-
-		if (size > 0)
-		{
-			context->buffer = (char *) calloc ((size_t) size + 1, 1);
-			if (context->buffer == NULL)
-			{
-				result = -3;
-				TRY_BREAK;
-			}
-			context->size = (size_t) size;
-		}
-	}
-	CATCH_IF (result < 0)
-	{
-		CF_Log_DestroyCtx ((CF_Log_Ctx) context);
-		return NULL;
-	}
-
-	return (CF_Log_Ctx) context;
-}
-
-/**
- * 로그 컨텍스트 해제
- *
- * @return 성공 시, CF_OK; 실패 시, 오류 코드 
- *
- * @param ctx 로그 컨텍스트
- */
 int
-CF_Log_DestroyCtx (CF_Log_Ctx ctx)
-{
-	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
-
-	if (CHECK_INVALID_CTX (ctx))
-		return CF_ERROR_LOG_INVALID_CTX;
-
-	if (context->size > 0)
-	{
-		CF_Log_Flush (ctx);
-		free (context->buffer);
-		context->buffer = NULL;
-		context->size = 0;
-	}
-
-	CF_File_Close (context->fd);
-
-	if (context->mutex != NULL)
-	{
-		if (CF_Mutex_Destory (&context->mutex) < 0)
-			/* do something ? */;
-
-		context->mutex = NULL;
-	}
-
-	return CF_OK;
-}
-
-/**
- * 로그 컨텍스트에 멀티쓰레드 모드 설정
- *
- * @return 성공 시, CF_OK; 실패 시, 오류 코드 
- *
- * @param ctx 로그 컨텍스트
+CF_Log_Open (const int	mapid,
+			 const char	* path,
+			 const int	memsize)
+{
+	int			result = 0;
+	CF_Log_Ctx	ctx = NULL;
+
+	result = CF_Log_CreateCtx (path, memsize, &ctx);
+	if (result < 0)
+		return result;
+
+	result = CF_Log_MapCtxID (mapid, ctx);
+
+	return result;
+}
+
+/**
+ * 로그 닫기
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param mapid 로그의 아이디 넘버
  */
 int
-CF_Log_SetMultiThread (CF_Log_Ctx ctx)
-{
-	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
-
-	if (CHECK_INVALID_CTX (ctx))
-		return CF_ERROR_LOG_INVALID_CTX;
-
-	if (CF_Mutex_Create (&context->mutex) < 0)
-		return CF_ERROR_LOG_SET_MULTITHREAD;
-
-	return CF_OK;
-}
-
-/**
- * 로그 컨텍스트에 멀티쓰레드 모드 설정 해제
- *
- * @return 성공 시, CF_OK; 실패 시, 오류 코드 
- *
- * @param ctx 로그 컨텍스트
- */
-int
-CF_Log_UnsetMultiThread (CF_Log_Ctx ctx)
-{
-	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
-
-	if (CHECK_INVALID_CTX (ctx))
-		return CF_ERROR_LOG_INVALID_CTX;
-
-	if (CF_Mutex_Destory (&context->mutex) < 0)
-		return CF_ERROR_LOG_UNSET_MULTITHREAD;
-
-	return CF_OK;
-}
-
-/**
- * 로그 컨텍스트에 따라 로그 쓰기
- *
- * @return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * @param ctx		로그 컨텍스트
+CF_Log_Close (const int mapid)
+{
+	return CF_Log_UnmapCtxID (mapid);
+}
+
+/**
+ * 로그 쓰기
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param mapid		로그의 아이디 넘버
  * @param prefix	로그의 프리픽스 문자열
  * @param fmt		포맷 스트링
@@ -416,29 +637,21 @@
  */
 int
-CF_Log_Write (CF_Log_Ctx	ctx,
+CF_Log_Write (const int		mapid,
 			  const char	* prefix,
 			  const char	* fmt, ...)
 {
-	CF_LOG_CTX	* context = (CF_LOG_CTX *) ctx;
+	int			result = 0;
+	CF_Log_Ctx	ctx = NULL;
 	va_list		valist;
-	char		buffer[16 * 1024] = {0x00,};
-	char		datetime[CF_LOG_DATETIME_LENGTH + 1] = {0x00,};
-
-	if (CHECK_INVALID_CTX (ctx))
-		return CF_ERROR_LOG_INVALID_CTX;
-
-	LOCK_LOG_CTX (context);
+
+	result = CF_Log_GetMappedCtx (mapid, &ctx);
+	if (result < 0)
+		return result;
+
 	va_start (valist, fmt);
-
-	CF_Log_Local_GetTimeString (datetime);
-	sprintf (buffer, "[%s][%s] ", datetime, prefix);
-	vsprintf (buffer + strlen (buffer), fmt, valist);
-
-	CF_Log_Local_Push (context, buffer, strlen (buffer));
-
+	result = CF_Log_WriteCtx (ctx, prefix, fmt, valist);
 	va_end (valist);
-	UNLOCK_LOG_CTX (context);
-
-	return CF_OK;
+
+	return result;
 }
 
@@ -448,115 +661,46 @@
  * @return 성공 시, CF_OK; 실패 시, 오류 코드
  *
- * @param ctx 로그 컨텍스트
+ * @param mapid 로그의 아이디 넘버
  */
 int
-CF_Log_Flush (CF_Log_Ctx ctx)
-{
-	CF_LOG_CTX * context = (CF_LOG_CTX *) ctx;
-
-	if (CHECK_INVALID_CTX (ctx))
-		return CF_ERROR_LOG_INVALID_CTX;
-
-	LOCK_LOG_CTX (context);
-	CF_Log_Local_Flush (context);
-	UNLOCK_LOG_CTX (context);
-
-	return CF_OK;
-}
-
-/**
- * 로그 컨텍스트에 아이디 넘버 할당<br />
- * 로그 기록 시, 아이디 넘버를 사용하면 해당 로그로 기록할 수 있음
- *
- * @return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * @param mapid	부여할 아이디 넘버
- * @param ctx	로그 컨텍스트
- *
- * @remark 반드시 먼저 초기화 해야하며, 초기화 시에 주어진 번호보다 작은 아이디 넘버를 사용해야 함
- *
- * @see CF_LOG_OPEN, CF_Log_CreateCtx
+CF_Log_Flush (const int mapid)
+{
+	int			result = 0;
+	CF_Log_Ctx	ctx = NULL;
+
+	result = CF_Log_GetMappedCtx (mapid, &ctx);
+	if (result < 0)
+		return result;
+
+	result = CF_Log_FlushCtx (ctx);
+
+	return result;
+}
+
+/**
+ * 로그 컨텍스트에 멀티쓰레드 모드 설정
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드 
+ *
+ * @param mapid	로그의 아이디 넘버
+ * @param flag	설정/해제 bool 플래그
+ *
+ * @see CF_BOOL
  */
 int
-CF_Log_MapCtxID (const int			mapid,
-				 const CF_Log_Ctx	ctx)
-{
-	int result = 0;
-
-	TRY
-	{
-		if (CHECK_INITIALIZED())
-		{
-			result = CF_ERROR_LOG_NOT_INITIALIZE;
-			TRY_BREAK;
-		}
-		if (CHECK_INVALID_MAPID(mapid))
-		{
-			result = CF_ERROR_LOG_INVALID_MAPID;
-			TRY_BREAK;
-		}
-		if (CHECK_MAPPED_ID(mapid))
-		{
-			result = CF_ERROR_LOG_ALREADY_MAPPED_ID;
-			TRY_BREAK;
-		}
-	}
-	CATCH_IF (result < 0)
-	{
-		CF_Log_DestroyCtx (ctx);
+CF_Log_SetMT (const int		mapid,
+			  const CF_BOOL	flag)
+{
+	int			result = 0;
+	CF_Log_Ctx	ctx = NULL;
+
+	result = CF_Log_GetMappedCtx (mapid, &ctx);
+	if (result < 0)
 		return result;
-	}
-
-	gLogEnvironment.ctxPool[mapid] = ctx;
-
-	return CF_OK;
-}
-
-/**
- * 아이디 넘버에 해당하는 로그를 닫고 해당하는 컨텍스트를 해제
- *
- * @return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * @param mapid 로그의 아이디 넘버
- *
- * @remark 아이디 넘버에 해당하는 컨텍스트가 해제되므로 주의
- *
- * @see CF_LOG_CLOSE, CF_Log_DestroyCtx
- */
-int
-CF_Log_UnmapCtxID (const int mapid)
-{
-	if (CHECK_INITIALIZED())
-		return CF_ERROR_LOG_NOT_INITIALIZE;
-	if (CHECK_INVALID_MAPID(mapid))
-		return CF_ERROR_LOG_INVALID_MAPID;
-	if (!CHECK_MAPPED_ID(mapid))
-		return CF_ERROR_LOG_NOT_MAPPED_ID;
-
-	CF_Log_DestroyCtx (gLogEnvironment.ctxPool[mapid]);
-
-	free (gLogEnvironment.ctxPool[mapid]);
-	gLogEnvironment.ctxPool[mapid] = NULL;
-
-	return CF_OK;
-}
-
-/**
- * 아이디 넘버에 해당하는 로그 컨텍스트를 얻기
- *
- * @return 성공 시, 로그 컨텍스트; 실패 시, NULL
- *
- * @param mapid 로그의 아이디 넘버
- */
-CF_Log_Ctx
-CF_Log_GetMappedCtx (const int mapid)
-{
-	if (CHECK_INITIALIZED())
-		return NULL;
-	if (CHECK_INVALID_MAPID(mapid))
-		return NULL;
-	if (!CHECK_MAPPED_ID(mapid))
-		return NULL;
-
-	return gLogEnvironment.ctxPool[mapid];
-}
+
+	result = (flag == CF_TRUE)
+		   ? CF_Log_SetMultiThread (ctx)
+		   : CF_Log_UnsetMultiThread (ctx);
+
+	return result;
+}
Index: /trunk/src/cf_socket.c
===================================================================
--- /trunk/src/cf_socket.c	(revision 39)
+++ /trunk/src/cf_socket.c	(revision 40)
@@ -6,4 +6,5 @@
 #include "cf_socket.h"
 #include "cf_local.h"
+#include "cf_error.h"
 
 #ifdef _WIN32
Index: /trunk/src/cf_thread.c
===================================================================
--- /trunk/src/cf_thread.c	(revision 39)
+++ /trunk/src/cf_thread.c	(revision 40)
@@ -6,4 +6,5 @@
 #include "cf_thread.h"
 #include "cf_local.h"
+#include "cf_error.h"
 
 #include <stdlib.h>
Index: /trunk/test/log.c
===================================================================
--- /trunk/test/log.c	(revision 39)
+++ /trunk/test/log.c	(revision 40)
@@ -7,5 +7,5 @@
 #include <stdio.h>
 
-CF_Log_Ctx gLogCtx;
+#define LOGID		1
 
 int main (void)
@@ -14,23 +14,15 @@
 	char		logname[16] = {0x00,};
 
-	CF_Log_Initialize (10);
+	if (CF_Log_Initialize (10) < 0)
+	{
+		fprintf (stderr, "failed to init. log\n");
+		return -1;
+	}
 
-	// with context
-	gLogCtx = CF_Log_CreateCtx ("log.txt", CF_LOG_BUFFER_DEFAULT);
-	if (gLogCtx == NULL)
-		fprintf (stderr, "create log ctx error\n");
-
-	for (i = 0 ; i < 10000 ; i++)
-		CF_Log_Write (gLogCtx, "LOG_TEST", "turn %d\n", i);
-
-	CF_Log_Write (gLogCtx, "prefix", "log test\n");
-
-	CF_Log_DestroyCtx (gLogCtx);
-
-	// with id number
 	for (i = 0 ; i < 10 ; i++)
 	{
 		sprintf (logname, "logid%d.txt", i);
-		CF_LOG_OPEN (i, logname, CF_LOG_BUFFER_NO);
+		if (CF_Log_Open (i, logname, CF_LOG_BUFFER_NO) < 0)
+			fprintf (stderr, "failed to open log\n");
 	}
 
@@ -38,7 +30,12 @@
 	{
 		for (j = 0 ; j < 10000 ; j++)
-			CF_LOG_WRITE (i, "LOG_ID_TEST", "turn %d\n", j);
+		{
+			int result = CF_Log_Write (i, "LOG_ID_TEST", "turn %d\n", j); 
+			if (result < 0)
+				fprintf (stderr, "failed to write log %d\n", result);
+		}
 
-		CF_LOG_CLOSE (i);
+		if (CF_Log_Close (i) < 0)
+			fprintf (stderr, "failed to close log\n");
 	}
 
Index: /trunk/test/test.c
===================================================================
--- /trunk/test/test.c	(revision 39)
+++ /trunk/test/test.c	(revision 40)
@@ -25,5 +25,6 @@
 CF_Debug_CallStack	gDebugCallstack;
 
-CF_Log_Ctx			gLogCtx;
+#define LOG_SOCKET		0
+#define LOG_MT			1
 
 const char * file = "./log.txt";
@@ -36,5 +37,5 @@
 	for (i = 0 ; i < 100000 ; i++)
 	{
-		CF_Log_Write (gLogCtx, "LOG_MT", "[%d] multi-threadedlogging test %d\n", th, i);
+		CF_Log_Write (LOG_MT, "LOG_MT", "[%d] multi-threadedlogging test %d\n", th, i);
 	}
 
@@ -51,47 +52,35 @@
 
 	/* initialize */
-	CF_Log_Initialize (10);
-
-	/* context {{{ */
-	gLogCtx = CF_Log_CreateCtx (file, CF_LOG_BUFFER_DEFAULT);
-	if (gLogCtx == NULL)
+	if (CF_Log_Initialize (10) < 0)
+	{
+		fprintf (stderr, "failed to init. log\n");
+		return ;
+	}
+
+	for (i = 0 ; i < 10 ; i++)
+	{
+		sprintf (idname, "logid%d.txt", i);
+		if (CF_Log_Open (i, idname, CF_LOG_BUFFER_NO) < 0)
+			fprintf (stderr, "failed to open log\n");
+	}
+
+	for (i = 0 ; i < 10 ; i++)
+	{
+		for (j = 0 ; j < 10000 ; j++)
+		{
+			int result = CF_Log_Write (i, "LOG_ID_TEST", "turn %d\n", j); 
+			if (result < 0)
+				fprintf (stderr, "failed to write log %d\n", result);
+		}
+
+		if (CF_Log_Close (i) < 0)
+			fprintf (stderr, "failed to close log\n");
+	}
+
+	/* mt {{{ */
+	if (CF_Log_Open (LOG_MT, "log_mt.txt", CF_LOG_BUFFER_DEFAULT) < 0)
 		CF_DEBUG_PRINT (stderr, "create log ctx error\n");
 
-	for (i = 0 ; i < 1000 ; i++)
-		CF_Log_Write (gLogCtx, "LOG_TEST", "turn %d\n", i);
-
-	CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack);
-
-	CF_Log_Write (gLogCtx, message,
-							"here is the end of function [file:%s line:%d func:%s]\n",
-							gDebugCallstack.file,
-							gDebugCallstack.line,
-							gDebugCallstack.function);
-
-	CF_Log_DestroyCtx (gLogCtx);
-	/* }}} context */
-
-	/* id {{{ */
-	for (i = 0 ; i < 10 ; i++)
-	{
-		sprintf (idname, "logid%d.txt", i);
-		CF_LOG_OPEN (i, idname, CF_LOG_BUFFER_NO);
-	}
-
-	for (i = 0 ; i < 10 ; i++)
-	{
-		for (j = 0 ; j < 10000 ; j++)
-			CF_LOG_WRITE (i, "LOG_ID_TEST", "turn %d\n", j);
-
-		CF_LOG_CLOSE (i);
-	}
-	/* }}} id */
-
-	/* mt {{{ */
-	gLogCtx = CF_Log_CreateCtx ("log_mt.txt", CF_LOG_BUFFER_DEFAULT);
-	if (gLogCtx == NULL)
-		CF_DEBUG_PRINT (stderr, "create log ctx error\n");
-
-	if (CF_Log_SetMultiThread (gLogCtx) < 0)
+	if (CF_Log_SetMT (LOG_MT, CF_TRUE) < 0)
 		CF_DEBUG_PRINT (stderr, "set multi-threading mode error\n");
 
@@ -111,6 +100,4 @@
 			CF_DEBUG_PRINT (stderr, "failed to join %dth thread\n", i);
 	}
-
-	CF_Log_DestroyCtx (gLogCtx);
 	/* }}} mt */
 
@@ -184,5 +171,5 @@
 		return (CF_THREAD_RETURN)-1;
 	}
-	CF_Log_Write (gLogCtx, "SERVER", "accepted\n");
+	CF_Log_Write (LOG_SOCKET, "SERVER", "accepted\n");
 
 	for (i = 0 ; i < 100 ; i++)
@@ -193,5 +180,5 @@
 			return (CF_THREAD_RETURN)-2;
 		}
-		CF_Log_Write (gLogCtx, "SERVER", "recv {%s}\n", buf);
+		CF_Log_Write (LOG_SOCKET, "SERVER", "recv {%s}\n", buf);
 
 		if (CF_Socket_Send (clntsock, buf, recvd) < 0)
@@ -199,5 +186,5 @@
 			return (CF_THREAD_RETURN)-3;
 		}
-		CF_Log_Write (gLogCtx, "SERVER", "resp {%s}\n", buf);
+		CF_Log_Write (LOG_SOCKET, "SERVER", "resp {%s}\n", buf);
 	}
 
@@ -224,5 +211,5 @@
 		return (CF_THREAD_RETURN)-1;
 	}
-	CF_Log_Write (gLogCtx, "CLIENT", "connected\n");
+	CF_Log_Write (LOG_SOCKET, "CLIENT", "connected\n");
 
 	for (i = 0 ; i < 100 ; i++)
@@ -233,5 +220,5 @@
 			return (CF_THREAD_RETURN)-2;
 		}
-		CF_Log_Write (gLogCtx, "CLIENT", "sent {%s}\n", buf);
+		CF_Log_Write (LOG_SOCKET, "CLIENT", "sent {%s}\n", buf);
 
 		memset (buf, 0x00, sizeof (buf));
@@ -242,5 +229,5 @@
 			return (CF_THREAD_RETURN)-3;
 		}
-		CF_Log_Write (gLogCtx, "CLIENT", "recv {%s}\n", buf);
+		CF_Log_Write (LOG_SOCKET, "CLIENT", "recv {%s}\n", buf);
 	}
 
@@ -260,9 +247,14 @@
 
 	/*------------------------------------------------------------*/
-	gLogCtx = CF_Log_CreateCtx ("socket.txt", CF_LOG_BUFFER_DEFAULT);
-	if (gLogCtx == NULL)
+	if (CF_Log_Initialize (1) < 0)
+	{
+		fprintf (stderr, "failed to init. log\n");
+		return ;
+	}
+
+	if (CF_Log_Open (LOG_SOCKET, "socket.txt", CF_LOG_BUFFER_DEFAULT) < 0)
 		CF_DEBUG_PRINT (stderr, "failed to open log\n");
 
-	CF_Log_Write (gLogCtx, "LOG_MULTITHREAD", "multi-threaded logging test with socket\n");
+	CF_Log_Write (LOG_SOCKET, "LOG_MULTITHREAD", "multi-threaded logging test with socket\n");
 
 	if (CF_Socket_Initialize () < 0)
@@ -271,5 +263,5 @@
 		return ;
 	}
-	CF_Log_Write (gLogCtx, "SOCKET", "socket initialized\n");
+	CF_Log_Write (LOG_SOCKET, "SOCKET", "socket initialized\n");
 
 	sock = CF_Socket_Server (PORT, 5);
@@ -279,5 +271,5 @@
 		return ;
 	}
-	CF_Log_Write (gLogCtx, "SOCKET", "socket ready\n");
+	CF_Log_Write (LOG_SOCKET, "SOCKET", "socket ready\n");
 
 	if (CF_Socket_SetOption (sock, SO_REUSEADDR, &reuse, sizeof (reuse)) < 0)
@@ -286,5 +278,5 @@
 		return ;
 	}
-	CF_Log_Write (gLogCtx, "SOCKET", "set socket option\n");
+	CF_Log_Write (LOG_SOCKET, "SOCKET", "set socket option\n");
 
 	for (iter = 0 ; iter < THREAD_POOL ; iter++)
@@ -295,5 +287,5 @@
 			return ;
 		}
-		CF_Log_Write (gLogCtx, "SOCKET", "create server thread-%d\n", iter);
+		CF_Log_Write (LOG_SOCKET, "SOCKET", "create server thread-%d\n", iter);
 	}
 
@@ -306,5 +298,5 @@
 			return ;
 		}
-		CF_Log_Write (gLogCtx, "SOCKET", "create client thread-%d\n", iter);
+		CF_Log_Write (LOG_SOCKET, "SOCKET", "create client thread-%d\n", iter);
 	}
 
@@ -313,5 +305,5 @@
 		CF_Thread_Join (&tid[iter]);
 		CF_Thread_Release (&tid[iter]);
-		CF_Log_Write (gLogCtx, "SOCKET", "join server thread-%d\n", iter);
+		CF_Log_Write (LOG_SOCKET, "SOCKET", "join server thread-%d\n", iter);
 	}
 
@@ -320,5 +312,7 @@
 	CF_Socket_Finalize ();
 
-	CF_Log_DestroyCtx (gLogCtx);
+	CF_Log_Close (LOG_SOCKET);
+
+	CF_Log_Finalize ();
 	/*------------------------------------------------------------*/
 }
