#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 { /// /// xml 설정에서 AppData\LocalLow\Company Name\Product Name\ 접근 할 수 없어서 사용. /// 로그 파일 어펜더 및 로깅 수준을 포함하여 애플리케이션의 log4net 로깅을 구성합니다. /// /// 이 클래스는 log4net이 로깅에 롤링 파일 어펜더를 사용하도록 설정합니다. /// 일반 로그와 치명적인 로그에 대해 별도의 구성을 사용합니다. /// 로그 메시지의 형식이 일관되고 /// 애플리케이션의 런타임 환경(편집기 또는 런타임)에 따라 적절한 로그 파일에 기록되도록 합니다./// /// 로그 파일 어펜더 및 로깅 수준을 포함하여 애플리케이션의 log4net 로깅을 구성합니다. /// /// 이 클래스는 log4net이 로깅에 롤링 파일 어펜더를 사용하도록 설정합니다. /// 일반 로그와 치명적인 로그에 대해 별도의 구성을 사용합니다. /// 로그 메시지의 형식이 일관되고 /// 애플리케이션의 런타임 환경(편집기 또는 런타임)에 따라 적절한 로그 파일에 기록되도록 합니다. [ExcludeFromSearch] public class Log4netCodeConfigurator : IConfigurator { /// /// 미리 정의된 log4net 구성을 사용하여 로깅 시스템을 구성합니다. /// /// 이 메서드는 구성 프로세서에 log4net 기반 구성기를 추가하여 로깅 시스템을 초기화합니다. /// 로깅이 올바르게 설정되도록 애플리케이션 시작 중에 한 번 호출해야 합니다. /// 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