none
Asp.net(vb.net)でlog4netが動かない RRS feed

  • 質問

  • 環境: 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の中に何も出力されません。原因を教えてください。

    宜しくお願い致します。

     

    2008年4月16日 6:18

回答

  • お返事が遅くなりました。

    いろいろと裏を取ろうと思い、調べてました。

     

    >ただ、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月17日 4:26

すべての返信

  • 下記、参考になるといいのですが・・・

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38734&forum=7

     

    現象的には、上記と同じ感じが致しました。

    ここでいう、log4net.config をWebアプリが動いているプロジェクトファイルに追加して、

    Web.configで記載された内容を log4net.configの方に記載すればいいとのことみたいです。

     

    2008年4月16日 6:44
  • ありがとうございます 、やっぱりダメだった

    2008年4月16日 6:58
  • 何かエラー等は出ておりますか?

    もしエラーが出ているようであれば詳細ご教授下さい。

    宜しくお願いします。

     

     

    2008年4月16日 7:13
  •  

    本当にすみませんが、エラー出てこないです

    log4net.config →log4net.xmlに変更してもよく動かないです。

    2008年4月16日 7:19
  •  xifeifngxxi00 さんからの引用

     

    本当にすみませんが、エラー出てこないです

    log4net.config →log4net.xmlに変更してもよく動かないです。

     

    ファイル名の問題ではなく、

    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:43
  • すみません、絶対パースでも動かないですね、本当に怪しいですね。

    又、System.Diagnostics.Debug.Print(Server.MapPath("~/") & "log4net.config")で出力された情報は物理ファイルパースと比べて正しいです。

    私は外国人です、日本語が下手です。何か失礼があれば、許してください(~ _ ~)

    2008年4月16日 7:52
  •  xifeifngxxi00 さんからの引用

    すみません、絶対パースでも動かないですね、本当に怪しいですね。

    又、System.Diagnostics.Debug.Print(Server.MapPath("~/") & "log4net.config")で出力された情報は物理ファイルパースと比べて正しいです。

     

    それから、ずっと触れられていないのですが、log4net.config をWebアプリケーションが動いている

    Project に追加されていますか?

    もし追加されていないようであれば、追加して実行してみてください。

    それでも、動かないようであれば、別の原因が考えられそうです。

    2008年4月16日 7:59
  •  けろ-みお さんからの引用

    それから、ずっと触れられていないのですが、log4net.config をWebアプリケーションが動いている

    Project に追加されていますか?

    もし追加されていないようであれば、追加して実行してみてください。

    それでも、動かないようであれば、別の原因が考えられそうです。

     

    「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日 8:16
  • 私の方で実際にやってみました。

    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月16日 9:22
  •  けろ-みおさん、本当にありがとうございます!

    教えていただいた方法で、指定ファイルにログ出力が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日 0:58
  • お返事が遅くなりました。

    いろいろと裏を取ろうと思い、調べてました。

     

    >ただ、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月17日 4:26
  • けろ-みおさん、ご説明どうも有り難うございます

    2008年4月17日 5:57
  • はじめまして 「ねこマシン」と申します。

    開発用コンソール出力( 出力タブ )へのやり方を調べていまして、ここまでたどり着きました。

    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>

    この方法ですと、出力が可能かと思います。ただ 運用には不向きでしょうね。

    ご参考までに。
    2009年5月18日 16:58