繁体   English   中英

NLOG:创建同一个类的多个实例将日志写入同一个文件

[英]NLOG: Creating multiple instances of same class writing log to same file

我正在尝试习惯 NLOG 并发现为同一类的多个实例设置日志文件很困难。 每个类都是在不同的线程上创建的。 请在下面找到示例代码:

    {
        ILogger mLogger;
        public string Name { get; set; }
        public string SecondName { get; set; }
        private string mFilePath = @"C:\Logs\";
        public test(string name, string secondname)
        {
            var target = new FileTarget(name) { FileName = mFilePath + name + ".txt" };
            var config = new LoggingConfiguration();
            config.AddRule(LogLevel.Info, LogLevel.Info, target);
            LogManager.Configuration = config;
            mLogger = LogManager.GetLogger(name);
            LogManager.ReconfigExistingLoggers();
            mLogger.Info("Hi from :" + name);
        }
    }
    static void Main(string[] args)
        {
            new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
            new Thread(new ThreadStart(() =>
            {
                new test("John", "Smith");
            })).Start();
            new Thread(new ThreadStart(() =>
            {
                new test("Virat", "Kohli");
            })).Start();
            new Thread(new ThreadStart(() =>
            {
                new test("Christiano", "Ronaldo");
            })).Start();

            new Thread(new ThreadStart(() =>
                {
                    new test("Pat", "cummins");
                })).Start();
            Console.Read();
        }

输出为: 2020-03-03 11:36:56.9404|INFO|Christiano|Hi from :Christiano 2020-03-03 11:36:56.9404|INFO|Stuart|Hi from :Stuart 2020-03-063 11 :56.9404|INFO|John|嗨,来自:John 2020-03-03 11:36:56.9404|INFO|Virat|嗨,来自:Virat 2020-03-03 11:36:56.9404|INFO|Pat|嗨,来自:Pat

仅来自一个文件 Christiano.txt

有人可以帮我配置这个吗?

谢谢你。

LogManager.Configuration是一个静态变量。 当您分配它时,您就会影响其他所有人。

而是为每个线程提供一个唯一的 Logger。 同一个 FileTarget 可以处理多个 Logger。

{
    ILogger mLogger;
    public string Name { get; set; }
    public string SecondName { get; set; }
    public test(string name, string secondname)
    {
        mLogger = LogManager.GetLogger(name);
        mLogger.Info("Hi from :" + name);
    }
}
static void Main(string[] args)
    {
        string mFilePath = @"C:\Logs\";
        var target = new FileTarget(name) { FileName = Path.Combine(mFilePath, "${logger}.txt") };
        var config = new LoggingConfiguration();
        config.AddRule(LogLevel.Info, LogLevel.Info, target);
        LogManager.Configuration = config;

        new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
        new Thread(new ThreadStart(() =>
        {
            new test("John", "Smith");
        })).Start();
        new Thread(new ThreadStart(() =>
        {
            new test("Virat", "Kohli");
        })).Start();
        new Thread(new ThreadStart(() =>
        {
            new test("Christiano", "Ronaldo");
        })).Start();

        new Thread(new ThreadStart(() =>
            {
                new test("Pat", "cummins");
            })).Start();
        Console.Read();
    }

或者,您可以为线程分配名称,并在 FileName-Layout 中使用 NLog ${threadname}而不是${logger}

另一种选择是使用 NLog MappedDiagnosticsLogicalContext.SetScoped("TestName", name)创建一个范围并在 FileName-Layout 中使用${mdlc:TestName} 这也将允许您将初始上下文流到异步任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM