[성현모] Log4net 개선

This commit is contained in:
SHM
2025-04-30 14:13:58 +09:00
parent f62f74fa44
commit 0a999434f0
9 changed files with 173 additions and 32 deletions

Binary file not shown.

View File

@ -19,6 +19,8 @@ public enum LogType
Fatal = 4, Fatal = 4,
//custom level //custom level
Exception = 7,
DB = 10, DB = 10,
HTTP = 20, HTTP = 20,
@ -30,6 +32,7 @@ public enum LogType
#region CustomLevel #region CustomLevel
public static class Log4netCustomLevel public static class Log4netCustomLevel
{ {
public static readonly log4net.Core.Level EXCEPTION = new log4net.Core.Level(10007, LogType.Exception.ToString());
public static readonly log4net.Core.Level DB = new log4net.Core.Level(10010, LogType.DB.ToString()); public static readonly log4net.Core.Level DB = new log4net.Core.Level(10010, LogType.DB.ToString());
public static readonly log4net.Core.Level HTTP = new log4net.Core.Level(10020, LogType.HTTP.ToString()); public static readonly log4net.Core.Level HTTP = new log4net.Core.Level(10020, LogType.HTTP.ToString());
public static readonly log4net.Core.Level SOCKET = new log4net.Core.Level(10021, LogType.SOCKET.ToString()); public static readonly log4net.Core.Level SOCKET = new log4net.Core.Level(10021, LogType.SOCKET.ToString());
@ -37,6 +40,7 @@ public static class Log4netCustomLevel
public static void SetCustomLevel(ILoggerRepository repo) public static void SetCustomLevel(ILoggerRepository repo)
{ {
repo.LevelMap.Add(EXCEPTION);
repo.LevelMap.Add(DB); repo.LevelMap.Add(DB);
repo.LevelMap.Add(HTTP); repo.LevelMap.Add(HTTP);
repo.LevelMap.Add(SOCKET); repo.LevelMap.Add(SOCKET);
@ -53,7 +57,16 @@ public static class Log4net
public static bool IsConfigLoad { get; set; } = false; public static bool IsConfigLoad { get; set; } = false;
//로그 사용여부
public static bool IsDebugEnabled { get; set; } = true;
public static bool IsDBEnabled { get; set; } = true;
public static bool IsHttpEnabled { get; set; } = true;
public static bool IsSocketEnabled { get; set; } = true;
public static bool IsControllerEnabled { get; set; } = true;
//자동삭제
private static bool AutoRemove { get; set; } = false;
private static int AutoRemoveKeepingDay = 30;
static Log4net() static Log4net()
{ {
@ -62,11 +75,11 @@ public static class Log4net
if (File.Exists(log4netConfigPath) == true) if (File.Exists(log4netConfigPath) == true)
{ {
File.Delete(log4netConfigPath); File.Delete(log4netConfigPath);
Console.WriteLine($"Create log4netConfig: {log4netConfigPath}");
File.WriteAllText(log4netConfigPath, Config);
} }
Console.WriteLine($"Create log4netConfig: {log4netConfigPath}");
File.WriteAllText(log4netConfigPath, Config);
IsConfigLoad = OpenConfig(log4netConfigPath); IsConfigLoad = OpenConfig(log4netConfigPath);
} }
@ -94,7 +107,53 @@ public static class Log4net
return result; return result;
} }
public static void WriteLine<T>(T log, LogType logType = LogType.Info) public static void AutoRemoveLog(int autoRemoveKeepingDay = 30)
{
if (AutoRemove == false)
{
AutoRemove = true;
AutoRemoveKeepingDay = autoRemoveKeepingDay;
string logDirectory = @$"{Path.GetDirectoryName(Environment.ProcessPath)}\log";
Log4net.WriteLine($"Log4net Auto Remove: {AutoRemove}, Remove Day: -{AutoRemoveKeepingDay}", LogType.Warn);
Log4net.WriteLine($"Log4net Auto Path: {logDirectory}", LogType.Warn);
Task.Run(async () =>
{
//1분후 시작
await Task.Delay(TimeSpan.FromMinutes(1));
while (true)
{
var files = Directory.GetFiles(logDirectory, "*.log", SearchOption.AllDirectories);
foreach (var file in files)
{
var lastAccessDateTime = File.GetLastWriteTime(file);
if (lastAccessDateTime < DateTime.Now.AddDays(AutoRemoveKeepingDay * -1))
{
try
{
//File.Delete(file);
WriteLine($"Remove log: {Path.GetFileName(file)}", LogType.Warn);
}
catch
{
WriteLine($"Using log file: {Path.GetFileName(file)}", LogType.Warn);
}
}
}
//일정시간마다 반복
Log4net.WriteLine($"Log Auto Remove Run", LogType.Warn);
await Task.Delay(TimeSpan.FromHours(12));
}
});
}
}
public static void WriteLine<T>(T log, LogType logType = LogType.Info, bool trace = false,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{ {
if (IsConfigLoad == false) if (IsConfigLoad == false)
{ {
@ -103,78 +162,150 @@ public static class Log4net
return; return;
} }
if(log is Exception ex)
{
WriteLineException(ex, memberName, sourceFilePath, sourceLineNumber);
return;
}
string strTrace = $"TRACE::[{Path.GetFileName(sourceFilePath)}][Method:{memberName}][LINE:{sourceLineNumber}]";
switch (logType) switch (logType)
{ {
case LogType.Info: case LogType.Info:
{ {
if (trace == true)
{
Manager?.Info($"{strTrace}");
}
Manager?.Info(log); Manager?.Info(log);
break; break;
} }
case LogType.Warn: case LogType.Warn:
{ {
if (trace == true)
{
Manager?.Warn($"{strTrace}");
}
Manager?.Warn(log); Manager?.Warn(log);
break; break;
} }
case LogType.Error: case LogType.Error:
{ {
if (trace == true)
{
Manager?.Error($"{strTrace}");
}
Manager?.Error(log); Manager?.Error(log);
break; break;
} }
case LogType.Debug: case LogType.Debug:
{ {
Manager?.Debug(log); if (IsDebugEnabled == true)
{
if (trace == true)
{
Manager?.Debug($"{strTrace}");
}
Manager?.Debug(log);
}
break; break;
} }
case LogType.Fatal: case LogType.Fatal:
{ {
Manager?.Fatal($"{strTrace}");
Manager?.Fatal(log); Manager?.Fatal(log);
break; break;
} }
case LogType.DB: case LogType.Exception:
{ {
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType; Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null) if (t != null)
{ {
Manager?.Logger.Log(t, Log4netCustomLevel.DB, log, null); if (trace == true)
{
Manager?.Logger.Log(t, Log4netCustomLevel.EXCEPTION, $"{strTrace}", null);
}
Manager?.Logger.Log(t, Log4netCustomLevel.EXCEPTION, log, null);
}
break;
}
case LogType.DB:
{
if(IsDBEnabled == true)
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
if (trace == true)
{
Manager?.Logger.Log(t, Log4netCustomLevel.DB, $"{strTrace}", null);
}
Manager?.Logger.Log(t, Log4netCustomLevel.DB, log, null);
}
} }
break; break;
} }
case LogType.HTTP: case LogType.HTTP:
{ {
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType; if(IsHttpEnabled == true)
if (t != null)
{ {
Manager?.Logger.Log(t, Log4netCustomLevel.HTTP, log, null); Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
if (trace == true)
{
Manager?.Logger.Log(t, Log4netCustomLevel.HTTP, $"{strTrace}", null);
}
Manager?.Logger.Log(t, Log4netCustomLevel.HTTP, log, null);
}
} }
break; break;
} }
case LogType.SOCKET: case LogType.SOCKET:
{ {
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType; if(IsSocketEnabled == true)
if (t != null)
{ {
Manager?.Logger.Log(t, Log4netCustomLevel.SOCKET, log, null); Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
if (trace == true)
{
Manager?.Logger.Log(t, Log4netCustomLevel.SOCKET, $"{strTrace}", null);
}
Manager?.Logger.Log(t, Log4netCustomLevel.SOCKET, log, null);
}
} }
break; break;
} }
case LogType.CONTROLLER: case LogType.CONTROLLER:
{ {
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType; if(IsControllerEnabled == true)
if (t != null)
{ {
Manager?.Logger.Log(t, Log4netCustomLevel.CONTROLLER, log, null); Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
if (trace == true)
{
Manager?.Logger.Log(t, Log4netCustomLevel.CONTROLLER, $"{strTrace}", null);
}
Manager?.Logger.Log(t, Log4netCustomLevel.CONTROLLER, log, null);
}
} }
break; break;
} }
} }
} }
public static void WriteLine(Exception? ex) private static void WriteLineException(Exception? ex,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{ {
WriteLine(ex?.Message, LogType.Error); WriteLine($"TRACE::[{Path.GetFileName(sourceFilePath)}][Method:{memberName}][LINE:{sourceLineNumber}]", LogType.Exception);
WriteLine(ex?.Message, LogType.Exception);
} }
#region Config #region Config
static string Config = @$"<?xml version=""1.0"" encoding=""utf-8"" ?> static string Config = @$"<?xml version=""1.0"" encoding=""utf-8"" ?>
<configuration> <configuration>
@ -188,7 +319,7 @@ public static class Log4net
<appender name=""Console"" type=""log4net.Appender.ManagedColoredConsoleAppender""> <appender name=""Console"" type=""log4net.Appender.ManagedColoredConsoleAppender"">
<layout type=""log4net.Layout.PatternLayout""> <layout type=""log4net.Layout.PatternLayout"">
<conversionPattern value=""[%date] [%thread] %-6level: %message%newline"" /> <conversionPattern value=""[%date] [%thread] %-2level: %message%newline"" />
</layout> </layout>
<mapping> <mapping>
<level value=""FATAL"" /> <level value=""FATAL"" />
@ -212,6 +343,10 @@ public static class Log4net
<foreColor value=""Blue"" /> <foreColor value=""Blue"" />
</mapping> </mapping>
<mapping>
<level value=""EXCEPTION"" />
<foreColor value=""DarkRed"" />
</mapping>
<mapping> <mapping>
<level value=""DB"" /> <level value=""DB"" />
<foreColor value=""DarkMagenta"" /> <foreColor value=""DarkMagenta"" />

View File

@ -10,7 +10,7 @@
<appender name="Console" type="log4net.Appender.ManagedColoredConsoleAppender"> <appender name="Console" type="log4net.Appender.ManagedColoredConsoleAppender">
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date] [%thread] %-6level: %message%newline" /> <conversionPattern value="[%date] [%thread] %-2level: %message%newline" />
</layout> </layout>
<mapping> <mapping>
<level value="FATAL" /> <level value="FATAL" />
@ -34,6 +34,10 @@
<foreColor value="Blue" /> <foreColor value="Blue" />
</mapping> </mapping>
<mapping>
<level value="EXCEPTION" />
<foreColor value="DarkRed" />
</mapping>
<mapping> <mapping>
<level value="DB" /> <level value="DB" />
<foreColor value="DarkMagenta" /> <foreColor value="DarkMagenta" />

View File

@ -60,7 +60,7 @@ namespace VPKI.Library.Static
} }
catch(Exception ex) catch(Exception ex)
{ {
Log4net.WriteLine("Document4net ExportToCsv Exception",LogType.Error); Log4net.WriteLine("Document4net ExportToCsv Exception", LogType.Exception);
Log4net.WriteLine(ex); Log4net.WriteLine(ex);
} }

View File

@ -22,6 +22,7 @@ string configDir = @"../Config";
if (Log4net.IsConfigLoad == true) if (Log4net.IsConfigLoad == true)
{ {
Log4net.WriteLine("Log4net Init Success"); Log4net.WriteLine("Log4net Init Success");
Log4net.AutoRemoveLog();
} }
else else
{ {

View File

@ -163,7 +163,7 @@ namespace VPKI.Web.Api.Services
} }
catch (Exception e) catch (Exception e)
{ {
Log4net.WriteLine($"Select User Transaction Error", LogType.Error); Log4net.WriteLine($"Select User Transaction Error", LogType.Exception);
Log4net.WriteLine(e); Log4net.WriteLine(e);
} }
} }

View File

@ -189,7 +189,7 @@ namespace VPKI.Web.Api.Services
} }
catch (Exception e) catch (Exception e)
{ {
Log4net.WriteLine($"RequestCertificate Exception::{csr.CHashedTbscsr}", LogType.Error); Log4net.WriteLine($"RequestCertificate Exception::{csr.CHashedTbscsr}", LogType.Exception);
Log4net.WriteLine(e); Log4net.WriteLine(e);
} }
} }

View File

@ -200,7 +200,7 @@ namespace VPKI.Web.Api.Services
} }
catch (Exception e) catch (Exception e)
{ {
Log4net.WriteLine($"RequestCertificate Exception::{csr.CHashedTbscsr}", LogType.Error); Log4net.WriteLine($"RequestCertificate Exception::{csr.CHashedTbscsr}", LogType.Exception);
Log4net.WriteLine(e); Log4net.WriteLine(e);
} }
} }

View File

@ -11,6 +11,7 @@ string configDir = @"../Config";
if (Log4net.IsConfigLoad == true) if (Log4net.IsConfigLoad == true)
{ {
Log4net.WriteLine("Log4net Init Success"); Log4net.WriteLine("Log4net Init Success");
Log4net.AutoRemoveLog();
} }
else else
{ {