Настройка приложений log4net с помощью XML-файла * и * кода - PullRequest
2 голосов
/ 11 мая 2010

Я начал играть с log4net сегодня, и пока мне очень нравится. Чтобы сохранить текущие функциональные возможности ведения журнала, приложение должно создавать новый файл журнала при каждом запуске приложения. Имя файла журнала содержит дату и время, закодированные в нем. В настоящее время я настроил log4net через XmlConfigurator, что прекрасно работает, за исключением того, что имя файла для моего RollingFileAppender жестко закодировано в XML-файле конфигурации.

Я бы хотел продолжить использовать XmlConfigurator, но после вызова Configure() я хочу получить значение RollingFileAppender и в коде изменить его значение файла на динамически генерируемую строку. Пример документации онлайн , похоже, сейчас недоступен, но я просмотрел ссылку на SDK, и похоже, что я могу использовать Heirarchy и GetAppenders(), чтобы сделать то, что мне нужно. Я на правильном пути?

Хорошо, я попробовал и попробовал следующий код, который не работал:

private static readonly ILog _log = LogManager.GetLogger(typeof(GUI));
// in the config file, I've set the filename to example.log, and it works
XmlConfigurator.Configure(new FileInfo("log_config.xml"));
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
if(hierarchy != null) {
    // get the appenders
    IAppender[] appenders = hierarchy.GetAppenders();
    // change the filename for the RollingFileAppender
    foreach( IAppender a in appenders) {
        RollingFileAppender rfa = a as RollingFileAppender;
        if(rfa == null)
            continue;
        rfa.File = "newfile.log"; // no runtime error, but doesn't work.
    }
}
_log.Info("Application started");

Ответы [ 2 ]

8 голосов
/ 11 мая 2010

Попробуйте этот фрагмент:

XmlConfigurator.Configure();

log4net.Repository.ILoggerRepository repo = LogManager.GetRepository();
foreach (log4net.Appender.IAppender appender in repo.GetAppenders())
{
if (appender.Name.CompareTo("RollingFileAppender") == 0 && appender is log4net.Appender.RollingFileAppender)
{
   var appndr = appender as log4net.Appender.RollingFileAppender;
   string logPath = "MyApplication.log";
   appndr.File = logPath;
   appndr.ActivateOptions();
}

Я опубликовал похожую статью здесь

2 голосов
/ 11 мая 2010

Нужен ли вам в этом случае аппликатор накатывания файлов?В противном случае я ожидал бы, что ваш код создаст желаемый результат, если вы используете обычный файловый appender.

Редактировать: Возможно, он работает с RollingFile Appender, если вы вызываете ActivateOptions() на appender.

...