[성현모] 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,
//custom level
Exception = 7,
DB = 10,
HTTP = 20,
@ -30,6 +32,7 @@ public enum LogType
#region CustomLevel
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 HTTP = new log4net.Core.Level(10020, LogType.HTTP.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)
{
repo.LevelMap.Add(EXCEPTION);
repo.LevelMap.Add(DB);
repo.LevelMap.Add(HTTP);
repo.LevelMap.Add(SOCKET);
@ -53,7 +57,16 @@ public static class Log4net
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()
{
@ -61,13 +74,13 @@ public static class Log4net
if (File.Exists(log4netConfigPath) == true)
{
File.Delete(log4netConfigPath);
Console.WriteLine($"Create log4netConfig: {log4netConfigPath}");
File.WriteAllText(log4netConfigPath, Config);
File.Delete(log4netConfigPath);
}
IsConfigLoad = OpenConfig(log4netConfigPath);
Console.WriteLine($"Create log4netConfig: {log4netConfigPath}");
File.WriteAllText(log4netConfigPath, Config);
IsConfigLoad = OpenConfig(log4netConfigPath);
}
private static bool OpenConfig(string path)
@ -94,7 +107,53 @@ public static class Log4net
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)
{
@ -103,78 +162,150 @@ public static class Log4net
return;
}
if(log is Exception ex)
{
WriteLineException(ex, memberName, sourceFilePath, sourceLineNumber);
return;
}
string strTrace = $"TRACE::[{Path.GetFileName(sourceFilePath)}][Method:{memberName}][LINE:{sourceLineNumber}]";
switch (logType)
{
case LogType.Info:
{
if (trace == true)
{
Manager?.Info($"{strTrace}");
}
Manager?.Info(log);
break;
}
case LogType.Warn:
{
if (trace == true)
{
Manager?.Warn($"{strTrace}");
}
Manager?.Warn(log);
break;
}
case LogType.Error:
{
if (trace == true)
{
Manager?.Error($"{strTrace}");
}
Manager?.Error(log);
break;
}
case LogType.Debug:
{
Manager?.Debug(log);
{
if (IsDebugEnabled == true)
{
if (trace == true)
{
Manager?.Debug($"{strTrace}");
}
Manager?.Debug(log);
}
break;
}
case LogType.Fatal:
{
Manager?.Fatal($"{strTrace}");
Manager?.Fatal(log);
break;
}
case LogType.Exception:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
if (trace == true)
{
Manager?.Logger.Log(t, Log4netCustomLevel.EXCEPTION, $"{strTrace}", null);
}
Manager?.Logger.Log(t, Log4netCustomLevel.EXCEPTION, log, null);
}
break;
}
case LogType.DB:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
if(IsDBEnabled == true)
{
Manager?.Logger.Log(t, Log4netCustomLevel.DB, log, null);
}
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;
}
case LogType.HTTP:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
if(IsHttpEnabled == true)
{
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;
}
case LogType.SOCKET:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
if(IsSocketEnabled == true)
{
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;
}
case LogType.CONTROLLER:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
if(IsControllerEnabled == true)
{
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;
}
}
}
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
static string Config = @$"<?xml version=""1.0"" encoding=""utf-8"" ?>
<configuration>
@ -188,7 +319,7 @@ public static class Log4net
<appender name=""Console"" type=""log4net.Appender.ManagedColoredConsoleAppender"">
<layout type=""log4net.Layout.PatternLayout"">
<conversionPattern value=""[%date] [%thread] %-6level: %message%newline"" />
<conversionPattern value=""[%date] [%thread] %-2level: %message%newline"" />
</layout>
<mapping>
<level value=""FATAL"" />
@ -212,6 +343,10 @@ public static class Log4net
<foreColor value=""Blue"" />
</mapping>
<mapping>
<level value=""EXCEPTION"" />
<foreColor value=""DarkRed"" />
</mapping>
<mapping>
<level value=""DB"" />
<foreColor value=""DarkMagenta"" />

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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