使用NLog的一些问题
Some questions about using NLog
我安装了 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。
Refer to Nlog's documentations 多个进程可以写入同一个文件,Nlog 可以处理。你也可以通过 concurrentWrites
属性.
来控制它
据我所知,当您调用 LogManager.GetLogger()
方法时,Nlog 会尽力 return 同一记录器实例。
如果您希望每个进程都有单独的日志文件,只需在 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");
我安装了 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。
Refer to Nlog's documentations 多个进程可以写入同一个文件,Nlog 可以处理。你也可以通过
concurrentWrites
属性. 来控制它
据我所知,当您调用
LogManager.GetLogger()
方法时,Nlog 会尽力 return 同一记录器实例。如果您希望每个进程都有单独的日志文件,只需在
上使用变量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");