welsonjs/WelsonJS.Augmented/WelsonJS.Launcher/log4net.config
Namhyeon, Go 96986d1417 Migrate logging to log4net and refactor API endpoints
Replaces the custom ICompatibleLogger and TraceLogger with log4net for logging, introducing LoggingBootstrap for environment-aware log4net initialization. Refactors all resource tools to use IApiEndpoint and moves them to the ApiEndpoints namespace. Updates project references, configuration, and adds a log4net.config for consistent logging setup.
2026-01-26 14:51:12 +09:00

116 lines
4.9 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!--
WelsonJS "drop-in" config.
- No buffering (to avoid "no logs" issues)
- Console + File always enabled
- Root level DEBUG (works for both prod/dev; control verbosity via logger levels if needed)
GlobalContext keys set by LoggingBootstrap.Init(profile):
pid, host, user, ver, profile,
machine, domain, interactive, elevated,
os, osVer, archProc, archOS, is64Proc, is64OS,
runtime, culture, uiCulture, tz,
exe, cwd, cmd,
procName, startUtc, ws
ThreadContext keys (optional, per job/script):
script, session, req
-->
<!-- =====================================================
1) Main log file (date + size rolling)
===================================================== -->
<appender name="File" type="log4net.Appender.RollingFileAppender">
<file value="logs/welsonjs.log" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<datePattern value="'.'yyyyMMdd" />
<staticLogFileName value="true" />
<maximumFileSize value="10MB" />
<maxSizeRollBackups value="10" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<immediateFlush value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ISO8601} %-5level [pid=%property{pid}] [thr=%thread] [host=%property{host}] [user=%property{user}] [ver=%property{ver}] [profile=%property{profile}] [machine=%property{machine}] [domain=%property{domain}] [interactive=%property{interactive}] [elevated=%property{elevated}] [os=%property{os}] [osVer=%property{osVer}] [archProc=%property{archProc}] [archOS=%property{archOS}] [is64Proc=%property{is64Proc}] [is64OS=%property{is64OS}] [runtime=%property{runtime}] [culture=%property{culture}] [uiCulture=%property{uiCulture}] [tz=%property{tz}] [procName=%property{procName}] [startUtc=%property{startUtc}] [ws=%property{ws}] [exe=%property{exe}] [cwd=%property{cwd}] [cmd=%property{cmd}] [script=%property{script}] [session=%property{session}] [req=%property{req}] %logger - %message%newline%exception" />
</layout>
</appender>
<!-- =====================================================
2) Error-only log file
===================================================== -->
<appender name="ErrorFile" type="log4net.Appender.RollingFileAppender">
<file value="logs/welsonjs.error.log" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<datePattern value="'.'yyyyMMdd" />
<staticLogFileName value="true" />
<maximumFileSize value="10MB" />
<maxSizeRollBackups value="20" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<immediateFlush value="true" />
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ISO8601} %-5level [pid=%property{pid}] [thr=%thread] [host=%property{host}] [user=%property{user}] [ver=%property{ver}] [profile=%property{profile}] [machine=%property{machine}] [elevated=%property{elevated}] [os=%property{os}] [runtime=%property{runtime}] [tz=%property{tz}] [exe=%property{exe}] [cwd=%property{cwd}] [script=%property{script}] [session=%property{session}] [req=%property{req}] %logger - %message%newline%exception" />
</layout>
</appender>
<!-- =====================================================
3) Console (always enabled; useful for dev + troubleshooting)
===================================================== -->
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date{HH:mm:ss} [pid=%property{pid}] [host=%property{host}] [ver=%property{ver}] [profile=%property{profile}] [script=%property{script}] %logger - %message%newline%exception" />
</layout>
</appender>
<!-- =====================================================
4) Root logger (works for both prod/dev)
- Keep DEBUG to guarantee logs show up.
- If prod needs quieter logs, raise levels for noisy namespaces.
===================================================== -->
<root>
<level value="DEBUG" />
<appender-ref ref="File" />
<appender-ref ref="ErrorFile" />
<appender-ref ref="Console" />
</root>
<!-- =====================================================
5) Optional: reduce noise in prod by tuning specific namespaces
(uncomment and adjust as needed)
===================================================== -->
<!--
<logger name="System">
<level value="WARN" />
</logger>
<logger name="Microsoft">
<level value="WARN" />
</logger>
<logger name="WelsonJS.Network">
<level value="INFO" />
</logger>
<logger name="WelsonJS.Security">
<level value="WARN" />
</logger>
-->
</log4net>