ASP.NET 3.5の問題を伴うlog4net
-
03-07-2019 - |
質問
log4netをASP.NET 3.5から動作させるのに問題があります。 log4netを使用しようとしたのはこれが初めてで、パズルの一部を見逃しているように感じます。
私のプロジェクトはlog4netアセンブリを参照しており、私の知る限りでは、サーバーに正常にデプロイされています。
私のweb.configには以下が含まれています:
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler
, log4net"
requirePermission="false"/>
</configSections>
<log4net>
<appender name="InfoAppender" type="log4net.Appender.FileAppender">
<file value="..\..\logs\\InfoLog.html" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<logger name="_Default">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
</log4net>
ロガーをテストするために次のコードを使用しています:
using log4net;
using log4net.Config;
public partial class _Default : System.Web.UI.Page
{
private static readonly ILog log = LogManager.GetLogger("_Default");
protected void Page_Load(object sender, EventArgs e)
{
log.Info("Hello logging world!");
}
}
Global.asaxでは、次のことを行っています。
void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure();
}
この時点では、他に何が間違っているのか考えられません。ログインを保存しようとしているディレクトリは書き込み可能です。別のディレクトリを試しても同じ結果が得られます。ファイルもログもありません。
提案はありますか? :-)
編集:パスとアンプにいくつかの異なる形式を試しました。ログファイルの名前。一部には&quot; .. \ .. \ InfoLog.html&quot;、&quot; InfoLog.html&quot;、&quot; logs \ InfoLog.html&quot;などが含まれます。問題。
編集:ルートロガーノードをlog4netセクションに追加しましたが、サンプルからコピーする際に偶然にそれを無視しました。ルートロガーノードは次のようになります。
<root>
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</root>
それでも、私はまだ運がありません。
解決
ルートロガーは必須だと思います。ルートが存在しないため、構成が失敗していると思われます。
もう1つの潜在的な問題は、ConfigureがWeb.configを指していないことです。
代わりにConfigure(Server.MapPath(&quot;〜/ web.config&quot;))を試してください。
他のヒント
これは、ファイルのアクセス許可の問題のように思えます。パスなしでファイル名を指定すると、log4netはWebアプリケーションのルートディレクトリに書き込みます。やってみてそこで成功しない限り、web.configに以下を追加して、log4netの内部デバッグを有効にすることをお勧めします。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>
次に、デバッグモードでコンパイルされたアプリを展開し、 Visual Studioリモートデバッガーを使用して、スローされたエラーを確認してください。
Ivはこの問題を修正するために3時間を費やしましたが、それはweb.configのフォーマットでした。
これはありましたが、機能しませんでした:
<section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler
, log4net"
requirePermission="false"/>
これに変更すると修正されました:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" requirePermission="false"/>
迷惑な!!
情報の提供:ファイルパスは次の形式にする必要があります:
<file value="..\\..\\logs\\InfoLog.html" />
.net 3.5で実行するGlobal.asxがありません
これは私のコードです... log4netを別のファイルlog4net.configで構成します
// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
//My Web Services class name
private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Service1");
iにも同じ(イライラする)問題がありました。ルートをlog4net configセクションの最上部に移動しましたが、すべて機能しました。また、私もルートとロガー要素を持っていたので、ロガーを呼び出すたびに2行になりました。ロガー要素を削除し、ルートとその機能をそのまま維持します。
次のように、ページのタイプを使用してロガーを作成する方法:
private static readonly ILog log = LogManager.GetLogger(typeof(_Default));
これは、Global.ASXにあるものです。 asp.net 3.5ですべて動作するようになった
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
log4net.Config.XmlConfigurator.Configure();
}
void Application_End(object sender, EventArgs e)
{
// Code that runs on application shutdown
log4net.LogManager.Shutdown();
}
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
}
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
}
</script>