Де log4net створить цей файл журналу?


77

Коли я встановлюю значення файлу logs\log-file.txt, де саме він створить цю папку? У /binкаталозі?

Мій web.config виглядає так:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="logs\log-file.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
</log4net>

Це правильний спосіб реєстрації:

ILog logger = LogManager.GetLogger(typeof(CCController));
logger.Error("Some Page", ex);  // where ex is the exception instance

Відповіді:


67

Якщо ви хочете, щоб ваш файл журналу розміщувався у вказаному місці, яке буде вирішено під час запуску, можливо, це буде вихідний каталог вашого проекту, тоді ви можете налаштувати .configзапис файлу таким чином

<file type="log4net.Util.PatternString" value="%property{LogFileName}.txt" />

а потім у коді перед викликом log4net configureвстановіть новий шлях, як показано нижче

 log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
 log4net.Config.XmlConfigurator.Configure();

Наскільки це просто? :)


2
Чудовий фокус, це допомагає розмістити всю конфігурацію в одному місці :)
Хоанг Лонг

1
Що робити, якщо вам потрібно кілька файлів журналу в одній програмі, кожен з яких має інший шлях, визначений під час виконання? Чи є спосіб встановити властивість LogFileName не в якомусь глобальному спільному контексті?
Джиммі

Є й інші шаблони, такі як% date {}, які можна використовувати після застосування типу log4net.Util.PatternString
Джастін

54

він створить файл у кореневому каталозі вашого проекту / рішення.

Ви можете вказати вибране місце в web.config вашого додатку таким чином:

   <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="c:/ServiceLogs/Olympus.Core.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value=".yyyyMMdd.log" />
      <maximumFileSize value="5MB" />
      <staticLogFileName value="true" />
      <lockingModel type="log4net.Appender.RollingFileAppender+MinimalLock" />
      <maxSizeRollBackups value="-1" />
      <countDirection value="1" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level [%thread] %logger - %message%newline%exception" />
      </layout>
    </appender>

тег файлу вказує місце розташування.


18
+1 - єдина відповідь, яка прямо відповідає на питання "Де log4net створить цей файл журналу?"
Кіт,

5
Привіт, Оладипо, для мене журнал без визначення шляху створюється в папці bin.
Помпарер

20

Значення файлу може бути або абсолютним шляхом, таким як "c: \ logs \ log.txt", або відносним шляхом, який, на мою думку, є відносно каталогу bin.

Що стосується його реалізації, я зазвичай розміщую наступне вгорі будь-якого класу, в який я планую ввійти:

private static readonly ILog Log = LogManager.GetLogger( 
MethodBase.GetCurrentMethod().DeclaringType);

Нарешті, ви можете використовувати його так:

Log.Debug("This is a DEBUG level message.");

5
хм ... здається, ніде не створюється файл журналу, і я не отримую жодної помилки?
Blankman

2
Звучить як проблеми з дозволами. Я б порівняв конфігурацію із абсолютним шляхом поза вашим веб-каталогом. Після цього переконайтеся, що файл журналу та папка мають дозволи, щоб дозволити робочому процесу asp.net належний доступ.
Ben.Vineyard

Для відносного шляху мені подобається, щоб файл журналу знаходився на рівні проекту: <file value = "../../log.text" />
Дейв Матер

@Blankman У мене була подібна проблема. Проблема не в шляху або дозволі, а в тому, що я забув зателефонувати у configure для запуску журналювання. Перегляньте відповідь на інше запитання щодо переповнення стека. stackoverflow.com/questions/20512548/…
Дріма

10

Log4net зберігає у папці проекту. Що - щось на кшталт: \SolutionFolder\ProjectFolder\bin\SolutionConfiguration\logs\log-file.txt.

Де:

  • SolutionFolder - це місце, де ви зберігаєте своє рішення
  • ProjectFolder - це папка, в якій ваш проект живе у вирішенні та
  • SolutionConfiguration - це папка, яка містить усі двійкові файли вашого проекту (за замовчуванням - Налагодження або Випуск)

Сподіваюся, це допомагає!


6
FileAppender appender = repository.GetAppenders().OfType<FileAppender>().FirstOrDefault();
if (appender != null)
    logger.DebugFormat("log file located at : {0}", appender.File);
else
    logger.Error("Could not locate fileAppender");

2
Репозиторій ILoggerRepository = log4net.LogManager.GetAllRepositories (). FirstOrDefault ();
Луї Сомерс,

2
Сховище вже тут: yourlogger.Logger.Repository. Таким чином , ви можете зробити це: yourlogger.Info($"Logfile opened: {m_Logger.Logger.Repository.GetAppenders().OfType<FileAppender>().FirstOrDefault()?.File}");. Зверніть увагу, що це не зламається, якщо щось є null.
Ніколас

4

Що стосується папки журналу та файлу, перейдіть із відповіддю @Bens .

Однак я буду коментувати створення журналу. Імо немає правильного шляху. При кодуванні реєстраторів вручну я роблю це так, як ви це робите:

ILog logger = LogManager.GetLogger(typeof(CCController));

тому що це коротко і лаконічно.

Тим не менш, я сьогодні не створюю екземпляри реєстратора всередині класів, я дозволяю своєму контейнеру IoC вводити його для мене .


0

Я думаю, що ваш зразок зберігається у папках проекту, і якщо користувач не має дозволу на створення за замовчуванням, або .NET, тоді він не зможе створити папку журналів.

Я спершу створив папку журналів і дозволив користувачеві iis отримати повний дозвіл і перевірити, чи створюється файл журналу.


0

якщо ви хочете динамічно вибрати шлях до файлу журналу, використовуйте метод, написаний у цьому посиланні: метод для динамічного вибору шляху до журналу .

якщо ви хочете, ви можете встановити шлях до місця існування файлу EXE вашого додатка таким чином -

var logFileLocation = System.IO.Path.GetDirectoryName
(System.Reflection.Assembly.GetEntryAssembly().Location);

а потім надішліть цей 'logFileLocation' до методу, написаного у посиланні вище, таким чином:

Initialize(logFileLocation);

і ви готові до роботи! :)


0

Я розробляв для .NET core 2.1, використовуючи log4net 2.0.8, і виявив, що код NealWalters стогне близько 0 аргументів для XmlConfigurator.Configure (). Я знайшов рішення, Метт Уотсон тут

        log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
        var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
        XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.