C# - 디버깅(로그 출력 및 저장)

Code April·2022년 4월 28일
0

C#

목록 보기
5/12

앱 개발 및 유지 보수에 있어 디버깅 또한 많은 노력과 시간이 필요 합니다.
디버깅은 통합 개발환경(Visual Studio,Android Studio,Xcode등)에서 지원 하며,
또한 필요한 부분에 개발자가 로그(log)를 추가하여 분석을 진행할 수 있습니다.

로그를 통한 디버깅 방법 및 릴리즈모드에서 로그를 파일로 저장하는 방법을
간단한 앱을 통해서 확인해 보도록 하겠습니다.

프로젝트 위치는 아래와 같습니다.
GitHub : https://github.com/cocoknight/myblog/tree/main/C%23/LogHandler/HelloLog


  1. HelloLog실행 화면

    실행 후, "로그 텍스트박스","로그 메시지박스"버튼을 눌렀을 때의 결과가 바로 위 화면
    입니다. 해당 부분은 특별히 설명을 하지는 않겠습니다.


  2. 로그 콘솔 출력(디버그모드 실행)
    현재 프로젝트는 Visual Studio Community 2019에서 제작되었습니다.

  • 디버그모드 실행
    Github에서 프로젝트를 다운받으 신후,
    HelloLog.sln파일을 더블 클릭 합니다.

    통환환경(Visual Studio Community)에서 다음과 같이 빌드 모드를 설정 합니다.
    반드시 실행 모드를 "Debug"로 설정하셔야 합니다.

    설정 후, "F5"키 또는 "디버그메뉴 - 디버깅시작"을 선택해서 프로젝트를 실행 합니다.

    화면에서 "로그 콘솔 출력(디버그모드 실행)"을 선택하면 아래 코드를 실행 합니다.
    현재 디버그 모드로 실행중이기 때문에, 아래에 기술된 3가지 방법중 어떤 것을 사용해도
    콘솔창에 메세지를 출력 할 수 있습니다.
    문자열 출력 시 {0},{1}의 인덱스는 ","이후에 나오는 문자열의 순서와 matching이 됩니다.
    _s_testTime이 인덱스 0, _helloString이 인덱스 1이 됩니다.

     private void btnConsole_Click(object sender, EventArgs e)
     {
       _testTime = System.DateTime.Now;
       _s_testTime = string.Format("{0:hh:mm:ss tt}", _testTime);
    
       Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
       Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
       Console.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
      }

    콘솔의 출력 결과는 다음과 같습니다.

    통홥환경(Visual Studio Community)의 콘솔창에 로그 메세지 출력을 확인할 수 있습니다.


  1. 로그파일 출력(디버그모드 실행) / 5.로그파일 출력(릴리즈모드 실행)
    로그메세지를 콘솔이 아닌 파일로 출력하는 방법을 확인해 보겠습니다.
    디버그모드 실행은 방법은 이전버튼에서 설명 드렸습니다.
    릴리즈모드 실행의 의미는 "Ctrl+F5"또는 "디버그" 메뉴 선택 "디버그 하지 않고시작"과
    동일한 의미 입니다.

    앱이 배포될 때는 릴리즈모드로 배포 됩니다. 따라서 해당모드에서 프로그램이 실행 될때
    로그를 확보하고 싶은 경우, 사용되는 방법입니다.

private void btnDebug_Click(object sender, EventArgs e)
{
  this.turnon_log_dump();

  _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
  Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));

  Thread.Sleep(1000);
  _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
  Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));

  Thread.Sleep(1000);
  _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
  Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));

  Thread.Sleep(1000);
  _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
  Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));


  //TOAN : 12/14/2022. Debug Mode에서 Debug와 Trace출력 테스트...
   Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니???"));
   Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니/한번만 더 확인해줘???"));


   Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니???"));
   Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???"));

}

private void btnRelease_Click(object sender, EventArgs e)
{
    //step1 : setup about TextWriterTraceListener
    this.turnon_log_dump();

    //step2 : write a log
    //step1이 완료된 후, Trace.WriteLine은 콘솔이 아닌 step1에서 지정한
    //파일에 내용이 저장 된다.
    _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
    //Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
    Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));

    Thread.Sleep(1000);
    _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
    Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));

    Thread.Sleep(1000);
    _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
    Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));


    Thread.Sleep(1000);
    _s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
    Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));

    Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니???"));
    Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니/한번만 더 확인해줘???"));


    Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니???"));
    Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???"));

}

위 코드에서 turnon_log_dump메서드의 내용을 확인해 보겠습니다.

public void turnon_log_dump()
{
  try
  {
    //Log Fild이 저장될 경로 지정
    //아래와 같이 지정하면, 앱의 실행파일이 위치한 경로에 
    //logdump.txt이름으로 로그가 저장 된다.
    string ExportFilePath = Path.GetDirectoryName(Application.ExecutablePath);
    string app_verification_log = ExportFilePath + @"\logdump.txt";

    //TextWriterTraceListener생성.
    //생성할 때 생성자의 인자로 로그 파일 경로 지정
    TextWriterTraceListener cListener = new TextWriterTraceListener(System.IO.File.Open(
    app_verification_log, FileMode.Append));
    
    //Trace의 리스너로 등록
    Trace.Listeners.Add(cListener);
    Trace.AutoFlush = true;
    }catch(Exception ex)
    {
        Debug.WriteLine(string.Format("Full Stacktrace: {0}", ex.ToString()));
    }

}

turnon_log_dump메서드는 크게 로그파일 이름 및 경로를 지정하고,TextWriteListener를
생성한 후 Trace에 생성한 Listener를 등록하는 것이다.
이렇게 등록된 후 부터는 로그 출력이 파일로 저장 됩니다.

  • 로그 파일 출력(디버그모드 실행)의 결과
  • 디버그모드 로그 저장 위치

저장된 내용은 아래와 같습니다.
File : logdump.txt(C:\myworld\VSProject\LogHandler\HelloLog\bin\Debug)
08:06:08 오후:Hello C# World!,
08:06:09 오후:Hello C# World!,
08:06:10 오후:Hello C# World!,
08:06:11 오후:Hello C# World!,
Debug 모드에서 , Debug.Write해도 파일로 저장되니???
Debug 모드에서 , Debug.Write해도 파일로 저장되니/한번만 더 확인해줘???
Debug 배포모드에서 , Trace.Write해도 파일로 저장되니???
Debug 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???

중요한 것은 디버그 모드로 빌드했을 경우는 Debug.WriteLine, Trace.WriteLine
이 결과가 모두 파일로 저장 된다는 것이다.


  • 로그 파일 출력(릴리즈모드 실행)의 결과

  • 릴리즈모드 로그 저장 위치

    저장된 내용은 아래와 같습니다.
    File : logdump.txt (C:\myworld\VSProject\LogHandler\HelloLog\bin\Release)
    08:09:20 오후:Hello C# World!,
    08:09:21 오후:Hello C# World!,
    08:09:22 오후:Hello C# World!,
    08:09:23 오후:Hello C# World!,
    Relase 배포모드에서 , Trace.Write해도 파일로 저장되니???
    Relase 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???

    릴리즈모드로 빌드했을 때는 btnRelease_Click함수 안에 명시적으로 Debug.WriteLine
    코드가 있음에도 해당 코드는 실행되지 못하고, 따라서 로그파일안에도 Debug.WriteLine
    의 로그는 저장되어 있지 않다.

profile
Next Level

0개의 댓글