ASP.NET MVC3プロジェクトでlog4netを使用していますが、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
にはセッターがありません:/
このいまいましいことを機能させるために私は何をしなければなりませんか?
私も同じ問題を抱えています。 Global.asax.csのApplication_Start
メソッドで以下のコード行を使用して回避します(.Net Webアプリケーションを想定)
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のプロパティをCopy always-に設定します(App.configからこのファイルに構成をコピーします)
次に、構成を設定するときに使用します:
XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
アプリケーションでlog4netを初期化できませんでした。これは、以下を「Application_Start」に配置することで明示的に初期化できます。
log4net.Config.XmlConfigurator.Configure();
見たことがない <level value="All" />
以前は、通常、value
をいずれかのレベルに設定します(レベルスタック内の構成にリストされているため、それらの上位レベルまたは下位レベルが含まれているため)。このようなもの:
<level value="DEBUG" />
明示的なロガーを使用してテストして、問題が他にあるかどうかを確認することもできます。このようなappender
ノードに隣接する単純なもの:
<logger name="Log4NetTEST" >
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</logger>
次に、コードでテストする場合、次のようにロガーを作成します。
LogManager.GetLogger("Log4NetTEST");
AssemblyInfo.csで行を次のように変更します。
[アセンブリ:log4net.Config.XmlConfigurator(Watch = true)]
Log4net dllが追加されていることを確認し、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>
クラスログファイル(Log4NetLogger)が単独のクラスライブラリにある場合、コード:[アセンブリ:log4net.Config.XmlConfigurator(C ....は同じクラスライブラリにある必要があります。
例:lib 1:my.web(mvcプロジェクト)lib 2:my.common(クラスライブラリプロジェクト)
my.commonでlogmanagerコードをラップする場合、「[Assembly:log4net.Config.XmlConfigurator(C ...」はmy.commonに含める必要があります。my.webに配置すると機能しません。
編集:
すべての構成ファイル(app.config、web.config、log4net.configなど)の使用は、コンテキストベースです。したがって、クラスライブラリを呼び出すアプリがある場合、使用される構成ファイルは、クラスライブラリではなく、Appプロジェクトの.Configです。
別の例として、アプリのユニットテストを行う場合、コンテキストはユニットテストプロジェクトであり、アプリの構成ではなく、それが使用される構成ファイルです。
古き良きシステム診断を追加して、log4netが機能しない理由を理解することをお勧めします。
これをアプリまたはWeb構成ファイルに追加し、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プロパティをCopy Alwaysにコピーするように変更する必要がありました。
applicationSettings
の開始タグがありません。それが原因かもしれない
IsDebugEnabledは読み取り専用であるため、setterはありません。
Log4net.Config.XmlConfigurator.Configure();を使用します。ログを使用する前の任意の方法
そしてapp.Configで設定は次のようになります:
<root>
<level value="ALL" />
<appender-ref ref="AppenderName" />
</root>
私の場合、これは<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のソリューションエクスプローラーで、ファイルプロパティの「出力ディレクトリにコピー」を「常にコピー」にマークするだけで済みました。それは私にとってはトリックでした。