autocad の .net API を使用して AutoCAD 2012 プラグインを開発しています。Autocad プラグインは、Autocad の起動時に Autocad ランタイムに読み込まれる dll です。Visual Studio 開発環境を使用して、log4net から正常にログを記録できました。ただし、 , when I run the plugin outside of Visual Studio, that is when I deploy my plugin, the log4net does not log any messages or even create a log file. ログに関連するコードと構成ファイルは次のとおりです。
log4net_autocad.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
</configSections>
<log4net>
<appender name="AutocadRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="${NIRVANA_SOFTWARE_INSTALL_PATH}Relay_Manager_Autocad.log"/>
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="0" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p [%C.%M] %m%n"/>
</layout>
</appender>
<logger name="AutocadFile">
<level value="All"/>
<appender-ref ref="AutocadRollingFileAppender"/>
</logger>
</log4net>
</configuration>
myPlugin.cs:ログを構成するコード
public class MyPlugin : IExtensionApplication {
private static log4net.ILog log;
void IExtensionApplication.Initialize() {
...
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net_autocad.config"));
log = log4net.LogManager.GetLogger("AutocadFile");
}
void IExtensionApplication.Initialize()は、Autocad の起動時に実行されます。私がチェックしたいくつかのこと:
- Autocad プラグインが Autocad に正しくロードされていることを確認しました。これは、log4net 初期化コードが実行されたことを意味します。
- デプロイされたアプリケーションの bin ディレクトリに log4net 構成ファイル (log4net_autocad.config) がコピーされていることを確認しました
奇妙なことに、開発環境 (VS 2010) でプラグインをロードすると、プラグインが適切にログに記録されます。では、log4net が展開時にログを記録しない (またはログ ファイルを作成する) のはなぜですか。
編集: 私はいくつかの追加のものをチェックしました
ログインする直前のプラグインで、警告ダイアログで次のことを確認しました。
- log.Logger.Nameは、使用しているロガーの名前を正しく返します。
- log.Logger.IsEnabledFor(log4net.Core.Level.All) は、構成ファイルでLevel Value=Allを構成したにもかかわらず、false を返します。
EDIT-2
回答の参照URLで説明されているように、構成ファイルを定義しようとしました。ドキュメントで概説されているアプローチを引用しています。
2.] アプリケーション構成ファイル: [AppName].exe.config、[AppName].dll.config アプリケーション レベルの構成 [AppName].exe.config または [AppName].dll.config は、このドキュメントのほとんどの場所です。時間を費やします。この構成ファイルには、すべてのアプリケーションレベルの設定が含まれ、Roaming-User および Local-User 構成ファイルに関連付けられた設定の使用およびデフォルト値を定義するために使用することもできます。これらのファイルは通常、アプリケーションの実行可能ファイルと同じディレクトリに格納されますが、必要に応じて別の場所に配置できます。これについては、今後さらに多くの議論が行われるでしょう。
上記のアプローチは私のアプリケーションに適していますが、まだロガーに何も記録させることができません.RelayAnalysis_Autocad.dll.configという名前のlog4net構成ファイルを定義し、構成のためにlog4netに提供しました. 私には理解できないことが他にもあると思います。autocad プラグインから log4net を使用してログを記録できるかどうか疑問に思い始めましたか? また、環境変数の読み取りに関する問題を排除するために、環境パスを削除してハードコーディングしました。まだ運がありません。