Как указать общую папку данных приложения для log4net? - PullRequest
35 голосов
/ 22 января 2009

Я хочу, чтобы log4net записывал файлы журнала (используя RollingFileAppender) в подпапку общей папки данных приложения (например, C: \ Documents and Settings \ All Users \ Application Data \ Company \ Product \ Logs).
Однако в Win XP нет переменной среды, которая указывает эту папку. У нас есть %ALLUSERSPROFILE%, у нас есть %APPDATA%, но нет ничего похожего на %ALLUSERSAPPDATA%.
В программном плане я мог бы использовать Environment.SpecialFolder.CommonApplicationData, но мне нужно поместить его в конфигурацию log4net, что-то вроде этого:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" />
</appender>

Хорошо, мы могли бы определить это в нашей настройке, но, может быть, кто-то придумает лучшую идею?

Ответы [ 6 ]

33 голосов
/ 11 декабря 2009

Мы просто используем это:

<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>

Отлично работает.

<ч /> Эту строку можно просто вставить в текущую конфигурацию приложения:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
</appender>
12 голосов
/ 08 декабря 2010

Вот полный код из списка рассылки log4net, с которым pilif связан:

По сути, метод заключается в реализации пользовательского конвертера шаблонов для файла конфигурации log4net.

Сначала добавьте этот класс в ваш проект:

public class SpecialFolderPatternConverter : log4net.Util.PatternConverter
{
    override protected void Convert(System.IO.TextWriter writer, object state)
    {
        Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
        writer.Write(Environment.GetFolderPath(specialFolder));
    }
}

Затем настройте параметр File вашего FileAppender следующим образом:

<file type="log4net.Util.PatternString">
    <converter>
      <name value="folder" />
      <type value="MyAppName.SpecialFolderPatternConverter,MyAppName" />
    </converter>
    <conversionPattern value="%folder{CommonApplicationData}\\SomeOtherFolder\\log.txt" />
</file>

В основном %folder говорит ему взглянуть на конвертер с именем folder, который указывает на класс SpecialFolderPatternConverter. Затем он вызывает Convert для этого класса, передавая значение перечисления CommonApplicationData (или любого другого).

Очевидно, что в следующем выпуске log4net (1.2.11) будет более простой метод, как описано здесь .

12 голосов
/ 22 января 2009

Эта запись в списке рассылки log4net объясняет, как вы можете определить свои собственные переменные замены пути.

3 голосов
/ 12 июня 2014

Полное и рабочее решение - содержимое моего файла Log4net.config. В реальной версии Log4Net больше нет необходимости писать собственный конвертер шаблонов

<?xml version="1.0"?>
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\MyProject\\Logs\\log.txt" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="100MB" />
    <layout type="log4net.Layout.PatternLayout">
      <ConversionPattern type="log4net.Util.PatternString" value="%%-5p %%d{yyyy-MM-dd HH:mm:ss} - %%m%%n" />
    </layout>
  </appender>
</log4net>
1 голос
/ 13 сентября 2018

В текущей версии log4net (2.0.8.0) вы можете просто использовать

<file value="${ProgramData}\myFolder\LogFiles\" /> для C:\ProgramData

${LocalAppData} для C:\Users\user\AppData\Local\

и ${AppData} для C:\Users\user\AppData\Roaming\

0 голосов
/ 19 февраля 2018

Сейчас (в 2018 Февраль) согласно log4net версии 2.0.8.0.

Вы можете использовать без какого-либо конвертера для получения переменных среды следующим образом.

<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />

См. log4net.Util.PatternString документация класса для получения более подробной информации.

...