글쓴이 보관물: Toughman

C# NLog 이용하여 WebForm, WinForm 로그 만들기

로그의 필요성

개발을 진행하면서 개발 도구를 가지고 디버깅을 하게 됩니다. WebFrom의 Javascript 부분은 console.log 로 값을 확인하거나 화면에 직접 출력해서 변수의 값을 확인합니다. 하지만 실제로 운영이 되고 있는 시스템에서 문제가 발생하면 그 상황에 대한 정보가 있어야 해결이 가능합니다. 이런 이유 때문에 로그가 필요합니다. 기본적으로는 최소화하는 것이 좋습니다. 하지만 운영 초기에는 가능한 한 로그 자료를 많이 생성합니다. 문제가 발생했을 때 해결시간을 최소화하는데 중점을 둡니다.

대부분 메소드 호출 부분에 전달된 변수의 값이나 예외의 내용을 기록합니다. 예외의 내용을 사용자에게 직접적으로 노출하지 않고 개발자가 확인할 수 있는 방법입니다.

이전에는 간단하게 텍스트 파일을 만들어 로깅을 진행했습니다. 물론 지금도 그렇게 사용해도 되지만 잘 만들어진 로그 라이브러리를 사용하는 것이 더 나은 선택입니다. 대표적인 것이 NLog, log4net 입니다. 설정이 상대적으로 쉬운 NLog 를 이용한 로깅에 대해 살펴보겠습니다.

NLog

NLog 는 무료로 사용할 수 있는 .NET용 로깅 플랫폼 입니다. 설정이 쉬운 것이 장점입니다. log4net을 사용해 본적이 있었습니다. 설정이 생각보다 쉽지는 않았던 기억이  납니다.

로그의 내용을 파일, 이벤트로그, 데이터 베이스 등에도 기록할 수 있습니다. 개발 환경에 맞게 선택해서 기록하면 됩니다. 필자는 일자별로 텍스트 파일로 기록합니다.

설치는 패키지 관리자 콘솔에서 다음 명령어를 입력하면 됩니다.

PM> Install-Package NLog.Config

WebForm(ASP.NET)

ASP.NET 프로젝트일 때 설정하는 방법을 알아보겠습니다.

설정은 파일이나 소스에 직접할 수 있습니다. 이 글에서는 파일에 설정하는 방법을 살펴보겠습니다.

NLog.config 의 내용을 수정해서 설정하면 됩니다.

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <variable name="LogDay" value="${date:format=yyyyMMdd}"/>;
    <targets>
        <target name="logfile" xsi:type="File" fileName="D:\yourserver\yourproject\log\${LogDay}.log" />
    </targets>
    <rules>
        <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>
</nlog>

3행은 일자의 형식을 지정하는 설정입니다. 20180127.log 이런식으로 파일이 생성됩니다.

5행은 실제 로그 파일이 저장될 위치입니다.

추가적인 설정은 NLog 사이트를 참고하여 필요하신 사항을 추가하시면 됩니다. 필자는 위의 설정만으로도 충분했습니다. NLog.config 파일은 web root 경로에 두시면 됩니다.

소스에서는 다음과 같이 코드를 추가해서 사용하면 됩니다.

public partial class nlog_test : System.Web.UI.Page
{
	private static Logger logger = LogManager.GetCurrentClassLogger();

	protected void Page_Load(object sender, EventArgs e)
	{
		try
		{
			logger.Info("your log text");
		}
		catch (Exception ex)
		{
			logger.Fatal("Exception occurred in Page_Load. : " + ex.Message + ";" + ex.Source);
		}
	}
}

로그 파일에는 다음과 같이 기록됩니다.

2017-12-26 00:03:46.3420|INFO||your log text
2017-12-26 00:12:27.9778|FATAL||Exception occurred in Page_Load : your error message ;mscorlib

로그 파일이 저장되는 경로가 쓰기 권한이 없으면 기록이 되지 않는 경우가 있습니다. 경로가 정확한데 로그파일이 생성되지 않는다면 인터넷 사용자(IUSR)의 쓰기 권한을 부여하시면 됩니다.

WinForm

WinForm의 경우도 설정은 같습니다. 특정한 폴더에 로그가 기록되도록 하고 싶으면 위와 같이 설정하시면 됩니다. 프로그램이 실행된 폴더의 하위에 생성되도록 하고 싶다면 다음과 같이 설정합니다.

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <variable name="LogDay" value="${date:format=yyyyMMdd}"/>
    <targets>
        <target name="logfile" xsi:type="File" fileName="log\${LogDay}.log" />
    </targets>
    <rules>
        <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>
</nlog>

이렇게 하면 프로그램이 실행된 폴더의 하위에 log 폴더가 생성되고 그 안에 날짜별로 로그파일이 생성됩니다.
NLog.config 파일은 실행파일이 있는 경로에 두시면 됩니다.

이상 NLog를 이용한 로깅에 대해 알아봤습니다.

라이켈(Reikel) 차량용 스마트폰 거치대

구매동기

스마트폰을 운전할 때 거치하려고 간단한 제품을 구입했었습니다. 접착식으로 고정하면 떼어내기 어려워 송풍구에 장착하는 제품을 선택했었습니다. 그런데 여름에 에어컨을 켜거나 겨울에 히터를 틀면 직접 바람을 맞게 되었습니다. 그래서 스마트폰이 차갑게 되거나 뜨겁게 되는 문제가 있었습니다. 다른 것이 없을까 검색 하다가 송풍구에 장착하면서 바람 온도에 영향을 받지 않는 제품이 있었습니다. 바로 라이켈(Reikel) 차량용 스마트폰 거치대 였습니다.

상품선택

우선 접착식이 아닌 송풍구에 장착하는 제품을 위주로 검색했습니다. 그 다음으로 스마트폰이 바람을 맞는 것을 최소화하는 조건으로 선택했습니다. 그래서 라이켈(Reikel) 차량용 스마트폰 거치대 를 구매하게 되었습니다. 송풍구에 장착하지만 스마트폰의 위치는 위쪽이어서 바람을 직접 맞지 않았습니다.

상자 앞면

상자 앞면

상자 뒷면

상자 뒷면

모든 송풍구에 사용할 수 없는데 상자의 옆면에 표기되어 있습니다.

상자 옆면 - 사용 가능한 송풍구 모양이 안내되어 있다

상자 옆면 – 사용 가능한 송풍구 모양이 안내되어 있다

상자의 다른 옆면에는 제품의 장점이 간략하게 기재되어 있습니다.

상자 옆면

상자 옆면

제품설치

제품을 상자에서 꺼내보면 아래와 같은 모양 입니다.

제품 모양

제품 모양

아래쪽 회색부분을 송풍구에 끼워 장착하도록 제작되어 있습니다. 스마트폰이 거치되는 부분은 둥근 형태로 되어 있어 자유롭게 움직일 수 있도록 되어 있습니다. 스마트폰을 가로나 세로 원하는 방향으로 움직일 수 있습니다.

거치 부분 연결 모습

거치 부분 연결 모습

송풍구에 장착하는 부분의 틈을 벌리기가 조금 어렵습니다. 아마 쉽게 송풍구에서 떨어지지 않도록 그렇게 되어 있는것 같았습니다.

송풍구 연결부분

송풍구 연결부분

장착할 때 그냥 힘을 주어 누르니 송풍구 날개 부분이 부러진듯한 모양이 되었습니다. 순간 부러진 줄 알았는데 자세히 보니 연결부분이 분리되어 그런 것 이었습니다. 모양을 바로잡고 조심스럽게 송풍구에 빠지지 않도록 부착했습니다. 연결부분을 잘 벌려서 송풍구 사이에 너무 힘을 주지 않고 끼워넣는 것이 요령인 것 같습니다.

차량 송풍구 설치 모습

차량 송풍구 설치 모습

부착을 해보니 거치대 자체의 무게가 있어서 그런지 바람 방향을 정해주는 날개(?) 부분이 아래로 쳐졌습니다. 쳐지지 않게 하려면 뭔가 다른 지지대가 있어야 할 것 같았습니다. 스마트폰을 거치해보니 운전석에서 보기좋은 각도가 되지 않아 위치를 바꾸어 보았습니다. 한손으로 바꾸려고 하니 거치대에서 스마트폰이 쉽게 떨어질 것 같은 느낌이 들었습니다. 또한 거치대 자체가 송풍구에서 분리될 것 같은 느낌도 같이 들었습니다. 기둥이 되는 부분을 한손으로 잡고 살살 위치를 변경하는 것이 요령입니다.

스마트폰을 거치하고 네비게이션 용도로 사용하면서 운행해 보았습니다.  약간의 흔들림은 있지만 스마트폰이 분리되어 떨어지는 문제는 없었습니다. 다만 스마트폰을 고정하는 부분의 높이가 생각보다는 낮아서 조금 높았으면 좋겠다는 생각이 들었습니다.

송풍구에서 나오는 바람을 직접 맞는 것이 꺼려진다면 이 제품이 적당할 것으로 생각됩니다.