C# 两个处理器可以';t使用NLog同时记录信息
我有两个项目A和B,它们都使用NLog库。现在我有一个问题: 如果A首先将loginfo写入日志文件,则B从不记录。如果B先将loginfo写入日志文件,则A从不记录。 由于A和B使用相同的NLog库,所以它们使用相同的NLog配置,但它们将构建在两个处理器中,下面是配置信息 有人对这个问题有什么好主意吗C# 两个处理器可以';t使用NLog同时记录信息,c#,nlog,C#,Nlog,我有两个项目A和B,它们都使用NLog库。现在我有一个问题: 如果A首先将loginfo写入日志文件,则B从不记录。如果B先将loginfo写入日志文件,则A从不记录。 由于A和B使用相同的NLog库,所以它们使用相同的NLog配置,但它们将构建在两个处理器中,下面是配置信息 有人对这个问题有什么好主意吗 //Set NLog Config by: //https://github.com/nlog/NLog/wiki/Configuration-API private static Logge
//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”
concurrentWrites—支持对的优化并发写入
来自同一计算机主机上多个进程的同一日志文件,如果
使用keepFileOpen=true。通过使用一种特殊的技术
保持文件在多个进程中处于打开状态。如果只有一个进程
(和单个AppDomain)应用程序正在进行日志记录,则可以更快地
设置为concurrentWrites=False。布尔值默认值:True。注:在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);
}
LazyLogFactory=newlazy(()=>GenerateLogFactory());
专用静态记录器GenerateLogInstance(string loggerName=“myprojectLog”)
{
返回LazyLogFactory.Value.GetLogger(loggerName);
}
你的问题一开始是“处理器”提示线程,但实际上听起来像两个应用程序。2个应用程序不写入同一文件听起来很可能,因为它可能会打开带有锁的文件。感谢您的建议,我检查了NLog,concurrentWrites默认值为true:(