Как создать новый файл журнала для каждого запуска приложения

Как заголовок подразумевает, как я могу создать новый файл журнала для каждого запуска приложения? Я знаю, как это сделать за минуту/час/и т.д. но не для приложения. пробег

Есть то, что у меня есть сейчас:

target name="Debug" archiveEvery="Hour"
archiveFileName="${basedir}/logs/Debug.{#####}.txt" maxArchiveFiles="4" 
archiveNumbering="Sequence" xsi:type="File" fileName="${basedir}/logs/Debug.txt" 
layout="${date:format=HH\:mm\:ss} | ${level} | ${message} ${exception}
${exception:format=stacktrace}"

Но на самом деле мне не нужно архивировать каждый час, я хочу архивировать каждый раз при запуске моего приложения. Существует то, что я нашел в старом форуме, но я не знаю, как использовать Cached_layout_renderer

Ответ 1

Я сам столкнулся с этой проблемой, и мне потребовалось много времени, чтобы понять это. Большинство ответов, которые я нашел, имеют только часть решения и не объясняют, как и почему он работает..., что затрудняет адаптацию, если у вас немного другой вариант использования.

Пример:

<target name="log"
   xsi:type="File"
   fileName="${basedir}/logs/log.${longdate:cached=true}.log"
   layout="${message}"
   archiveFileName="${basedir}/logs/archives/log.${shortdate}.{#}.log"
   archiveAboveSize="5242880"
   archiveEvery="Day"
   archiveNumbering = "Rolling"
   maxArchiveFiles="20" 
   />

Объяснение

Вы должны использовать как кэшированный макет рендеринга, так и переменную longdate. Чтобы понять, почему это работает, вам нужно понять, как они работают, и как они взаимодействуют.

longdate

fileName="${basedir}/logs/log.${longdate}.log"

Использование переменной longdate в вашем имени журнала в значительной степени гарантирует новый файл журнала при каждом выполнении... кроме того, что он создает новый файл журнала каждые миллисекунды даже во время одного выполнения, что, вероятно, нежелательно, за исключением самых редких обстоятельства.

Кэшированный макет рендеринга:

fileName="${basedir}/logs/log.${shortdate:cached=true}.log"

Средство кэширования макетов кэширует переменную при первом вызове журнала, а затем всегда использует это значение для последующих записей... но кеш сохраняется только до завершения выполнения. Использование shortdate или любой другой переменной, которая не гарантируется для каждого исполнения, не будет работать. Он найдет файл журнала с тем же именем файла, который он хочет использовать, и он просто добавит (или удалит, если у вас есть этот набор). Это не то, что мы хотим.

Комбинированный

fileName="${basedir}/logs/log.${longdate:cached=true}.log"

Это работает, потому что он берет миллисекундную метку времени первого журнала за выполнение, а затем кэширует его и всегда использует этот файл журнала, пока выполнение не завершится (очистка кеша). В следующий раз, когда вы запустите его (если только это не будет миллисекунда... маловероятно!), Вы получите новое кешированное значение и новый файл журнала (но только один!).

Ответ 2

NLog FileTarget теперь поддерживает архив свойствOldFileOnStartup (выпуск NLog-3-2-0).

archiveOldFileOnStartup="true"

В этом могут быть некоторые проблемы, но если одновременно запускается только один экземпляр приложения, он должен иметь желаемое поведение.

Ответ 4

archiveOldFileOnStartup = "true" archiveNumbering = "Rolling" deleteOldFileOnStartup = "true"

Заархивирует существующий файл и удалит его. Таким образом, вы всегда получаете новый файл.