Log4Net с использованием RollingFileAppender, объединяющего атрибут в данных журнала и сегодняшнюю дату

Я устанавливаю upp Log4Net с конфигурациями в web.config и хочу создавать текстовые журналы (RollingLogFileAppender) на основе свойства в данных в сочетании с сегодняшней датой. (Это было возможно в коде раньше, но было немного некрасиво, поэтому переместили все в web.config):

Примерно так BOOKINGS_20160405.txt.

Итак, если данные (словарь с ключами / значениями), которые я хочу зарегистрировать, имеют ключ с именем Source: BOOKING, мне нужен результат, указанный выше. Этот источник может содержать несколько других категорий и должен быть сохранен в этом файле журнала.

Я пробовал несколько подходов с datePattern, но не нашел решения.

Возможно ли это без написания кода? Может мне вообще не стоит использовать для этого RollingLogFileAppender?

Может быть, я смогу создать собственное приложение, сделав то, что я хочу?


person Hypnobrew    schedule 05.04.2016    source источник
comment
Это определенно похоже на то, что вы хотите сделать в коде. Имейте в виду, что данное приложение может записывать только один файл за раз, поэтому, если у вас есть несколько файлов журнала и одновременная запись, вам придется либо использовать блокировку, либо, что лучше, по одному приложению на файл.   -  person stuartd    schedule 06.04.2016


Ответы (1)


Так что я не смог решить это чистым <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);
        }
}
person Hypnobrew    schedule 07.04.2016