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