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

问题描述 投票:0回答:1

我正在开发多租户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"]** 

但是这无济于事,因为它改变了全局环境。一切都将登录到最后的配置文件名。

c# asp.net-mvc log4net multi-tenant log4net-configuration
1个回答
0
投票

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

我的Appender:

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" });

此代码创建两个单独的文件,并在需要时编写消息;

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

在app.config参考中,您的附加程序就像注册普通文件附加程序一样

<appender name="RollingLogFileAppender" type="log4nettesting.MyFileAppender">
© www.soinside.com 2019 - 2024. All rights reserved.