我正在开发多租户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类继承。我不知道您如何从上下文中识别租户,因此我创建了一个简单的实现,只是为了展示总体思路。
我的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">