log4net может справиться с этим для вас. Любое свойство appender типа string можно отформатировать, в этом случае с помощью обработчика опций log4net.Util.PatternString . PatternString даже поддерживает перечисление SpecialFolder , которое включает следующую элегантную конфигурацию:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<file type="log4net.Util.PatternString"
value="%envFolderPath{CommonApplicationData}\\test.txt" />
...
</appender>
Вот модульный тест, который подтверждает пудинг:
[Test]
public void Load()
{
XmlConfigurator.Configure();
var fileAppender = LogManager.GetRepository()
.GetAppenders().First(appender => appender is RollingFileAppender);
var expectedFile =
Path.Combine(
Environment.GetFolderPath(
Environment.SpecialFolder.CommonApplicationData),
"test.txt");
Assert.That(fileAppender,
Is.Not.Null & Has.Property("File").EqualTo(expectedFile));
}
Следующий тест проверяет, что log4net действительно записывает на диск (что в основном делает это "интеграционным" тестом, а не модульным тестом, но мы пока оставим его здесь):
[Test]
public void Log4net_WritesToDisk()
{
var expectedFile =
Path.Combine(
Environment.GetFolderPath(
Environment.SpecialFolder.CommonApplicationData),
"test.txt");
if (File.Exists(expectedFile))
File.Delete(expectedFile);
XmlConfigurator.Configure();
var log = LogManager.GetLogger(typeof (ConfigTest));
log.Info("Message from test");
LogManager.Shutdown();
Assert.That(File.ReadAllText(expectedFile),
Text.Contains("Message from test"));
}
Примечание: я настоятельно рекомендую использовать синтаксис компактных свойств, показанный в приведенном выше примере. Удаление всех этих «