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

log4net - log into different files in a multitenant application

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

For Example-
tenant 1 - C://log/tenant1.log
tenant 2 - C://log/tenant2.log
tenant 3 - C://log/tenant3.log

实现此目的的一种方法是手动将不同的滚动文件附加程序添加到 web.config。

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

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

但这并没有帮助,因为它改变了全局上下文。一切都将登录到最后一个配置文件名。

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

我的附加程序:

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 class 不会存储文件路径,但也许 tenantID 和您的附加程序应该包含字典 TenantID -> 文件。出于性能原因,还可以更好地打开和保存文件以及对日志记录事件进行分组。

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

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