Ответ 1
У меня была такая же проблема. Я обойду его, используя приведенную ниже строку кода в методе Application_Start
в Global.asax.cs(предполагая его веб-приложение .NET).
log4net.Config.XmlConfigurator.Configure();
Я использую log4net в моем проекте ASP.NET MVC3, но все свойства ведения журнала, такие как IsDebugEnabled
== false
В моей AssemblyInfo у меня есть:
[assembly: XmlConfigurator(Watch = true)]
В моем классе журнала я
public Log4NetLogger()
{
log4net.Config.XmlConfigurator.Configure();
Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
Мой связанный файл конфигурации в Web.Config:
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=152368
-->
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
</sectionGroup>
</configSections>
<log4net debug="false">
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="{removed}" />
<commandText value="INSERT INTO Logging ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!--Possible levels:-->
<!--DEBUG-->
<!--INFO-->
<!--WARN-->
<!--ERROR-->
<!--FATAL-->
<root>
<level value="All" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
</applicationSettings>
</configuration>
Я уже разочаровался в том, что хотел просто сделать
public Log4NetLogger()
{
Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Logger.IsDebugEnabled = true;
}
Однако, конечно, Logger.IsDebugEnabled
не имеет никаких сеттеров:/
Что мне нужно сделать, чтобы заставить эту чертову работать?
У меня была такая же проблема. Я обойду его, используя приведенную ниже строку кода в методе Application_Start
в Global.asax.cs(предполагая его веб-приложение .NET).
log4net.Config.XmlConfigurator.Configure();
Измените свою строку следующим образом: AssemblyInfo.cs
:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
и поместите конфигурацию log4net в этот файл.
Log4net ожидает, что его раздел конфигурации не будет сгруппирован. Поскольку в вашем конфиге вы разместили свой раздел log4net внутри ApplicationSettingsGroup (applicationSettings)
, log4net не найдет свою конфигурацию. Вы можете переместить раздел log4net вне группы или вы можете указать группу при вызове XmlConfigurator.Configure
:
XmlConfigurator.Configure(
ConfigurationManager.GetSection(
"applicationSettings/log4net") as XmlElement);
Похоже, вы пропустили изменения настроек свойства файла конфигурации Копировать в выходной каталог= "Копировать всегда" Пожалуйста, проверьте эту настройку изображения для более подробной информации. Свойства настройки файла конфигурации
Уровни журналов чувствительны к регистру, поэтому вместо:
<level value="All" />
должен быть
<level value="All" />
Мне также намного проще создать отдельный файл конфигурации log4net. Создайте файл с именем log4net.config и установите свойство Copy to Output Directory для копирования всегда - (копирование вашей конфигурации из App.config в этот файл)
Затем при настройке конфигурации используйте:
XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
Я никогда раньше не видел <level value="All" />
, обычно я просто устанавливал value
на один из уровней (поскольку они включают уровни выше них или ниже их, как вы их перечисляете в своей конфигурации, в уровень уровня). Что-то вроде этого:
<level value="DEBUG" />
Вы также можете попробовать протестировать его с помощью явного регистратора, чтобы проверить, может ли проблема быть чем-то другим. Что-то простое рядом с appender
node (s) следующим образом:
<logger name="Log4NetTEST" >
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</logger>
Затем, проверяя его в коде, вы должны создать регистратор следующим образом:
LogManager.GetLogger("Log4NetTEST");
Вы не смогли инициализировать log4net в вашем приложении. Это можно явно инициализировать, поместив ниже в "Application_Start",
log4net.Config.XmlConfigurator.Configure();
Измените свою строку следующим образом в AssemblyInfo.cs:
[сборка: log4net.Config.XmlConfigurator(Watch = true)]
Обеспечить добавление dll log4net и также поместить конфигурацию log4net в файл web.config как
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" />
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\LOGS\IDMUserRoleManagement\IDMUserRoleManagement.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="1000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{yyyy-MM-ddTHH:mm:ss} %-5p [%t] - %m%n" />
</layout>
</appender>
</log4net>
</configuration>
У IsDebugEnabled нет установщика, поскольку он доступен только для чтения.
Использовать log4net.Config.XmlConfigurator.Configure(); в любом методе, прежде чем использовать журнал
и в app.Config параметр должен быть:
<root>
<level value="ALL" />
<appender-ref ref="AppenderName" />
</root>
Вам не хватает открывающего тега для applicationSettings
. Это может быть причиной
если файл журнала класса (Log4NetLogger) находится в отдельной библиотеке классов, то код: [assembly: log4net.Config.XmlConfigurator(C.... должен находиться в той же библиотеке классов).
например: lib 1: my.web (проект mvc) lib 2: my.common (проект библиотеки классов)
если вы поместите код logmanager в my.common, то "[assembly: log4net.Config.XmlConfigurator(C..." ДОЛЖЕН БЫТЬ В my.common, если вы поместите его в my.web, он не будет работать!
Редактировать:
Использование всех файлов конфигурации (app.config, web.config, log4net.config и т.д.) Зависит от контекста. Таким образом, если у вас есть приложение, вызывающее библиотеку классов, то файл конфигурации, который будет использоваться, - это.Config в проекте приложения, а не библиотека классов.
Другой пример, если вы тестируете приложение модулем, контекстом является проект модульного тестирования и тот файл конфигурации, который будет использоваться, а не конфигурация приложения.
В моем случае это было связано с тем, что <configSections>
не был первым тегом раздела <configuration>
. Это предотвращает распознавание имени раздела log4net. Таким образом, экземпляр журнала показывает IsDebugEnabled и все остальные в качестве логического значения по умолчанию false.
Это должно быть так.
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<configuration>
У меня такая же проблема. Я использовал отдельный файл и назвал его log.config. Все, что мне нужно было сделать, это пометить свойство файла "Копировать в выходной каталог" в "Копировать всегда" в обозревателе решений в Visual Studio. Это помогло мне.
Возможно, вы захотите добавить старую добрую диагностику системы, чтобы выяснить, почему не работает log4net.
Добавьте это в свое приложение или файл веб-конфигурации и проверьте файл log.txt:
<system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
<add name="textWriterListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="log.txt"/>
<remove name="Default"/>
</listeners>
</trace>
</system.diagnostics>
Это был мой случай:
log4net: config file [C:\proj\bin\Debug\log4net.config] not found. Configuration unchanged.
Пришлось изменить, чтобы скопировать свойства log4net.config в Копировать всегда, как объяснено в другом ответе.