3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
NLog 4.6.7 允許您在日志記錄規(guī)則過濾器中使用布局minLevel
/maxLevel
您可以使用默認(rèn)日志級別的 NLog-Config-Variable,然后在您的 Web 應(yīng)用程序上創(chuàng)建一個(gè)隱藏方法來修改 NLog-Config-Variable 并調(diào)用ReconfigExistingLoggers()
.
然后設(shè)置一個(gè)計(jì)時(shí)器,在 30 秒后將該 NLog-Config-Variable 恢復(fù)為其原始值。并且還調(diào)用了ReconfigExistingLoggers()
。
另見:https : //github.com/NLog/NLog/wiki/Filtering-log-messages#semi-dynamic-routing-rules

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
與其嘗試自定義 NLog 日志記錄級別(這會影響整個(gè)過程),我認(rèn)為您應(yīng)該尋求一種解決方案來修改日志語句本身的日志級別。
要完成這項(xiàng)工作,您需要具備以下條件:
一種機(jī)制,用于識別您想要調(diào)試日志記錄的請求
記錄器的包裝器,以便您可以動態(tài)覆蓋日志級別
第一個(gè)要求很簡單 - 設(shè)置 cookie 或自定義 HTTP 標(biāo)頭,并檢查兩者是否存在。您需要將此檢查的結(jié)果提供給您的 LogWrapper 實(shí)例,以便它知道什么時(shí)候應(yīng)該做一些特殊的事情。
LogWrapper 必須針對每個(gè)請求進(jìn)行實(shí)例化,以便實(shí)例不會跨請求共享。最簡單的方法是在控制器的構(gòu)造函數(shù)中按需創(chuàng)建它(但你也可以將它連接到 DI 容器以進(jìn)行自動注入)。
這看起來像這樣:
public class HomeController : Controller
{
private readonly LogWrapper _logger;
public HomeController(ILogger<HomeController> logger)
{
var isDebugRequest = ...;
_logger = new LogWrapper<HomeController>(logger, isDebugRequest);
}
...
}
此處解釋了為 NLog 創(chuàng)建日志包裝器的基礎(chǔ)知識,但您似乎已經(jīng)在使用為 Microsoft.Extensions.Logging 創(chuàng)建的包裝器,因此您需要改為包裝該接口:
public class LogWrapper<T> : Microsoft.Extensions.Logging.ILogger
{
private readonly ILogger<T> _logger;
private readonly bool _debug;
public LogWrapper(ILogger<T> logger, bool isDebug)
{
_logger = logger;
_debug = isDebug;
}
public void Log<TState>(LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> formatter)
{
if (_debug)
{
// override log level here
_logger.Log(LogLevel.Warning, eventId, state, exception, formatter);
}
else
{
_logger.Log(logLevel, eventId, state, exception, formatter);
}
}
// ILogger has two other methods you'll need to implement
}
這種方法的缺點(diǎn)是日志語句沒有其原始日志級別,這對您的用例可能重要也可能不重要。

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
也許您可以使用 session-cookie 來控制是否啟用調(diào)試模式:
<targets>
<target type="file" name="logfile" filename="applog.txt" />
</targets>
<rules>
<logger name="*" minlevel="Off" writeTo="logfile" ruleName="debugCookieRule">
<filters defaultAction="Log">
<when condition="'${aspnet-session:EnableDebugMode}' == ''" action="Ignore" />
</filters>
</logger>
</rules>
然后像這樣激活會話cookie:
public void SetMinLogLevel(LogLevel NewLogLevel)
{
var cookieRule = LogManager.Configuration.FindRuleByName("debugCookieRule");
if (cookieRule != null)
{
cookieRule.MinLevel = NewLogLevel;
// Schedule disabling of logging-rule again in 60 secs.
Task.Run(async () => { await Task.Delay(60000).ConfigureAwait(false); cookieRule.MinLevel = LogLevel.Off; LogManager.ReconfigExistingLoggers(); });
// Activate EnableDebugMode for this session
HttpContext.Session.SetString("EnableDebugMode", "Doctor has arrived");
}
LogManager.ReconfigExistingLoggers(); // Refresh loggers
}
如果${aspnet-session}不需要session-cookies ,那么 NLog.Web.AspNetCore 有其他選項(xiàng)來提取 HttpContext-details。另見:https : //nlog-project.org/config/?tab=layout-renderers&search=package : nlog.web.aspnetcore
- 3 回答
- 0 關(guān)注
- 667 瀏覽
添加回答
舉報(bào)