C# - Simple Winform Logger

로그 클래스. DevLog

//
public enum LOG_LEVEL
{
    TRACE,
    DEBUG,
    INFO,
    WARN,
    ERROR
}

public class DevLog
{
    static System.Collections.Concurrent.ConcurrentQueue<string> logMsgQueue = new System.Collections.Concurrent.ConcurrentQueue<string>();

    static LOG_LEVEL 출력가능_로그레벨 = new LOG_LEVEL();

    static public void Init(LOG_LEVEL logLevel)
    {
        출력가능_로그레벨 = logLevel;
    }

    static public void ChangeLogLevel(LOG_LEVEL logLevel)
    {
        출력가능_로그레벨 = logLevel;
    }

    static public void Write(string msg, LOG_LEVEL logLevel = LOG_LEVEL.TRACE, 
                            [CallerFilePath] string fileName = "",
                            [CallerMemberName] string methodName = "",
                            [CallerLineNumber] int lineNumber = 0)
    {
        if (출력가능_로그레벨 <= logLevel)
        {
            logMsgQueue.Enqueue(string.Format("{0}:{1}| {2}", DateTime.Now, methodName, msg));
        }
    }

    static public bool GetLog(out string msg)
    {
        if (logMsgQueue.TryDequeue(out msg))
        {
            return true;
        }

        return false;
    }

}

폼에서 타이머를 이용하여 로그를 가져와서 리스트박스에 출력한다.

private void OnProcessTimedEvent(object sender, EventArgs e)
{
    // 너무 이 작업만 할 수 없으므로 일정 작업 이상을 하면 일단 패스한다.
    int logWorkCount = 0;

    while (true)
    {
        string msg;

        if (CommonLib.DevLog.GetLog(out msg))
        {
            ++logWorkCount;

            if (listBoxLog.Items.Count > 100)
            {
                listBoxLog.Items.Clear();
            }

            listBoxLog.Items.Add(msg);
            listBoxLog.SelectedIndex = listBoxLog.Items.Count - 1;
        }
        else
        {
            break;
        }

        if (logWorkCount > 7)
        {
            break;
        }
    }
}

로그 처리용 타이머 정의

System.Windows.Threading.DispatcherTimer workProcessTimer = new System.Windows.Threading.DispatcherTimer();
workProcessTimer.Tick += new EventHandler(OnProcessTimedEvent);
workProcessTimer.Interval = new TimeSpan(0, 0, 0, 0, 32);
workProcessTimer.Start();

로그 사용

DevLog.Write(string.Format("새로 등록"), LOG_LEVEL.INFO);

이 글은 2019-03-24에 작성되었습니다.