[C#] Logging on File
Log4Net 을 사용하다가 다소 불편한 감이 있어서
File 에 Log 를 작성하는 Class 를 간단하게 작성했습니다.
그냥 동적으로 로그 파일을 만들어서 확확 적어버리고 싶었거든요.
내용은 이렇습니다.
public enum LogLevel
{
NONE,
TRACE,
INFO,
DEBUG,
WARNING,
ERROR,
FATAL,
MANNUAL
}
public class Logger
{
public Logger()
{
}
/// <summary>
/// Format a log message based on log level
/// </summary>
/// <param name="level">Log level</param>
/// <param name="text">Log message</param>
public static int WriteLog(string filePath, string fileName, string text, LogLevel level = LogLevel.INFO, bool withLevel = true, bool append = true)
{
string DatetimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
string pretext = DateTime.Now.ToString(DatetimeFormat);
string strLevel = " : ";
if (withLevel)
{
switch (level)
{
case LogLevel.TRACE:
strLevel = " [TRACE] : ";
break;
case LogLevel.INFO:
strLevel = " [INFO] : ";
break;
case LogLevel.DEBUG:
strLevel = " [DEBUG] : ";
break;
case LogLevel.WARNING:
strLevel = " [WARNING] : ";
break;
case LogLevel.ERROR:
strLevel = " [ERROR] : ";
break;
case LogLevel.FATAL:
strLevel = " [FATAL] : ";
break;
default: break;
}
}
return WriteLine(filePath, fileName, pretext + strLevel + text);
}
/// <summary>
/// Format a log message based on log level
/// </summary>
/// <param name="level">Log level</param>
/// <param name="text">Log message</param>
public static async Task<int> WriteLogAsync(string filePath, string fileName, string text, LogLevel level = LogLevel.INFO, bool withLevel = true, bool append = true)
{
string DatetimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
string pretext = DateTime.Now.ToString(DatetimeFormat);
string strLevel = " : ";
if (withLevel)
{
switch (level)
{
case LogLevel.TRACE:
strLevel = " [TRACE] : ";
break;
case LogLevel.INFO:
strLevel = " [INFO] : ";
break;
case LogLevel.DEBUG:
strLevel = " [DEBUG] : ";
break;
case LogLevel.WARNING:
strLevel = " [WARNING] : ";
break;
case LogLevel.ERROR:
strLevel = " [ERROR] : ";
break;
case LogLevel.FATAL:
strLevel = " [FATAL] : ";
break;
case LogLevel.MANNUAL:
strLevel = " [MANNUAL] : ";
break;
default: break;
}
}
return await WriteLineAsync(filePath, fileName, pretext + strLevel + text);
}
/// <summary>
/// Write a line of formatted log message into a log file
/// </summary>
/// <param name="text">Formatted log message</param>
/// <param name="append">True to append, False to overwrite the file</param>
/// <exception cref="System.IO.IOException"></exception>
private static int WriteLine(string filePath, string fileName, string text, bool append = true)
{
int intReturn = 0;
if (string.IsNullOrEmpty(filePath))
throw new ArgumentNullException("filePath");
if (string.IsNullOrEmpty(fileName))
throw new ArgumentNullException("fileName");
if (string.IsNullOrEmpty(text))
throw new ArgumentNullException("text");
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
Thread.Sleep(100);
}
fileName = fileName + "_" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
filePath = Path.Combine(filePath, fileName);
text += "\r\n";
//byte[] buffer = Encoding.Unicode.GetBytes(text);
byte[] buffer = Encoding.UTF8.GetBytes(text);
Int32 offset = 0;
Int32 sizeOfBuffer = 4096;
//FileStream fileStream = null;
FileMode fileMode = FileMode.Append;
if (!append)
fileMode = FileMode.OpenOrCreate;
try
{
using (FileStream fileStream = new FileStream(filePath, fileMode, FileAccess.Write,
FileShare.None, bufferSize: sizeOfBuffer, useAsync: true))
{
fileStream.Write(buffer, offset, buffer.Length);
}
intReturn = 1;
}
catch (Exception ex)
{
//Write code here to handle exceptions.
string strMessage = ex.Message;
}
finally
{
//if (fileStream != null)
// fileStream.Dispose();
}
return intReturn;
}
static async Task<int> WriteLineAsync(string filePath, string fileName, string text, bool append = true)
{
int intReturn = 0;
if (string.IsNullOrEmpty(filePath))
throw new ArgumentNullException("filePath");
if (string.IsNullOrEmpty(fileName))
throw new ArgumentNullException("fileName");
if (string.IsNullOrEmpty(text))
throw new ArgumentNullException("text");
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
Thread.Sleep(100);
}
fileName = fileName + "_" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
filePath = Path.Combine(filePath, fileName);
text += "\r\n";
//byte[] buffer = Encoding.Unicode.GetBytes(text);
byte[] buffer = Encoding.UTF8.GetBytes(text);
Int32 offset = 0;
Int32 sizeOfBuffer = 4096;
//FileStream fileStream = null;
FileMode fileMode = FileMode.Append;
if (!append)
fileMode = FileMode.OpenOrCreate;
try
{
using (FileStream fileStream = new FileStream(filePath, fileMode, FileAccess.Write,
FileShare.None, bufferSize: sizeOfBuffer, useAsync: true)){
await fileStream.WriteAsync(buffer, offset, buffer.Length);
}
//fileStream = new FileStream(filePath, fileMode, FileAccess.Write,
//FileShare.None, bufferSize: sizeOfBuffer, useAsync: true);
//await fileStream.WriteAsync(buffer, offset, buffer.Length);
intReturn = 1;
}
catch(Exception ex)
{
//Write code here to handle exceptions.
string strMessage = ex.Message;
}
finally
{
//if (fileStream != null)
// fileStream.Dispose();
}
return intReturn;
}
}
사용은 ...
private async void WriteLog(string anyLocation, string logMessage, LogLevel level = LogLevel.INFO)
{
string strRootPath = Application.StartupPath;
string strPath = Path.Combine(strRootPath, anyLocation+ "_Logs");
await SystemLogger.WriteLogAsync(strPath, strFileName, logMessage, level);
}
이렇게 별도의 함수를 만들어 호출하여 사용하면 되겠습니다.
매번 async 를 붙이기도 귀찮더라고요. ^^;
WriteLog(anyLocation, "Write some Log.");
이제부터는 개떡같이 쓰여졌더라도 찰떡같이 알아 보시는 쎈스를 동원하시면 되겠습니다.
다른 방법이 있다면 알려주셔요~ ^^
행복한 고수되셔요. ^^
woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\