본문으로 바로가기

Log 파일을 만들기 위한 arglist 활용

category A/Args 2017. 10. 22. 04:45
가변 파라메터 라고 해야 할 까요?  알기쉬운 이름을 정의하기가 쉽지는 않습니다. 흔히 불리는 arglist 라고 하겠습니다. Argument List 즉 ArgList를 사용하면 로그 파일을 생성 할 때 Format문을 쓰지 않고도 편리하게 사용 할 수 있다는 장점이 있습니다.또한 입력하는 Parameter가 가변적일 때 오버로딩 (Overloading)을 사용하지 않고도 간편하게 처리하는 방법을 제공합니다. 예제 코드를 보면 Format문과 같은 기능을 Method로 정의하고 사용할 수 있는 것을 볼 수 있습니다. 
 C# Code 는 WriteLog("Satrted Servie{0}", "Application"); 와 같이 사용합니다.
Log File 생성 및 기간이 경과한 파일 삭제
 
 public class LogWriter
 {
        static Object thisLock = new object();
        static String TgDir = Application.StartupPath + "\\Log";
        
        /// Arglist를 이용해서 Log 파일 생성       
        public static void WriteLog(String format, params object[] arg)
        {            
            lock (thisLock) 
            {
                String fmt;
                string appName = AppDomain.CurrentDomain.FriendlyName;
                appName = appName.Substring(0, appName.IndexOf('.'));
                string sDir = String.Format("{0}\\{1}_{2}.log", TgDir, appName, DateTime.Now.ToString("yMdHH"));
                StreamWriter logs = new StreamWriter(sDir,true);
                logs.AutoFlush = true;
                fmt = DateTime.Now.ToString("yyyy-M-d HH:mm:ss ") + format;
                logs.WriteLine(fmt, arg);
                logs.Flush();
                logs.Close();    
            }
        }  
      
        /// 일정시간이 경과한 파일 삭제       
        public static  void DeleteOldFile(int BeforDays)
        {
            try
            {
                TimeSpan tSpan;                
                if (!Directory.Exists(TgDir)) Directory.CreateDirectory(TgDir);
                DirectoryInfo di = new DirectoryInfo(TgDir);
                foreach (FileInfo item in di.GetFiles("*.log"))
                {
                    
                  WriteLog("{0}={1}",item.Name, item.LastWriteTime);
                    tSpan = DateTime.Now - item.LastWriteTime;
                    if (tSpan.Days> BeforDays) File.Delete(item.FullName);
                }
                
            }
            catch(StackOverflowException  e)
            {

            }
        }
}

  C++ Code 는 FormatStr("Satrted Servie%s", "Application"); 와 같이 사용합니다.
C++ Arglist 예
CString FormatStr(LPCSTR cs_str,...)
{	
	 CString str="";
	 va_list args;

	 va_start(args, cs_str);		
	 str.FormatV(cs_str, args);	
	 va_end(args);	

	return str;
}
MSDN에 소개되어 있는 va_list 관련 소스
/* VA.C: The program below illustrates passing a variable
 * number of arguments using the following macros:
 *      va_start            va_arg              va_end
 *      va_list             va_dcl (UNIX only)
 */

#include 
#define ANSI            /* Comment out for UNIX version     */
#ifdef ANSI             /* ANSI compatible version          */
#include 
int average( int first, ... );
#else                   /* UNIX compatible version          */
#include 
int average( va_list );
#endif

void main( void )
{
   /* Call with 3 integers (-1 is used as terminator). */
   printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

   /* Call with 4 integers. */
   printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

   /* Call with just -1 terminator. */
   printf( "Average is: %d\n", average( -1 ) );
}

/* Returns the average of a variable list of integers. */
#ifdef ANSI             /* ANSI compatible version    */
int average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first );     /* Initialize variable arguments. */
   while( i != -1 )
   {
      sum += i;
      count++;
      i = va_arg( marker, int);
   }
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}
#else       /* UNIX compatible version must use old-style definition.  */
int average( va_alist )
va_dcl
{
   int i, count, sum;
   va_list marker;

   va_start( marker );            /* Initialize variable arguments. */
   for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )
      sum += i;
   va_end( marker );              /* Reset variable arguments   */
   return( sum ? (sum / count) : 0 );
}
#endif
Output

Average is: 3
Average is: 8
Average is: 0