Как указать путь к файлу журнала, используя расположение папок в Windows с помощью конфигуратора log4net xml?

В моем app.config я поставил

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="%programdata%/log-file.txt"/>

но это не сработало. Любые идеи?


person Jader Dias    schedule 26.07.2010    source источник
comment
Да, он не расширяет %programdata%.   -  person    schedule 26.07.2010


Ответы (4)


Синтаксис log4net для расширения переменных среды: «$ {Variable}», например.

<file value="${LOCALAPPDATA}\GojiSoft\GojiLog\log.txt" />
person Tim Lloyd    schedule 26.07.2010
comment
этот синтаксис специфичен для log4net? будет ли это работать в других настройках? - person Jader Dias; 26.07.2010
comment
@Jader Это специально реализовано в log4net. - person Tim Lloyd; 26.07.2010
comment
Хотя ваш пример работает нормально, ${PROGRAMDATA} не работает. Но я думаю, что это какая-то проблема с разрешением. - person Jader Dias; 26.07.2010
comment
@Jader Владелец процесса должен иметь разрешение на запись в указанное место. - person Tim Lloyd; 26.07.2010
comment
у вас есть ссылка на справочную страницу, на которой рассказывается об этом синтаксисе log4net? - person Jader Dias; 13.01.2011
comment
@XMLforDummies Боюсь, я не могу найти никакой конкретной документации для этой функции. Однако эта функция просто позволяет расширять переменные среды, когда используется описанный выше синтаксис. В каком аспекте вы были не уверены? - person Tim Lloyd; 13.01.2011
comment
Я пытаюсь назвать файл журнала в соответствии с вызывающей сборкой. Я не смог найти подходящую переменную. - person Jader Dias; 13.01.2011
comment
@XMLforDummies Понятно. Хорошо, этот вопрос касается переменных среды, которые не имеют ничего общего с log4net. Log4net просто слепо запросит у ОС значение переменной. - person Tim Lloyd; 13.01.2011
comment
Эти имена являются переменными среды Windows. Перечислено здесь: ss64.com/nt/syntax-variables.html Итак, для ведения журнала служб в c:\ProgramData\... используйте ALLUSERSPROFILE или альтернативно ProgramData. Для приложений, установленных локально только для текущего пользователя, используется LOCALAPPDATA. - person Curtis Yallop; 14.06.2014
comment
Это не работает на разных платформах, потому что «\» не является разделителем пути в Linux, вместо этого он будет записываться в файл с именем «GojiSoft\GojiLog\log.txt» непосредственно в локальной папке данных приложения. - person trampster; 11.05.2015

Воскрешая старую тему здесь, но я столкнулся с той же проблемой и решил поделиться.

${PROGRAMDATA}, как обсуждалось в ветке комментариев другого ответа, у меня не сработало (так же, как и для OP). Однако я где-то видел комментарий о том, что он чувствителен к регистру. Попробовал ${ProgramData} и, конечно же, все заработало.

person teleute00    schedule 30.10.2013
comment
Был такой же опыт. Мне пришлось использовать LOCALPPDATA в верхнем регистре, чтобы это работало. Ошибка LocalAppData. - person Robert Graves; 19.11.2013
comment
Хммм... должна быть разница в версиях чего-то - будь то винда, компиляторы, сам log4net, хотя я не уверен. - person teleute00; 19.11.2013
comment
Обратите внимание, что ProgramData означает, что каждый пользователь использует один и тот же журнал. - person Polluks; 22.01.2019
comment
и я пробовал все пути (localappdata, appdata, programdata) в разных случаях, и ни один из них не работает. Это всегда заканчивается созданием таких папок, как ${ProgramData}. в папке бин. Так раздражает - person Blechdose; 12.01.2020

Используйте ${APPDATA} вместо ${LOCALAPPDATA}

person Leo    schedule 25.11.2018

Мы обнаружили, что при использовании Log4Net с DotNetCore и методом расширения Microsoft.Extensions.Logging.Log4NetProvider переменные среды не передаются. Это связано с тем, что конфигуратор log4net настраивается путем анализа файла конфигурации log4net в формате XML перед его передачей в конфигуратор log4net, который обходит подстановку переменных среды. Однако вы можете переопределить свойства, выполнив следующие действия:

hostBuilder.ConfigureLogging(logBuilder =>
            {
                var logsPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
                logBuilder.AddLog4Net(new Log4NetProviderOptions
                    {
                        PropertyOverrides = new List<NodeInfo>
                        {
                            new NodeInfo
                            {
                                XPath = "//appender[@name='rollingFile']//file",
                                Attributes = new Dictionary<string, string>
                                {
                                    {
                                        "value", Path.Combine(logsPath, "Application.log") 
                                    }
                                }
                            }
                        }
                    });
            });
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="console" />
    <appender-ref ref="rollingFile" />
  </root>
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %level - %message%newline" />
    </layout>
  </appender>
  <appender name="rollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="Application.log" /> <!--This is overidden at run time. Based on the appender name: rollingFile.-->
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>
person Yerttle    schedule 04.06.2020