关于使用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");
    }

但是我想问一些问题。

  1. 我要从DLL中使用NLog。如果许多不同的程序使用我的DLL,写日志文件还安全吗?当不同的程序试图通过NLog写入相同的日志文件时,会不会有竞争?

  2. 是否可以在整个DLL中使用Logger类型的单个静态变量?

  3. 是否有可能在我的DLL中使用NLog,以便使用DLL的应用程序可以配置输出到不同的日志文件,例如?如何做到这一点?换句话说,正如我所说,我的DLL正在使用NLog。假设我的DLL有方法foo,它使用NLog写入日志文件。现在,当有人想要使用我的DLL时,他们可以指定NLog应该在哪个文件夹中写入。现在,当其他程序开始使用我的DLL时,我希望它们也能够指定要写入的不同文件夹。你看到了吗?因此,程序A使用我的DLL写入文件夹C,但程序B同时也使用我的DLL写入文件夹D。

关于使用NLog的一些问题

  1. 参考Nlog的文档,多个进程可以写入同一个文件,Nlog可以处理。也可以通过concurrentWrites属性来控制

  2. 据我所知,当你调用LogManager.GetLogger()方法时,Nlog尽量返回记录器的相同实例。

  3. 如果您想要每个进程单独的日志文件,只需在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");