본문 바로가기

Programming/C#

C#에서 로그 함수 만들기

C나 C++에서 콘솔이나 UI의 디버깅창에 로그를 남기면서 파일로도 로그를 남기는 작업을 했었다.

주로 서버 개발이나 펌웨어 개발할 때 썼었는데 이번 프로젝트는 c#을 사용해야 하기에 맘먹고 만들어봤다.

소스코드는 아래에 있고 로그 발생지(eBlk)나 로깅 수준(eLevel)은 입맛대로 바꿔서 쓰면 될듯...

보통 릴리즈 후에는 어느정도 버그를 잡았다고 보기 때문에 ERROR, ABNORMAL, ESSENTIAL 정도만 남겨두고 나머지 로깅 수준은 꺼두는 것이 좋다.

이러한 로깅 수준 조정은 설정 파일을 따로 두어서 설정 내용에 따라 조정하면 되겠다. 아래 소스에서는 일단 모두 보이게 하는 것으로 해두었다.

public enum eBlk
    {
        BLK_GATE = 0,
        BLK_MNGR,
        BLK_MAIN,
        BLK_DB,
        MAX_BLK
    }

    public enum eLevel
    {
        D_ERROR = 0,
        D_ABNORMAL,
        D_ESSENTIAL,
        D_PRIMITIVE,
        D_NORMAL,
        D_TIMER,
        D_PERIODIC,
        D_HEXA,
        D_MAX_LEVEL
    }

    public static class MBzPrintf
    {
        static string[] S_BLK = new string[(int)eBlk.MAX_BLK];
        static string[] S_TYPE = new string[(int)eLevel.D_MAX_LEVEL];
        static byte[] BLK_OP = new byte[(int)eLevel.D_MAX_LEVEL];

        public static void MBzInitPrintf()
        {
            S_BLK[(int)eBlk.BLK_GATE] = "[G W]";
            S_BLK[(int)eBlk.BLK_MNGR] = "[MNG]";
            S_BLK[(int)eBlk.BLK_MAIN] = "[M N]";
            S_BLK[(int)eBlk.BLK_DB] = "[ DB]";

            S_TYPE[(int)eLevel.D_ERROR] = "[ERR]";
            S_TYPE[(int)eLevel.D_ABNORMAL] = "[ABN]";
            S_TYPE[(int)eLevel.D_ESSENTIAL] = "[ESS]";
            S_TYPE[(int)eLevel.D_PRIMITIVE] = "[PRI]";
            S_TYPE[(int)eLevel.D_NORMAL] = "[NOR]";
            S_TYPE[(int)eLevel.D_TIMER] = "[TMR]";
            S_TYPE[(int)eLevel.D_PERIODIC] = "[PRD]";
            S_TYPE[(int)eLevel.D_HEXA] = "[HEX]";

// 모든 로깅 수준을 다 풀었다.
            for(int i = 0; i < (int)eLevel.D_MAX_LEVEL; i++){
                BLK_OP[i] = 1;
            }           
        }

        public static int MBzWriteLine(eBlk blk, eLevel level, string format, params object[] args)
        {
            if((int)blk > (int)eBlk.MAX_BLK){
                return 0;
            }

            if (BLK_OP[(int)level] == 0)
            {
                return 0;
            }

            string log_str;
            log_str = String.Format(DateTime.Now.ToString("yyyy-MM-dd HH:mm") + " {0}{1} ", S_BLK[(int)blk], S_TYPE[(int)level]);
            log_str += String.Format(format, args);

            Console.WriteLine(log_str);

// Todo: 여기쯤에 파일에 기록하는 것도 넣으면 좋겠다.

            return log_str.Length;
        }
    }


사용하는 곳에서 아래와 같이 먼저 초기화 해주고.

MBzPrintf.MBzInitPrintf();

아래 처럼 로깅하면 된당...
MBzPrintf.MBzWriteLine(eBlk.BLK_MAIN, eLevel.D_NORMAL,
                    "=============== 서버를 시작합니다.==================");

MBzPrintf.MBzWriteLine(eBlk.BLK_MAIN, eLevel.D_NORMAL,
                    "=============== 서버를 끌께요.==================");

C#에 익숙치 않아서 시행착오가 참 많은데 아직까진 다 해결중...

enum 쓰는게 엄청 불편한데.. c처럼 되면 얼마나 좋아.. ㅜㅜ;

'Programming > C#' 카테고리의 다른 글

구조체 -> 바이트 배열, 바이트 배열 -> 구조체  (0) 2010.03.16