log4net не работает

123

Привет, у меня есть эта конфигурация в моем web.config

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

но log4net не работает. Мой проект компилируется нормально, и я не получаю ошибок при отладке. Строки, в которых я говорю, log.debug("somemessage")работают нормально, но я не могу найти mylog.logфайл, так где он?

Jakob
источник
Обязательно проверьте и это: stackoverflow.com/a/24617269/114029
Лениэль Маккаферри,

Ответы:

298

Один из подводных камней для такого рода вещей - обязательно добавить XmlConfiguratorатрибут в сборку, разместив следующую строку в вашем AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

В противном случае log4net никогда не активируется.

Кирк Уолл
источник
5
Раньше этот метод работал в моем проекте, но почему-то перестал работать. Мне пришлось использовать этот метод stackoverflow.com/a/1479343/193634, чтобы он снова заработал.
Росди Касим
Я просто попробовал еще раз, и все работает нормально. Скорее всего, вы не ссылаетесь / не загружаете сборку, содержащую файл, AssemblyInfoкак только вы подумали.
Кирк Уолл,
Для тех, кто использует приложение ELMAH, это правильный путь. У меня был log4net.Config.XmlConfigurator.Configure (); в global.asax.cs, и он отлично работал для файловых приложений, но не для приложений ELMAH.
user3885927
Я поставил галочку на этот ответ и обнаружил, что мне нужно настроить его с помощью `[assembly: log4net.Config.XmlConfigurator (Watch = true)]`
Дэвид Сэвидж
49

Я предполагаю, что либо log4net вообще не ведет журнал, либо файл не попадает туда, где вы этого ожидаете.

Во-первых, вы действительно звонили

XmlConfigurator.Configure()

в любом месте вашего кода? Если приведенный выше фрагмент xml находится в файле конфигурации приложения, этот вызов поможет. Если фрагмент xml находится в собственном файле, вам нужно будет использовать .Configure(string)перегрузку, которая берет путь к файлу. Без этого вызова (или, очевидно, атрибута уровня сборки, упомянутого Кирком Воллом) log4net вообще не будет вести журнал.

Если вы считаете, что все это сделано и log4net должен вести журнал, то, возможно, вам следует указать полный путь к файлу журнала при дальнейшей отладке. Это позволит вам быть уверенным, где должен быть файл .

Роб Левин
источник
33

Есть еще одна небольшая ошибка, см. Здесь: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

[assembly: log4net.Config.XmlConfigurator]метод не работает с app.config. Если вы настраиваете log4net из app.config, вы должны использовать этот log4net.Config.XmlConfigurator.Configure()метод.

Амир Абири
источник
Для записи, оба метода работали у меня в консольном приложении.
ярость
Подтверждаю решение выше - мне пришлось вызвать log4net.Config.XmlConfigurator.Configure (); в моем коде (который использует app.config для эффективной работы log4net. Строки, которые выводятся на печать, - это строки, следующие после выполнения метода Configure ().
Луиза Роси,
19

Вот мой контрольный список для случаев, когда log4net оказывается непокорным:

  • убедитесь, что файл log4net.config копируется в папку bin \ при сборке (в компиляторе установлено «Копировать, если новее»)
    • при работе с установленным кодом убедитесь, что файл log4net.config используется для поездки (в компиляторе установлено значение «Content»)
  • убедитесь, что пользователь, от имени которого запускается процесс, имеет права на запись в папку, в которую должны быть записаны журналы
  • если сомневаетесь, дайте неразборчивые разрешения для c: \ temp \ и получите все для входа туда ()
  • запустите Sysinternal / Dbgview.exe, чтобы узнать, говорит ли это вам что-нибудь
earthling42
источник
3
«убедитесь, что файл log4net.config скопирован в папку bin \ при сборке (в компиляторе установлено« Копировать, если новее »)» -> спасти меня! Большое спасибо!
Хоанг Нгуен Хуу,
8

Для проекта ASP.NET MVC добавление

log4net.Config.XmlConfigurator.Configure();

в Global.asax.cs также помогает:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}
Оладипо Оласемо
источник
1
У меня была очень странная проблема с этим, в производстве и на компьютере моего босса регистраторы работали нормально, как это, но только после того, как я ответил Кирку, это сработало на моем компьютере. Просто подумал, что сообщу людям, если у них возникнут похожие проблемы (кстати, проект MVC).
Shelby115
@ Shelby115, большое спасибо! Я пытался поместить свои записи log4Net в ELMAH. У меня в web.config все было правильно. У меня уже был log4net.Config.XmlConfigurator.Configure (); в моем global.asax.cs, но он не работает. Пришел к этому сообщению SO и добавил строку в assemblyInfo.cs на основе Кирка. Это все еще не сработало !. Прочитав ваш комментарий, я удалил предыдущую запись из global.asax.cs, и она начала работать. Я потратил на это несколько часов, и ваш комментарий мне очень помог. Еще раз спасибо!
user3885927
Запись в global.asax.cs нормально работала для файловых приложений, но не для приложений ELMAH. Способ Кирка сработал для приложения ELMAH (мне пришлось удалить его из global.asax.cs)
user3885927
Вы также можете убедиться, что log4net имеет права на запись в каталог, настроенный для файлов журнала.
Оладипо Оласемо
@ Shelby115 Черт, мне нравится, когда ты забываешь решение, а твой собственный комментарий решает твою проблему. Переход на страницу с уже одобренным вами ответом - тоже хороший индикатор.
Shelby115
7

Вот шаги, которые в конечном итоге заставили мой журнал файлов работать:

  • -Check AssemblyInfo.cs содержит следующий атрибут. [сборка: log4net.Config.XmlConfigurator] . Это загружает log4net.
  • Убедитесь, что каталог журнала имеет права на запись.
  • Убедитесь, что регистратор имеет указанный формат. Это делается путем проверки того, что каждый элемент в вашей конфигурации имеет указанный элемент макета . Например:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Наконец, попробуйте включить внутреннее ведение журнала log4net, чтобы включить ведение журнала и проверку консоли. Для этого добавьте <add key="log4net.Internal.Debug" value="true"/>в свой appSettings.
Echilon
источник
<add key = "log4net.Internal.Debug" value = "true" /> Это помогло мне устранить проблему. Спасибо
Рави Хамбати
Разрешения каталога - вот что меня привлекло,
Омар Химада
6

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

Поэтому, если файл не создан на диске, начните с проверки разрешений файловой системы. чтобы убедиться, что пользователь, под которым работает ваше приложение, может записать новый файл в это место на диске.

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

Джон К.
источник
2

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

Скопируйте файл конфигурации в выходной каталог

Просто щелкните правой кнопкой мыши файл log4net.config, выберите свойство и затем выберите Копировать в выходной каталог, чтобы скопировать XXXX

Вы Куанг Хоа
источник
1

Я попробовал все вышеперечисленное, но ничего не помогло. Добавление этой строки в раздел app.config configSections сработало для меня.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Убедитесь, что Versionи PublicKeyTokenправильно

Рейан Чугл
источник
0
<param name="File" value="mylog.log" />

говорит: «Запишите mylog.log в настоящую папку». Это означает, что если ваше веб-приложение находится под IIS, журнал будет записан в C: \ inetpub \ wwwroot \ appname \ mylog.log.

Если файла журнала нет, то, возможно, учетная запись, под которой запущено приложение, не имеет разрешения на запись в папку. Вы можете запустить Process Monitor из SysInternals, чтобы узнать, записан ли файл и куда.

Также запустите VS в режиме отладки, чтобы увидеть, не выбрасываются ли какие-либо исключения (Отладка-> Исключения-> Исключения CLR, отметьте Выброшено).

Томас Ворачек
источник
0

В моем случае я забыл установить для свойств файла log4Net.config значение «Content», чтобы файл не был включен в развертывание. Так что обратите на это внимание:

Compile action : Content
Marco
источник
0

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

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
Петр Сливко
источник
-7

Также через несколько часов я понял, почему у меня это не работает ...

я имел:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

но это должно быть:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Так что убедитесь, что ILog находится в первой строке ....

Йерун Баккер
источник
1
Причина точно не в этом. Не имеет значения, когда вы инициализируете объект ILog, если вы делаете это до того, как вызовете методы ведения журнала, т.е. _log.Info; _log.error и т. д.
Оладипо Оласемо,