출처: http://drt0927.tistory.com/7?category=682501
log4net 사용 관련 참고 사이트 : http://hind.pe.kr/1199
log4net 설정 관련 참고 사이트 : http://egloos.zum.com/empty79/v/2956254
C#에서 logging을 할때 손쉽고 편하게 사용할 수 있는 라이브러리를 소개하려한다.
Log4Net이라는 라이브러리 이다.
이 라이브러리는 log4j라는 java라이브러리에서 따온것이라고 알고있다.
log4net에 대한 자세한 내용은 홈페이지를 참조 바랍니다.
https://logging.apache.org/log4net/
1. 사용 방법
- Nuget으로 Log4Net을 검색하면 아파치 log4net이 제일 상위에 나타난다
"설치"버튼을 클릭하면 사용준비 끝.
2. 설정 파일
- 사실 설정 파일에 대해 정확하게 알지 못한다. 일단 구글링을 통해 알아본 기본적인 틀을 확인해보자.
응용 프로그램의 경우 app.config 파일에 설정 내용을 입력 하지만 나는 asp.net에서 로깅을 하려하기 때문에
별도의 LogConfig.xml 파일을 생성하였다. (web.config에 하면 되려나)
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="C:\Log\">
<appendtofile value="true">
<datepattern value="yyyy-MM-dd'_Log.log'">
<staticlogfilename value="false">
<rollingstyle value="Date">
<layout type="log4net.Layout.PatternLayout">
<conversionpattern value="%d [%t] %-5p - %m%n">
</conversionpattern></layout>
</rollingstyle></staticlogfilename></datepattern></appendtofile></file></appender>
<root>
<level value="ALL">
<appender-ref ref="RollingFile">
</appender-ref></level></root>
</log4net>
<appender> 태그는 로그를 어떤식으로 남길 것인지에 대한 큰 틀이라고 보면된다.
appender 태그 안에서 파일을 어느곳에 만들것인지 파일이름을 어떻게 할것인지 로그 패턴을 어떻게 할것인지를 정할 수 있다.
<root> 태그는 기본 logger 설정을 하며, level 태그는 ALL, Warn, 등등 으로 나뉘며 해당 레벨 이상의 로그만 로그파일에 쓰길 원할경우 설정한다.
appender-ref 태그에는 appender의 name을 입력하여 연결을 해준다.
3. 소스
//using 해준다.
using log4net;
using log4net.Config;
//로깅할 곳에 로그 변수 추가
private ILog _logger = null;
public readonly ILog Logger
{
get { return _Logger; }
}
string strDirPath;
strDirPath = @"C:\Log";
DirectoryInfo dirInfo = new DirectoryInfo(strDirPath);
<strike>//log4net에서 폴더를 만들어주는지 안만들어주는지 몰라서.. 일단 혹시나해서 만듦</strike><p>
if (dirInfo.Exists == false)
{
if (dirInfo != null)
dirInfo.Create();
}
//LogConfig.xml 경로를 설정해준다.
string AppPath = AppDomain.CurrentDomain.BaseDirectory;
//log4net.config 하위의 xmlconfigurator에 설정 파일을 등록한다.
XmlConfigurator.Configure(new System.IO.FileInfo(AppPath + @"bin\LogConfig.xml"));
//설정파일의 appender의 name에 아까 입력한 RollingFile을 입력하여 logger를 추가한다.
_logger = log4net.LogManager.GetLogger("RollingFile");
// ----------- 이렇게 해서 기본적인 변수 선언과 사용준비는 끝.
// 사용
//error
if(_logger.IsErrorEnabled)
_logger.Error("Error!!!!!!!!!!!");
if(_logger.IsDebugEnabled)
_logger.Debug("Debug!!!!!!!!!!!");
if(_logger.IsInfoEnabled)
_logger.Info("Info!!!!!!!!!!!");
</p>
로그를 남길때 수준을 정할 수 있다.
Error, Fatal, Warn, Info, Debug
이렇게 해서 로그 파일을 확인해 보면 아래와 같이 로그가 남는 것을 확인 할 수 있다.
*log4net을 사용하다 보면 남겨야 하는 로그의 성격이 다른 것들이 있다. 이럴경우 로그파일을 나눠서 로그를 남기고 싶을 경우가 있다.
이럴 경우에는 설정파일을 살짝 바꿔서 사용하면된다.
아래와 같이 appender를 추가하고 logger를 추가해주면 끝. 알기쉽게 이름을 잘 지어주면 끝.
눈치가 빠른 사람들은 소스에서 어떻게 사용하는지도 대충은 파악했을 것이다.
<p><log4net>
<appender name="Common" type="log4net.Appender.RollingFileAppender">
<file value="C:\Log\" />
<appendToFile value="true" />
<datePattern value="yyyy-MM-dd'_Common.log'" />
<staticLogFileName value="false" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p - %m%n" />
</layout>
</appender>
<appender name="Socket" type="log4net.Appender.RollingFileAppender">
<file value="C:\Log\" />
<appendToFile value="true" />
<datePattern value="yyyy-MM-dd'_Socket.log'" />
<staticLogFileName value="false" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p - %m%n" />
</layout>
</appender>
<appender name="Database" type="log4net.Appender.RollingFileAppender">
<file value="C:\Log\" />
<appendToFile value="true" />
<datePattern value="yyyy-MM-dd'_Database.log'" />
<staticLogFileName value="false" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p - %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
</root>
<logger name="Common">
<level value="ALL" />
<appender-ref ref="Common" />
</logger>
<logger name="Socket">
<level value="ALL" />
<appender-ref ref="Socket" />
</logger>
<logger name="Database">
<level value="ALL" />
<appender-ref ref="Database" />
</logger>
</log4net>
</p>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using log4net.Config;
using System.IO;
namespace Logging
{
public class Logger
{
private static readonly object locker = new object();
private ILog _Logger = null;
public readonly ILog ll
{
get { return _Logger; }
}
public Logger(string log)
{
_Logger = log4net.LogManager.GetLogger(log);
}
#region Log Append Func
//.. <summary>
//.. 치명적 장애 발생시 Log Append
//.. </summary>
//.. <param name="message">
public void appendFatalLog(string message)
{
lock (locker)
{
DeleteLogFile();
if (_Logger.IsFatalEnabled)
_Logger.Fatal(message);
}
}
//.. <summary>
//.. 일반적 장애 발생시 Log Append
//.. </summary>
//.. <param name="message">
public void appendErrorLog(string message)
{
lock (locker)
{
DeleteLogFile();
if (_Logger.IsErrorEnabled)
_Logger.Error(message);
}
}
//.. <summary>
//.. 경고 Log Append
//.. </summary>
//.. <param name="message">
public void appendWarnLog(string message)
{
lock (locker)
{
DeleteLogFile();
if (_Logger.IsWarnEnabled)
_Logger.Warn(message);
}
}
//.. <summary>
//.. 정보 Log Append
//.. </summary>
//.. <param name="message">
public void appendInfoLog(string message)
{
lock (locker)
{
DeleteLogFile();
if (_Logger.IsInfoEnabled)
_Logger.Info(message);
}
}
//.. <summary>
//.. 디버그 TRACE용 Log Append
//.. </summary>
//.. <param name="message">
public void appendDebugLog(string message)
{
lock (locker)
{
DeleteLogFile();
if (_Logger.IsDebugEnabled)
_Logger.Debug(message);
}
}
#endregion
public void DeleteLogFile()
{
try
{
string folderPath = @"C:\Log\";
DirectoryInfo dirInfo = new DirectoryInfo(folderPath);
if (dirInfo != null)
{
foreach (FileInfo file in dirInfo.GetFiles())
{
if (file.Extension != ".log")
continue;
if (file.CreationTime < DateTime.Now.AddDays(-10))
file.Delete();
}
}
dirInfo = null;
}
catch (Exception ex)
{
appendErrorLog(string.Format("Log File Delete Error\r\nMessage : {0}\r\nStack Trace :\r\n{1}", ex.Message, ex.StackTrace));
}
}
}
public class LogManager
{
private static LogManager _instance;
private static readonly object locker = new object();
public Logger iLog_Common = null;
public Logger iLog_Socket = null;
public Logger iLog_Database = null;
public static LogManager Instance()
{
lock (locker)
{
if (_instance == null)
_instance = new LogManager();
return _instance;
}
}
public LogManager()
{
string strDirPath;
strDirPath = @"C:\Log";
DirectoryInfo dirInfo = new DirectoryInfo(strDirPath);
if (dirInfo.Exists == false)
{
if (dirInfo != null)
dirInfo.Create();
}
string AppPath = AppDomain.CurrentDomain.BaseDirectory;
XmlConfigurator.Configure(new System.IO.FileInfo(AppPath + @"bin\Logconfig.xml"));
iLog_Common = new Logger("Common");
iLog_Socket = new Logger("Socket");
iLog_Database = new Logger("Database");
}
}
}
'언어 > C#' 카테고리의 다른 글
log관련 (0) | 2018.03.19 |
---|---|
STREAMWRITER로 텍스트 로그 남기기 (0) | 2018.03.18 |
ini file 사용법 (0) | 2018.03.18 |
C# Tutorials - Create Custom/Professional UI in WinForms app (0) | 2018.03.17 |
참고사이트 (0) | 2018.03.13 |