[성현모] Log4net 기능 추가

This commit is contained in:
SHM
2025-04-18 09:35:52 +09:00
parent 25be83359b
commit babdb4732b
9 changed files with 355 additions and 0 deletions

View File

@ -0,0 +1,249 @@
using log4net;
using log4net.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace SystemX.Core.Log4net
{
#region LogType
public enum LogType
{
//default level
Info = 0,
Warn = 1,
Error = 2,
Debug = 3,
Fatal = 4,
//custom level
DB = 10,
HTTP = 20,
SOCKET = 21,
}
#endregion
#region CustomLevel
public static class Log4netCustomLevel
{
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());
public static void SetCustomLevel(ILoggerRepository repo)
{
repo.LevelMap.Add(DB);
repo.LevelMap.Add(HTTP);
repo.LevelMap.Add(SOCKET);
}
}
#endregion
public static class Log4net
{
private static ILog? Manager;
private static ILoggerRepository repo = LogManager.GetRepository();
public static bool IsConfigLoad { get; set; } = false;
static Log4net()
{
Console.WriteLine("log4net constructor");
if (File.Exists("./log4net.config") == false)
{
File.WriteAllText("log4net.config", Config);
}
IsConfigLoad = OpenConfig(@"./log4net.config");
}
private static bool OpenConfig(string path)
{
bool result = true;
try
{
Log4netCustomLevel.SetCustomLevel(repo);
if (File.Exists(path) == false)
result = false;
log4net.Config.XmlConfigurator.Configure(new FileInfo(path));
Manager = LogManager.GetLogger("");
}
catch (Exception e)
{
Console.WriteLine("Log4net Init Error");
Console.WriteLine(e.Message);
result = false;
}
return result;
}
public static void WriteLine<T>(T log, LogType logType = LogType.Info)
{
if (IsConfigLoad == false)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"[Log4net Initialize Error] {log}");
return;
}
switch (logType)
{
case LogType.Info:
{
Manager?.Info(log);
break;
}
case LogType.Warn:
{
Manager?.Warn(log);
break;
}
case LogType.Error:
{
Manager?.Error(log);
break;
}
case LogType.Debug:
{
Manager?.Debug(log);
break;
}
case LogType.Fatal:
{
Manager?.Fatal(log);
break;
}
case LogType.DB:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
Manager?.Logger.Log(t, Log4netCustomLevel.DB, log, null);
}
break;
}
case LogType.HTTP:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
Manager?.Logger.Log(t, Log4netCustomLevel.HTTP, log, null);
}
break;
}
case LogType.SOCKET:
{
Type? t = MethodBase.GetCurrentMethod()?.DeclaringType;
if (t != null)
{
Manager?.Logger.Log(t, Log4netCustomLevel.SOCKET, log, null);
}
break;
}
}
}
public static void WriteLine(Exception? ex)
{
WriteLine(ex?.Message, LogType.Error);
}
#region Config
static string Config = @$"<?xml version=""1.0"" encoding=""utf-8"" ?>
<configuration>
<log4net>
<root>
<level value=""ALL""/>
<appender-ref ref=""Console""/>
<appender-ref ref=""file""/>
<appender-ref ref=""fatal_file""/>
</root>
<appender name=""Console"" type=""log4net.Appender.ManagedColoredConsoleAppender"">
<layout type=""log4net.Layout.PatternLayout"">
<conversionPattern value=""[%date] [%thread] %-6level: %message%newline"" />
</layout>
<mapping>
<level value=""FATAL"" />
<foreColor value=""White"" />
<backColor value=""Red"" />
</mapping>
<mapping>
<level value=""ERROR"" />
<foreColor value=""Red"" />
</mapping>
<mapping>
<level value=""WARN"" />
<foreColor value=""Yellow"" />
</mapping>
<mapping>
<level value=""INFO"" />
<foreColor value=""Green"" />
</mapping>
<mapping>
<level value=""DEBUG"" />
<foreColor value=""Blue"" />
</mapping>
<mapping>
<level value=""DB"" />
<foreColor value=""DarkMagenta"" />
</mapping>
<mapping>
<level value=""HTTP"" />
<foreColor value=""DarkYellow"" />
</mapping>
<mapping>
<level value=""SOCKET"" />
<foreColor value=""DarkCyan"" />
</mapping>
</appender>
<appender name=""file"" type=""log4net.Appender.RollingFileAppender"">
<file value=""log/"" />
<datepattern value=""yyyy////MM////yyyy-MM-dd'.log'""/>
<appendToFile value=""true"" />
<rollingStyle value=""Date"" />
<staticLogFileName value=""false"" />
<layout type=""log4net.Layout.PatternLayout"">
<conversionPattern value=""[%date] [%thread] %level %logger - %message%newline"" />
</layout>
</appender>
<appender name=""fatal_file"" type=""log4net.Appender.RollingFileAppender"">
<file value=""log/"" />
<datepattern value=""yyyy////MM////yyyy-MM-dd'_fatal.log'""/>
<appendToFile value=""true"" />
<rollingStyle value=""Date"" />
<staticLogFileName value=""false"" />
<filter type=""log4net.Filter.LevelRangeFilter"">
<param name=""LevelMin"" value=""FATAL"" />
<param name=""LevelMax"" value=""FATAL"" />
</filter>
<layout type=""log4net.Layout.PatternLayout"">
<conversionPattern value=""[%date] [%thread] %level %logger - %message%newline"" />
</layout>
</appender>
</log4net>
</configuration>";
#endregion
}
}
/*
log4net 지정 가능 색상
Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray,
DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White
*/

View File

@ -4,6 +4,24 @@
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<WarningLevel>9999</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<WarningLevel>9999</WarningLevel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="log4net" Version="3.0.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="xcopy /y $(ProjectDir)$(OutputPath)$(TargetName).dll $(SolutionDir)..\DLL\" />
</Target>
</Project>