.NET Application 을 이용해서 새로운 프로젝트를 만들때마다 프로그램 로그를
기록할 괜찮은 Library가 없어 매번 방황하거나 간단하게 Trace나 FileInfo로 열어서 쌓는 수준으로만 해왔다.
좀 찾아보다가 Log4Net 이란 것을 발견했다.(지인의 소개로 발견 ^^;;)
간단한 형식으로 빠르게 FileInfo 를 열어서 파일에 기록하면 시간은 단축할 수 있다.
그러나 매번 잊어먹는 Syntax찾아가며 새로 작성하기란 여간 힘든 일이 아니다.
더군다나 멀티 스레드 동기화 까지 하라고 하면 하다가 GG 치는 경우가 많다.
이 Log4Net은 파일로도 쓰고
Database에도 쌓고
여타 다른 매체에도 손쉽게 설정만 해주면 사용가능한 유용한 Library이다.
물론 Thread Safe 하게 작성되어졌으리라 믿어 의심치 않는다.(믿는 도끼에 발등...)
Log4Net 의 간단한 History 나 Log4J 에 관한 상세 내용은 링크 사이트를 참조하길 바란다.
간단하게 파일과 MS SQL Server 에 Log를 쌓는 예제를 .NET C#을 이용해 작성해보았다.
1. 예제환경
- OS: Microsoft Windows XP Professional Version 2002 Service Pack 2( 길다..-_-;)
- IDE: Microsoft Visual Studio 2005 Professional Edition
- Language: C#
- .NET Framework v2.0.50727
- MS-SQL 2000
2. Log4Net Download
- 여기에서 다운로드 받은 다음에 압축을 푼다.
3. Log4Net 을 이용한 간단한 로그 쓰기 예제(Console, 파일, Database)
3.1 Project 생성 ( C# 프로젝트 간단하게 Console 이나 Windows Application 으로 생성)
3.2 Add Reference
- download 받은 Log4Net 안에서 log4net-x.x.xx\bin\net\ 에 들어가서 적당한 버전
선택 후 log4net.dll, log4net.pdb 를 복사한 다음 프로젝트 Root에 넣고 IDE 에서
Add Reference 를 한다.
(Add Reference를 할때 Browse Tab 에서 Dll을 직접 선택하면 된다.)
3.3 Log4Net configuration File
- 설정파일(.xml)은 프로젝트에 Root에 넣어두면 Build 될때 Bin\Debug or Release
밑으로 자동 복사된다.
- 공용으로 쓰기위해 어디에다가 위치시켜도 좋지만 편의를 위해서 .exe 가
Project Root에 두면 상대경로 지정이 가능하기에 편의상 프로젝트 Root에 두었다.
- 첨부된 예제의 설정파일에 보면 <appender>...</appender> 가 3개 존재 한다.
- 각각이 차례대로 Console, File, Database를 쓰는 예제이다.
- 주의 사항
1. 설정파일의 맨 마지막 하단에 작성한 appender-ref 를 추가하는 것을 잊으면
안된다. 빠뜨려서 동작하지 않는 경우가 발생한다.
2. Database 부분의 Appender가 있는데 bufferSize를 통상 100으로 된 곳도 있는데
그렇게 하면 100라인이 될때까지 로그를 쓰지 않아 동작하지 않는다고 오해한다.
1로 고치면 해결된다.
3. 현재 자신의 .Net Framework 버전이 1.1 인지 2.0인지에 따라서 Database
appender에 <connectionType> 에 value 정보의 Version 정보를 정확히
기재해주어야한다. 그렇지 않으면 이 역시 오동작을 하게 될 것이다.
SqlConnection 의 버전 정보를 읽어오는 방법은 다음과 같이 잠시 써서
AssemblyName을 얻으면 Version 정보도 포함되어 있으니 확인가능하다.
----- AssemblyName 버전 확인 방법 ----
SqlConnection sq = new SqlConnection();
sq.ConnectionString = "";
Assembly asm = Assembly.GetAssembly(sq.GetType());
AssemblyName asmName = asm.GetName();
4. Database에 Table은 Log 라는 Table 명으로 미리 만들어 둔다.
CREATE TABLE [Log2] (
[Id] [int] IDENTITY (1, 1) NOT NULL ,
[Date] [datetime] NOT NULL ,
[Thread] [varchar] (255) NOT NULL ,
[Level] [varchar] (50) NOT NULL ,
[Logger] [varchar] (255) NOT NULL ,
[Message] [varchar] (4000) NOT NULL ,
[Exception] [varchar] (2000) NULL
) ON [PRIMARY]
GO
5. Log Level 은 appender-ref 가 있는 <root> 부분에 있으니 설정하면 설정한
로그레벨 이상만 출력이 될것이다.
DEBUG < INFORMATION < WARNING < ERROR < FATAL 순서이다.
< 예제로 작성된 .cs를 참고 하자 >
< 예제로 작성된 설정파일을 참고 하자 >
손쉬운 프로그램 로그 Library로 Log Library 작성하는 삽질은 피해보자.