Files
XRLib/Assets/Scripts/UVC/Log/Log4netCodeConfigurator.cs
2025-11-11 13:51:23 +09:00

126 lines
5.5 KiB
C#

#if !UNITY_WEBGL || UNITY_EDITOR
using log4net;
using log4net.Appender;
using log4net.Core;
using log4net.Filter;
using log4net.Layout;
using log4net.Repository.Hierarchy;
using log4net.Unity;
using log4net.Unity.Config;
using System;
using System.IO;
using UnityEngine;
namespace UVC.Log
{
/// <summary>
/// xml 설정에서 AppData\LocalLow\Company Name\Product Name\ 접근 할 수 없어서 사용.
/// 로그 파일 어펜더 및 로깅 수준을 포함하여 애플리케이션의 log4net 로깅을 구성합니다.
/// </summary>
/// <remarks>이 클래스는 log4net이 로깅에 롤링 파일 어펜더를 사용하도록 설정합니다.
/// 일반 로그와 치명적인 로그에 대해 별도의 구성을 사용합니다.
/// 로그 메시지의 형식이 일관되고
/// 애플리케이션의 런타임 환경(편집기 또는 런타임)에 따라 적절한 로그 파일에 기록되도록 합니다.</remarks>/// <summary>
/// 로그 파일 어펜더 및 로깅 수준을 포함하여 애플리케이션의 log4net 로깅을 구성합니다.
/// </summary>
/// <remarks>이 클래스는 log4net이 로깅에 롤링 파일 어펜더를 사용하도록 설정합니다.
/// 일반 로그와 치명적인 로그에 대해 별도의 구성을 사용합니다.
/// 로그 메시지의 형식이 일관되고
/// 애플리케이션의 런타임 환경(편집기 또는 런타임)에 따라 적절한 로그 파일에 기록되도록 합니다.</remarks>
[ExcludeFromSearch]
public class Log4netCodeConfigurator : IConfigurator
{
/// <summary>
/// 미리 정의된 log4net 구성을 사용하여 로깅 시스템을 구성합니다.
/// </summary>
/// <remarks>이 메서드는 구성 프로세서에 log4net 기반 구성기를 추가하여 로깅 시스템을 초기화합니다.
/// 로깅이 올바르게 설정되도록 애플리케이션 시작 중에 한 번 호출해야 합니다.
///</remarks>
public static void Setup()
{
var configurator = new Log4netCodeConfigurator(0);
ConfigProcessor.AddConfigurator(configurator);
configurator.TryConfigure();
}
public int Order { get; }
public event Action OnChange;
public Log4netCodeConfigurator(int order)
{
Order = order;
}
public void TryConfigure()
{
var hierarchy = (Hierarchy)LogManager.GetRepository();
var patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "[%date][%thread][%level][%logger] %message%newline";
patternLayout.ActivateOptions();
var appender = GetAppenderRolling();
appender.Layout = patternLayout;
hierarchy.Root.AddAppender(appender);
var appenderFatal = GetAppenderRollingFatal();
appenderFatal.Layout = patternLayout;
hierarchy.Root.AddAppender(appenderFatal);
hierarchy.Root.Level = Level.All;
hierarchy.Configured = true;
}
private RollingFileAppender GetAppenderRolling()
{
var appender = new RollingFileAppender();
appender.Encoding = System.Text.Encoding.UTF8; // UTF-8 인코딩 사용
appender.AppendToFile = true;
appender.MaxSizeRollBackups = 10; // 최대 롤백업 수
appender.MaximumFileSize = "10MB"; // 최대 파일 크기
appender.RollingStyle = RollingFileAppender.RollingMode.Composite;
appender.StaticLogFileName = true; // 파일 이름을 고정
appender.DatePattern = "yyyy-MM-dd"; // 날짜 패턴
if (Application.isEditor)
{
appender.File = Path.Combine(Application.persistentDataPath, "unityLogs/editor.log"); // 에디터에서의 로그 파일 경로
}
else
{
appender.File = Path.Combine(Application.persistentDataPath, "unityLogs/runtime.log"); ; // 빌드된 애플리케이션에서의 로그 파일 경로
}
Debug.Log($"Log4netCodeConfigurator: Log file path: {appender.File}");
return appender;
}
private RollingFileAppender GetAppenderRollingFatal()
{
var appender = new RollingFileAppender();
appender.Encoding = System.Text.Encoding.UTF8; // UTF-8 인코딩 사용
appender.AppendToFile = true;
appender.MaxSizeRollBackups = 500; // 최대 롤백업 수
appender.MaximumFileSize = "10MB"; // 최대 파일 크기
appender.RollingStyle = RollingFileAppender.RollingMode.Size;
appender.StaticLogFileName = true; // 파일 이름을 고정
appender.DatePattern = "yyyy-MM-dd"; // 날짜 패턴
var levelFilter = new LevelRangeFilter
{
LevelMin = Level.Fatal,
LevelMax = Level.Fatal
};
appender.AddFilter(levelFilter);
if (Application.isEditor)
{
appender.File = Path.Combine(Application.persistentDataPath, "unityLogs/editorFatal.log"); // 에디터에서의 로그 파일 경로
}
else
{
appender.File = Path.Combine(Application.persistentDataPath, "unityLogs/runtimeFatal.log"); ; // 빌드된 애플리케이션에서의 로그 파일 경로
}
return appender;
}
}
}
#endif