我有两个项目A和B,他们俩都使用nlog libiary。现在我有一个问题:
如果首先将loginfo写入日志文件,则B永远不会记录。如果B首先将loginfo写入日志文件,则永远不会记录。
作为a和b使用相同的nlog libiary,因此它们使用相同的nlog config,但它们将在两个处理器中构建,这是配置信息。
有人在这个问题上有好主意吗?
//Set NLog Config by:
//https://github.com/nlog/NLog/wiki/Configuration-API
private static Logger GenerateLogInstance()
{
// Step 1. Create configuration object
var config = new LoggingConfiguration();
// Step 2. Create targets
var fileTarget = new FileTarget()
{
FileName = @"C:Logs${shortdate}.log",
Layout = @"${longdate} ${uppercase:${level}} ${message}${onexception:${newline}EXCEPTION: ${exception:format=ToString}}"
};
//var wrapper = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Discard);
// Step 3. Define rules
config.AddTarget("myprojectLog", fileTarget);
config.LoggingRules.Add(new NLog.Config.LoggingRule("*", NLog.LogLevel.Trace, fileTarget));
// Step 4. Activate the configuration
var factory = new LogFactory(config);
return factory.GetLogger("myprojectLog");
}
我不使用 nlog ,但请查看以下内容。您可能需要设置concurrentWrites="true"
文件目标
consturrentwrites-支持优化并发写信的支持 同一机器主机上的多个进程的同一日志文件, 使用keepfileopen = true。通过使用一种让它的特殊技术 从多个进程中保持文件打开。如果只有一个过程 (和单个AppDomain(应用程序正在记录,然后更快 设置为concurrentwrites = false。布尔默认值:正确。注意:在UWP中 此设置应为false
您可以尝试一下:
private static LogFactory GenerateLogFactory()
{
// Step 0. Create isolated LogFactory
var logFactory = new LogFactory();
// Step 1. Create configuration object
var config = new LoggingConfiguration(logFactory);
// Step 2. Create targets
var fileTarget = new FileTarget()
{
FileName = @"C:Logs${shortdate}.log",
Layout = @"${longdate} ${uppercase:${level}} ${message}${onexception:${newline}EXCEPTION: ${exception:format=ToString}}"
};
// Step 3. Define rules
config.AddTarget("myprojectLog", fileTarget);
config.LoggingRules.Add(new NLog.Config.LoggingRule("*", NLog.LogLevel.Trace, fileTarget));
// Step 4. Activate the configuration
logFactory.Configuration = config;
return logFactory;
}
private static Logger GenerateLogInstance()
{
return GenerateLogFactory().GetLogger("myprojectLog");
}
顺便说一句。如果同一解决方案中的两个项目使用了相同的方法,则可以考虑这样做:
Lazy<LogFactory> LazyLogFactory = new Lazy<LogFactory>(() => GenerateLogFactory());
private static Logger GenerateLogInstance(string loggerName = "myprojectLog")
{
return LazyLogFactory.Value.GetLogger(loggerName);
}