2

カスタム レンダラーを使用して log4net にオブジェクトを記録しようとしています。私の構成ファイルには次の行があります。

  <renderer renderingClass="LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer" renderedClass="LogLibrary.TranferObjects.PdaLogObj" />

しかし、構成ファイルをロードするときに TypeLoadException が発生し、log4net 内部デバッグで次の詳細が得られます。

log4net:ERROR OptionConverter: Could not instantiate class [LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer].
System.TypeLoadException: Could not load type [LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer]. Tried assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821] and all loaded assemblies
   at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase) in c:\work\svn_root\apache\log4net\tags\log4net-1.2.10-rc2\build\package\log4net-1.2.10\src\Util\SystemInfo.cs:line 671
   at log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOnError, Boolean ignoreCase) in c:\work\svn_root\apache\log4net\tags\log4net-1.2.10-rc2\build\package\log4net-1.2.10\src\Util\SystemInfo.cs:line 602
   at log4net.Util.OptionConverter.InstantiateByClassName(String className, Type superClass, Object defaultValue) in c:\work\svn_root\apache\log4net\tags\log4net-1.2.10-rc2\build\package\log4net-1.2.10\src\Util\OptionConverter.cs:line 477
log4net:ERROR XmlHierarchyConfigurator: Could not instantiate renderer [LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer].

オブジェクトの名前空間とレンダラーが正しい。

何か案は?

編集:これは、Global.asaxでlog4netを設定する方法です

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    // Fires when the application is started

    Dim logfile As String = "C:\Applications\LoggerWebService\Config\logConfig.xml"
    log4net.GlobalContext.Properties("Application") = My.Application.Info.ProductName
    log4net.GlobalContext.Properties("Version") = My.Application.Info.Version.ToString

    log4net.Config.XmlConfigurator.ConfigureAndWatch(New IO.FileInfo(logfile))

    Dim logger As log4net.ILog = log4net.LogManager.GetLogger(GetType(Global_asax))
    logger.Info("Started")

End Sub
4

2 に答える 2

2

これがまったく機能していないとは想像できません。完全修飾クラス名を使用してみてください。このためには、完全修飾アセンブリ名が必要です。

編集:申し訳ありませんが、アセンブリ名ではなくクラス名を意味していました。あなたのコメントに基づいて、あなたの場合の完全修飾クラス名により、構成は次のようになると思います。

 <renderer renderingClass="LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer, LogLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
           renderedClass="LogLibrary.TranferObjects.PdaLogObj, LogLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
于 2010-11-11T15:11:54.650 に答える
1

これは log4Net のバグです。この行をコメントアウトしてから<renderer、Web サービスの実行中にコメントを解除すると、機能します。

私ができる唯一の説明であり、私の仮定がどれほど正確かはわかりませんが、log4Netがレンダラーを取得するのに間に合うようにすべてのアセンブリがロードされているわけではないようです...

于 2010-11-11T13:17:49.390 に答える