次の方法で共有


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 →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:52

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

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

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


2008年4月16日水曜日 7:59

 xifeifngxxi00 さんからの引用

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

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

 

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

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

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

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


2008年4月16日水曜日 8:16

 けろ-みお さんからの引用

それから、ずっと触れられていないのですが、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日水曜日 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>

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

ご参考までに。