Asp.net(vb.net)でlog4netが動かない
質問
2008年4月16日水曜日 6:18
環境: Asp2.0(VB.net) VS2005
①log4net.dllをBinに参照追加しました。
②web.configと同じどころにlog4net.configファイルを作りました、中身は以下の通り
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0" />
</configSections>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
</configuration>
③手で作ったGlobal.asaxファイルのApplication_Startメソッドに以下のプログラムを追加した
log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo(Server.MapPath("~/") & "log4net.config"))
④Test.aspx.vbの中に、
.........省略
Private Shared ReadOnly logger As ILog = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType)
.........省略
Logger.debug(“xxxxxxxxxxxxxxx”)
.........省略
以上を設置しましたが、Consoleの中に何も出力されません。原因を教えてください。
宜しくお願い致します。
すべての返信 (13)
2008年4月17日木曜日 4:26 ✅回答済み
お返事が遅くなりました。
いろいろと裏を取ろうと思い、調べてました。
>ただ、Consoleのログ出力はやっぱり動かないです
裏付けが取れなかったので、何とも言い難いところですが、Web(ASP.NETも含む)の仕組みを考えれば、
Console出力はできないと思います。
(Windows ApplicationやConsole Applicationのようにはできません)
恐らく、log4net + ASP.NET で、AppenderをConsoleにした場合、Console.WriteLine系のメソッドが
動いているはずなので、そうなると、普通にWebアプリケーション(ASP.NET)から、
「Console.WriteLine("Debug 情報です") 」
を実行しても、Consoleが表示・出力されないのと同じことだと思います。
もし、どうしてもConsole形式やViewer形式で見たいのであれば、
UdpAppender、ASPNetTraceAppenderといったAppenderを使って、
専用のLog Viewer(ChainsawやUDPViewer、Tail など)を使ってログを監視するしか方法がないように思います。
なので、logのConsole出力に拘らなくても良いような気がします。
ファイル出力で収集したログを専用のLog Viewerで監視する方向をご検討してみてください。
2008年4月16日水曜日 6:44
下記、参考になるといいのですが・・・
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38734&forum=7
現象的には、上記と同じ感じが致しました。
ここでいう、log4net.config をWebアプリが動いているプロジェクトファイルに追加して、
Web.configで記載された内容を log4net.configの方に記載すればいいとのことみたいです。
2008年4月16日水曜日 6:58
ありがとうございます 、やっぱりダメだった
2008年4月16日水曜日 7:13
何かエラー等は出ておりますか?
もしエラーが出ているようであれば詳細ご教授下さい。
宜しくお願いします。
2008年4月16日水曜日 7:19
本当にすみませんが、エラー出てこないです
log4net.config →log4net.xmlに変更してもよく動かないです。
2008年4月16日水曜日 7:43
xifeifngxxi00 さんからの引用 | |
|
ファイル名の問題ではなく、
log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo(Server.MapPath("~/") & "log4net.config"))
の読み込み処理が、良くないか、もしくは、Configファイルの設定かと思います。
試しに、
log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo(Server.MapPath("~/") & "log4net.config"))
の部分を、
log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo("log4net.configが存在している物理フォルダ\log4net.config"))
で試してみてください。
もし、これでうまくいけば、Server.MapPathの指定方法が悪いということがわかりますので、
適切なPATHをServer.MapPathで指定することで回避ができるのではないかと思います。
ご確認ください。
2008年4月16日水曜日 7:52
すみません、絶対パースでも動かないですね、本当に怪しいですね。
又、System.Diagnostics.Debug.Print(Server.MapPath("~/") & "log4net.config")で出力された情報は物理ファイルパースと比べて正しいです。
私は外国人です、日本語が下手です。何か失礼があれば、許してください(~ _ ~)
2008年4月16日水曜日 7:59
xifeifngxxi00 さんからの引用 | |
|
それから、ずっと触れられていないのですが、log4net.config をWebアプリケーションが動いている
Project に追加されていますか?
もし追加されていないようであれば、追加して実行してみてください。
それでも、動かないようであれば、別の原因が考えられそうです。
2008年4月16日水曜日 8:16
けろ-みお さんからの引用 | |
|
「log4net.config をWebアプリケーションが動いているProject に追加されていますか」の意味が分かりません。
log4net.configは手でProjectのrootディレクトリに追加しました
xxPrj(プロジェクト名)
|App_Code(ディレクトリ)
|App_Data(ディレクトリ)
|css(ディレクトリ)
|image(ディレクトリ)
|page((ディレクトリ:各種ASPページ)
|script(ディレクトリ)
|Global.asax
|log4net.config
|web.config
|Web.sitemap
===============Global.asax====================
<%@ Application Language="VB" %>
<script runat="server">
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' アプリケーションのスタートアップで実行するコードです
System.Diagnostics.Debug.Print(Server.MapPath("~/") & "log4net.config")
log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo(Server.MapPath("~/") & "log4net.config"))
End Sub
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
' アプリケーションのシャットダウンで実行するコードです
End Sub
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' ハンドルされていないエラーが発生したときに実行するコードです
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' 新規セッションを開始したときに実行するコードです
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' セッションが終了したときに実行するコードです
' メモ: Web.config ファイル内で sessionstate モードが InProc に設定されているときのみ、
' Session_End イベントが発生します。session モードが StateServer か、または SQLServer に
' 設定されている場合、イベントは発生しません。
End Sub
</script>
===============Global.asax====================
===============log4net.config====================
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c %M [%x] - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
===============log4net.config====================
===============Pageディレクトリの中にあるAsp====================
Imports System.Reflection
Imports log4net
Partial Class page_biz_Login
Inherits System.Web.UI.Page
Private Shared ReadOnly logger As ILog = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If (Not Page.IsPostBack) Then
lgn_ログイン.UserName = "admin"
Me.Title = ConstString.SYSTEM_APPLICATION_NAME & " - ログイン"
End If
logger.Debug("Debug 情報です")
logger.Info("Info ログです")
logger.Warn("Warn ログです")
logger.Error("Error ログです")
logger.Fatal("Fatal ログです")
End Sub
Protected Sub lgn_ログイン_LoggedIn(ByVal sender As Object, ByVal e As System.EventArgs) Handles lgn_ログイン.LoggedIn
Dim userInfo As UserInfo = New UserInfo()
userInfo.UserName = lgn_ログイン.UserName
userInfo.Password = lgn_ログイン.Password
Session.Add(ConstString.SESSION_USER_INFO, userInfo)
End Sub
Protected Sub lgn_ログイン_LoggingIn(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LoginCancelEventArgs) Handles lgn_ログイン.LoggingIn
End Sub
Protected Sub lgn_ログイン_LoginError(ByVal sender As Object, ByVal e As System.EventArgs) Handles lgn_ログイン.LoginError
End Sub
Protected Sub lgn_ログイン_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles lgn_ログイン.Authenticate
e.Authenticated = True
End Sub
End Class
===============Pageディレクトリの中にあるAsp====================
上記のASPを実行してVS2005のConsoleのなかに何も出力されません
2008年4月16日水曜日 9:22
私の方で実際にやってみました。
xifeifngxxi00 さんのサンプルでは、logの出力先がConsoleになっていましたが、TextFileで出力することや、
Global.aspxで設定しているlog4net.configのPATH(Server.MapPath)の指定がおかしかったこと、
Web.Config、log4net.configで定義すべき属性が違っていたようですので、私が実験したサンプルコードを下記に
掲載しておきます。
■Web.Config
<?xml version="1.0"?>
<configuration>
** <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/>
</configSections>**
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
<connectionStrings/>
<system.web>
<compilation debug="true" strict="false" explicit="true"/>
<pages>
<namespaces>
<clear/>
<add namespace="System"/>
<add namespace="System.Collections"/>
<add namespace="System.Collections.Specialized"/>
<add namespace="System.Configuration"/>
<add namespace="System.Text"/>
<add namespace="System.Text.RegularExpressions"/>
<add namespace="System.Web"/>
<add namespace="System.Web.Caching"/>
<add namespace="System.Web.SessionState"/>
<add namespace="System.Web.Security"/>
<add namespace="System.Web.Profile"/>
<add namespace="System.Web.UI"/>
<add namespace="System.Web.UI.WebControls"/>
<add namespace="System.Web.UI.WebControls.WebParts"/>
<add namespace="System.Web.UI.HtmlControls"/>
</namespaces>
</pages>
<authentication mode="Windows"/>
</system.web>
</configuration>
■log4net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<log4net>
** <appender name="LogFileAppender"
type="log4net.Appender.FileAppender" >**
** <param name="File" value="C:\test.log" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern"
value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>**
<root>
** <level value="ALL" />
<appender-ref ref="LogFileAppender" />**
</root>
</log4net>
</configuration>
■ Global.asax
<%@ Application Language="VB" %>
<script runat="server">
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo(Server.MapPath("~/log4net.config")))
End Sub
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
' アプリケーションのシャットダウンで実行するコードです
End Sub
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' ハンドルされていないエラーが発生したときに実行するコードです
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' 新規セッションを開始したときに実行するコードです
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' セッションが終了したときに実行するコードです
' メモ: Web.config ファイル内で sessionstate モードが InProc に設定されているときのみ、
' Session_End イベントが発生します。session モードが StateServer か、または SQLServer に
' 設定されている場合、イベントは発生しません。
End Sub
</script>
■Default.aspx.vb
Imports System.Reflection
Imports log4net
Partial Class _Default
Inherits System.Web.UI.Page
Private Shared ReadOnly logger As ILog = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
logger.Debug("Debug 情報です")
End Sub
End Class
以上です。上記のサンプルでは、C:\test.log という場所に、logを出力しています。
再度ご確認下さい。よろしくお願いします。
2008年4月17日木曜日 0:58
けろ-みおさん、本当にありがとうございます!
教えていただいた方法で、指定ファイルにログ出力がOKでした
(注:Web.Configの中に、「<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/>」書かなくてもよく動きます)
ただ、Consoleのログ出力はやっぱり動かないです、原因がわからないですね(疑問:VS2005のConsoleは出力ウィンドウを指しますか?
メニュー:デバッグ→ウィンドウ→出力
System.Diagnostics.Debug.Print("....")メソッドでずっと出力ウィンドウに出力しているので、Consoleが出力ウィンドウだと思いました。
宜しくお願いします
**
**
2008年4月17日木曜日 5:57
けろ-みおさん、ご説明どうも有り難うございます
2009年5月18日月曜日 16:58
はじめまして 「ねこマシン」と申します。
開発用コンソール出力( 出力タブ )へのやり方を調べていまして、ここまでたどり着きました。
cat and try で調べていたところ、debug目的で出力するならば下記の方法もありかと思います。参考までに・・
<appender name="ConsoleAppender" type="log4net.Appender.TraceAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline"/>
</layout>
</appender>
この方法ですと、出力が可能かと思います。ただ 運用には不向きでしょうね。
ご参考までに。