У меня есть файл NLog.config со следующей переменной
<variables>
<variable name = "LogsFilePath" value = "${appsetting:item=LogsFolderPath:default=C:\Company\Logs}" >
</variables>
<targets>
<target name = "File"
xsi:type = "File"
fileName = "${LogsFilePath}\${event-properties:FileName}.log" />
</targets>
<rules>
<rule logger = "DynamicLogger_*" minLevel = "Trace" writeTo = "File" />
</rules>
Когда в файле app.config нет значения, принимается значение по умолчанию только C (из-за двоеточия).
Моя цель примерно такая
Также, если я использую переменную в файле конфигурации, например ${var:LogsFilePath}, у меня возникают проблемы из-за двоеточия. Я должен использовать его со статической формой ${LogsFilePath}
Как я могу решить эту проблему и использовать путь в качестве значения по умолчанию в пути по умолчанию переменной appsetting?
Возможно также добавить запасной вариант для имени файла, например: fileName = "${LogsFilePath}\${event-properties:FileName:whenEmpty=App}.log". Рассмотрите возможность использования NLog GDC вместо NLog LogEvent-Properties для имени файла. Смотрите также github.com/NLog/NLog/wiki/Context
@RolfKristensen Я использую свойства, потому что хочу использовать одну и ту же цель для разных регистраторов, созданных динамически, и я хочу иметь возможность указать имя файла. В моем коде я создаю регистраторы с именем "DynamicLogger_*" и устанавливаю для них свойство имени файла. Я отредактировал вопрос с частью правил. Я не уверен, подходит ли GDC для этого, потому что он динамический.
Если вы сделаете это NLog.LogManager.GetLogger("DynamicLogger.MyFileName") с этим <rule logger = "DynamicLogger.*" minLevel = "Trace" writeTo = "File" />, то вы можете указать FileName следующим образом: fileName = "${LogsFilePath}\${logger:shortName=true}.log" См. также: github.com/NLog/NLog/wiki/Logger-Layout-Renderer (Устранение необходимости включать FileName в свойствах LogEvent)
Вам нужно убежать от него. Замените «:» на «\:», также вам нужно экранировать обратную косую черту.
У меня так работает
<variables>
<variable name = "LogsFolderPath" value = "${appsetting:item=LogsFolderPath:default=C\:\\Company\\Logs}" />
</variables>
В StackOverflow вам тоже нужно избегать их, исправлено. Также двойные точки называют двоеточием
Поэтому я должен поставить C\:\Company\Logs. правильный?
Да это правильно
Я думаю, что это не работает, потому что он пытается сохранить журналы в C:\log.log, поэтому он не использует полный путь
О, похоже, вам тоже нужно экранировать обратную косую черту
Я пробовал с C\\:\\Company\\Logs, а также с C\:\\Company\\Logs Никто не работает У меня есть исключение для разрешений, потому что он не может писать на C
Попробуйте использовать ${appsetting:item=LogsFolderPath:default=${literal:text=C\:\\Company\\Logs}}"
Это работает, когда я добавляю экраны: value = "${appsetting:item=LogsFolderPath:default=C\:\\Company\\Logs}". В качестве альтернативы можно использовать whenEmpty. value = "${appsetting:item=LogsFolderPath:whenEmpty=C\:\\Company\\Logs}". (Конечно, резервный вариант требует, чтобы у вас было действительное разрешение на запись файлов на диск C)