在我的 Logclass 中,我为我的 Loggers 使用了 Dictionary<string, ILog>。我已经重载了方法,它们要么使用 Default-Logger,要么获取 Dictionary 的 Key 以使用指定的 Logger。
public static class Log
{
private static readonly Dictionary<string, ILog> loggers = new Dictionary<string, ILog>();
static Log()
{
XmlConfigurator.Configure();
}
public static void Debug(string message)
{
Debug(Logger.Default, message);
}
public static void Debug(string readerIp, string message)
{
GetLoggerInternal(readerIp).Debug(message);
}
private static ILog GetLoggerInternal(string logger)
{
if (!loggers.ContainsKey(logger))
{
var appender = CreateRollingFileAppender(logger);
appender.ActivateOptions();
loggers.Add(logger, LogManager.GetLogger(logger));
((log4net.Repository.Hierarchy.Logger)loggers[logger].Logger).AddAppender(appender);
}
return loggers[logger];
}
private static RollingFileAppender CreateRollingFileAppender(string readingPointIp)
{
var layout = new PatternLayout
{
ConversionPattern = "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"
};
layout.ActivateOptions();
return new RollingFileAppender
{
Name = readingPointIp,
AppendToFile = true,
DatePattern = "yyyyMMdd",
MaximumFileSize = "1MB",
MaxSizeRollBackups = 10,
RollingStyle = RollingFileAppender.RollingMode.Composite,
File = $"..\\Log\\{readingPointIp}_log.txt",
Layout = layout
};
}
}
调用.ActivateOptions(); 方法很重要,它们会实例化Appender 和Layout 类。我使用LogManager.GetLogger 创建一个新的记录器。要添加附加程序,我必须强制转换记录器,以使用 AddAppender。
现在我只需拨打Log.Debug(readingPoint.IpAddress, "Some readingpoint specific log message."); 并将此消息保存在一个文件中,并在其名称中包含 IP 地址。