关于使用NLog的一些问题
本文关键字:问题 于使用 NLog | 更新日期: 2023-09-27 18:18:53
我安装了Nlog并进行了如下配置
public static Logger _logger = null;
static void foo()
{
var config = new LoggingConfiguration();
var fileTarget = new FileTarget();
config.AddTarget("file", fileTarget);
// Step 3. Set target properties
fileTarget.Layout = @"${date:format=HH':mm':ss} - ${message}";
fileTarget.FileName = "c:/myFolder/" + "${date:format=yyyy-MM-dd}.log";
var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule2);
// Step 5. Activate the configuration
LogManager.Configuration = config;
// Example usage
_logger = LogManager.GetLogger("Example");
_logger.Error("error log message");
}
但是我想问一些问题。
我要从DLL中使用NLog。如果许多不同的程序使用我的DLL,写日志文件还安全吗?当不同的程序试图通过NLog写入相同的日志文件时,会不会有竞争?
是否可以在整个DLL中使用Logger类型的单个静态变量?
是否有可能在我的DLL中使用NLog,以便使用DLL的应用程序可以配置输出到不同的日志文件,例如?如何做到这一点?换句话说,正如我所说,我的DLL正在使用NLog。假设我的DLL有方法
foo
,它使用NLog写入日志文件。现在,当有人想要使用我的DLL时,他们可以指定NLog应该在哪个文件夹中写入。现在,当其他程序开始使用我的DLL时,我希望它们也能够指定要写入的不同文件夹。你看到了吗?因此,程序A使用我的DLL写入文件夹C,但程序B同时也使用我的DLL写入文件夹D。
-
参考Nlog的文档,多个进程可以写入同一个文件,Nlog可以处理。也可以通过
concurrentWrites
属性来控制 -
据我所知,当你调用
LogManager.GetLogger()
方法时,Nlog尽量返回记录器的相同实例。 -
如果您想要每个进程单独的日志文件,只需在
FileName
上使用变量fileTarget.FileName = "c:/myFolder/${processid}/${date:format=yyyy-MM-dd}.log"
或
fileTarget.FileName = "c:/myFolder/${processname}/${date:format=yyyy-MM-dd}.log"
但是如果你想让你的用户可以改变日志路径,你可以将路径保存在应用程序的相对文件中,并在每次需要时将其设置为fileTarget.FileName
。
// imagine this method returns "c:/myPath"
string logFolderPath = AskPathFromUser();
// since your logPath.txt file is app relative.
// each process will have own file next to process file.
File.WriteAllText("logPath.txt", logFolderPath);
// now every time you need to set the path read the saved path from file
fileTarget.FileName=Path.Combine(File.ReadAllText("logPath.txt"),"${date:format=yyyy-MM-dd}.log");