C# log4net-登录到多租户应用程序中的不同文件

C# log4net-登录到多租户应用程序中的不同文件,c#,asp.net-mvc,log4net,multi-tenant,log4net-configuration,C#,Asp.net Mvc,Log4net,Multi Tenant,Log4net Configuration,我正在开发一个多租户C应用程序。我使用log4net进行日志记录。到目前为止,我将所有内容都记录到一个日志文件中。我想将与特定租户相关的所有内容都记录到一个单独的文件中 For Example- tenant 1 - C://log/tenant1.log tenant 2 - C://log/tenant2.log tenant 3 - C://log/tenant3.log 实现这一点的一种方法是将不同的RollingFileAppender手动添加到web.config 通过以下方法,您

我正在开发一个多租户C应用程序。我使用log4net进行日志记录。到目前为止,我将所有内容都记录到一个日志文件中。我想将与特定租户相关的所有内容都记录到一个单独的文件中

For Example-
tenant 1 - C://log/tenant1.log
tenant 2 - C://log/tenant2.log
tenant 3 - C://log/tenant3.log
实现这一点的一种方法是将不同的RollingFileAppender手动添加到web.config

通过以下方法,您可以动态设置文件名

**log4net.GlobalContext.Properties["LogFileName"]** 

但这并没有帮助,因为它改变了全球环境。所有内容都将记录到最后一个配置文件名中

您可以尝试从FileAppender类继承。我不知道如何从上下文中识别租户,所以我创建了一个简单的实现来展示总体思路

我的附加者:

public class MyFileAppender : FileAppender
{
    protected override void Append(LoggingEvent loggingEvent)
    {
        var myMessage = loggingEvent.MessageObject as MultitenantMessage;
        if (myMessage == null) return;
        OpenFile(myMessage.File, true);
        base.Append(loggingEvent);
    }
}
它适用于自定义登录消息:

public class MultitenantMessage
{
    public string Message { get; set; }
    public string File { get; set; }

    public override string ToString()
    {
        return Message;
    }
}
用法如下所示:

    logger.Debug(new MultitenantMessage {Message ="Tenant 1 here!", File=@"C:\logs\tenant1.txt" });
    logger.Debug(new MultitenantMessage {Message ="Tenant 2 also works!", File=@"C:\logs\tenant2.txt" });
此代码创建两个单独的文件,并在需要时写入消息

当然,这只是一个概念证明。您必须创建租户及其日志文件的某种字典,并将租户上下文传递给appender。我是通过传递文件路径来实现这一点的。在最后的实现中,MultitenantMessage类不会存储文件的路径,但tenantID和您的附加程序可能应该包含dictionary tenantID->file。此外,出于性能原因,可以更好地打开和保存文件,并对日志事件进行分组

在app.config引用中,您的appender与注册普通文件appender一样

<appender name="RollingLogFileAppender" type="log4nettesting.MyFileAppender">

我实现了这个,它工作了。谢谢你,伙计。顺便说一下,我正在使用子域来标识每个租户。干杯