我在Windows服务中使用log4net。该服务处理一些RFID阅读器。目前,我们将所有Reader的所有任务记录在一个日志文件中。这很好用。 但现在我想在一个单独的文件中记录每个Reader的任务。读者通过其IP地址识别。所以我想把IP地址作为文件名的一部分。
log4net中用于创建动态文件追加器的选项似乎不适合我,因为每次写日志时我都必须管理从Reader到日志文件的分配。
是否有适当的方法在log4net中执行此操作,或者它是否可能?
答案 0 :(得分:0)
在我的Logclass中,我使用Dictionary<string, ILog>
作为Loggers。我重载了方法,要么使用Default-Logger,要么使用Dictionary
的密钥来使用指定的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和布局类。我使用LogManager.GetLogger
创建一个新的Logger。要添加追加器我要投射记录器,使用AddAppender
。
现在我只需要调用Log.Debug(readingPoint.IpAddress, "Some readingpoint specific log message.");
并将此消息发送到一个文件中,其中包含IP地址。