我安装了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写入文件夹C:使用我的DLL但程序B写入文件夹D:同时使用我的DLL。
答案 0 :(得分:0)
Refer to Nlog's documentations多个进程可以写入同一个文件,Nlog可以处理。您也可以通过concurrentWrites
属性来控制它。
据我所知,代码Nlog在您调用LogManager.GetLogger()
方法时最好返回同一个记录器实例。
如果您希望每个进程都有单独的日志文件,只需使用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");