Как мне зарегистрировать файл класса без пути в log4net? - PullRequest
3 голосов
/ 07 августа 2009

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

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <!--etc-->
   <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%date [%thread] %-5level (%file:%line) %logger => %message%newline" />
  </layout>
</appender>

Однако атрибут% file делает мои записи в файле журнала слишком длинными, чтобы их было удобно читать ....

2009-08-07 16:41:55,271 [7] INFO  (O:\mystream\aevpallsrv\DotNet\com.mycompany.au\myapp\Myappp\Controller.cs:75) MyApp.Controller => Controller.EnqueueWorkerThreads() - START

Есть ли способ показать только файл класса ('Controller.cs') вместо полного пути к файлу?

Michael

Ответы [ 2 ]

5 голосов
/ 31 августа 2009

Хотя вы спрашиваете об имени файла, я думаю, что вы можете использовать % type , чтобы получить полное имя типа (a.b.className). Если вы просто хотите указать имя класса, используйте % type {1}

Обратите внимание, что любой метод, который генерирует информацию о вызывающем абоненте (% file и% type), связан с производительностью.

Кроме того, вы можете обойти производительность, назвав Logger именем типа.

namespace MyNamespace
{     
    public class Foo
    {
        private static ILog log = LogManager.GetLogger(typeof(Foo));
    }
}

Ваш шаблон конвертации будет выглядеть так:

"%date [%thread] %-5level %logger %message"

Где ваш регистратор будет " MyNameSpace.Foo ". Аналогично, если вам нужно только имя класса, используйте "% logger {1} , который будет преобразован в" Foo".

Одним из лучших преимуществ этого подхода является то, что вы можете использовать иерархическую систему хранилищ log4net для настройки уровней ведения журнала для каждого типа:

<!-- all classes in MyNamespace are warn -->
<logger name="MyNamespace">
     <level value="WARN" />
</logger>

<!-- only Foo is in debug -->
<logger name="MyNamespace.Foo">
    <level value="DEBUG" />
</logger>
2 голосов
/ 07 августа 2009

Из коробки, PatternLayout поддерживает только токен% file. Что вы можете сделать, так это создать подкласс PatternLayout и добавить свой собственный шаблон, скажем% filename, и для этого токена вывести только имя файла.

...