私はそれを純粋に<log4net>-configuration
で解決できませんでした。私が達成したいのは、コードを変更したり、変更を再コンパイルしたりする必要のない、最大構成可能なアペンダーでした。
しかし、私はそれを動作させるためにコードをとにかく使いました。 他人に役立つかもしれない。 次のようになりました:
public class FileAppender : IAppender
{
public void RegisterLogger(ILoggerRepository repository, IConfig config)
{
if (!config.isActive) return;
if (repository.GetAppenders().Any(x => x.Name.Equals(config.logName, StringComparison.InvariantCultureIgnoreCase))) return;
if (config.path.EndsWith(@"\") == false)
path += @"\";
var rollingFileAppender = new RollingFileAppender
{
Name = config.logName,
AppendToFile = true,
File = config.path,
RollingStyle = RollingFileAppender.RollingMode.Date,
StaticLogFileName = false,
DatePattern = $"'{config.logName}_'yyyyMMdd'.log'",
LockingModel = new log4net.Appender.FileAppender.MinimalLock(),
Layout = new log4net.Layout.PatternLayout("%date %-5[%level] - %message%newline"),
};
var filters = new List<log4net.Filter.IFilter>() {
new log4net.Filter.LoggerMatchFilter() { LoggerToMatch = config.logName, AcceptOnMatch = true },
new log4net.Filter.DenyAllFilter(),
};
foreach (var filter in filters)
{
filter.ActivateOptions();
rollingFileAppender.AddFilter(filter);
}
rollingFileAppender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(rollingFileAppender);
}
public void Write(IConfig config, LogData data)
{
if (!config.isActive) return;
var textLogger = LogManager.GetLogger(config.logName);
var text = $"{data.Sender} - {data.Ip} - {data.Locator} - {data.Text} - {data.Args}";
textLogger.Info(text);
}
}
これは間違いなくコード内で実行したいことのようです。特定のアペンダーは一度に1つのファイルにしか書き込めないことに注意してください。複数のログファイルと同時書き込みがある場合、ファイルごとにロックまたはより良い1つのアペンダーを使用する必要があります。 – stuartd