Как указать общую папку данных приложения для log4net?
-
19-08-2019 - |
Вопрос
Я хочу, чтобы 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>
Хорошо, мы могли бы определить это в нашей настройке, но, может быть, у кого-то появится идея получше?
Решение
Это сообщение в log4net Список рассылки объясняет, как вы можете определить свои собственные переменные замены пути. Р>
Другие советы
Мы просто используем это:
<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>
Вот полный код из списка рассылки 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) будет более простой метод, как описано .
Полное и рабочее решение - содержимое моего файла 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>
В текущей версии log4net (2.0.8.0) вы можете просто использовать
<file value="${ProgramData}\myFolder\LogFiles\" />
для C:\ProgramData
${LocalAppData}
для C:\Users\user\AppData\Local\
и ${AppData}
для C:\Users\user\AppData\Roaming\
Сейчас (в 2018 году, февраль) согласно log4net версии 2.0.8.0.
Вы можете использовать без какого-либо конвертера для получения переменных среды следующим образом.
<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />
См. log4net.Util.PatternString документация класса для более подробной информации.