Pro*_*ofK 1 wpf logging nlog unhandled-exception first-chance-exception
我想AppDomain.FirstChanceException在我的WPF应用程序中实现,以便可选地记录发生,处理或不处理的每个异常.我不希望将这些例外记录到我为NLog配置的目标.是否有可能,在调用时Logger.Error(或任何Logger方法)使NLog只记录到一个特定的目标?
这是可能的,但这不是一个好主意,因为:
配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true">
<target name="file1" xsi:type="File" fileName="${basedir}/log1.txt" />
<target name="file2" xsi:type="File" fileName="${basedir}/log2.txt" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="file1,file2" />
</rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)
全局工厂配置示例:
var logger = LogManager.GetCurrentClassLogger();
logger.Error("Original Configuration");
var configOrig = LogManager.Configuration;
var configTemp = LogManager.Configuration.Reload();
var rule = configTemp.LoggingRules.First(r => r.NameMatches("*"));
var target = configTemp.FindTargetByName("file2");
rule.Targets.Remove(target);
LogManager.Configuration = configTemp;
logger.Error("Temporary Configuration");
LogManager.Configuration = configOrig;
logger.Error("Original Configuration");
Run Code Online (Sandbox Code Playgroud)
用户创建工厂配置的示例:
var factory = new LogFactory(LogManager.Configuration);
var logger = factory.GetCurrentClassLogger();
logger.Error("Original Configuration");
var config = factory.Configuration;
var rule = config.LoggingRules.First(r => r.NameMatches("*"));
var target = config.FindTargetByName("file2");
rule.Targets.Remove(target);
factory.ReconfigExistingLoggers();
logger.Error("Temporary Configuration");
rule.Targets.Add(target);
factory.ReconfigExistingLoggers();
logger.Error("Original Configuration");
Run Code Online (Sandbox Code Playgroud)
log1.txt
2015-03-16 21:46:04.5685|ERROR|ConsoleApplication.Program|Original Configuration
2015-03-16 21:46:04.5865|ERROR|ConsoleApplication.Program|Temporary Configuration
2015-03-16 21:46:04.5865|ERROR|ConsoleApplication.Program|Original Configuration
Run Code Online (Sandbox Code Playgroud)
log2.txt
2015-03-16 21:45:26.4238|ERROR|ConsoleApplication.Program|Original Configuration
2015-03-16 21:45:26.4588|ERROR|ConsoleApplication.Program|Original Configuration
Run Code Online (Sandbox Code Playgroud)
Soulution
解决问题的最佳方法是为每个工厂创建两个工厂和一个记录器.在您订阅之前,必须初始化工厂和记录器AppDomain.FirstChanceException.否则,如果您有异步操作或其他线程,则会遇到线程安全问题.
| 归档时间: |
|
| 查看次数: |
1311 次 |
| 最近记录: |