1

我正在使用 autocad 的 .net API 开发 AutoCAD 2012 插件。Autocad 插件是 dll,在 Autocad 启动时加载到 Autocad 运行时。我已经能够使用 Visual Studio 开发环境从 log4net 成功登录。但是,当我在Visual Studio之外运行插件时,也就是部署插件时,log4net不会记录任何消息,甚至不会创建日志文件。这里是日志相关的代码和配置文件。

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 初始化代码已运行。
  • 检查 log4net 配置文件 (log4net_autocad.config) 是否复制到已部署应用程序的 bin 目录中

奇怪的是,当我在开发环境(VS 2010)中加载插件时,插件正确记录。那么为什么 log4net 在部署中没有记录(甚至创建日志文件)。

编辑: 我检查了一些额外的东西

在我登录之前的插件中,我通过警报对话框检查了以下内容。

  • log.Logger.Name正确返回我正在使用的记录器的名称
  • log.Logger.IsEnabledFor(log4net.Core.Level.All) 返回 false,即使我在配置文件中配置了Level Value=All



EDIT-2 我尝试按照答案的引用网址中的说明定义配置文件。我引用了文档中概述的方法。

2.] 应用程序配置文件:[AppName].exe.config, [AppName].dll.config 应用程序级配置 [AppName].exe.config 或 [AppName].dll.config 是本文档的大部分内容会花时间。此配置文件将包含所有应用程序级设置,甚至可用于定义与漫游用户和本地用户配置文件相关的设置的使用和默认值。这些文件通常存储在与应用程序可执行文件相同的目录中,但如果需要,可以放在其他地方。将来会有更多关于这个的讨论。

上述方法适合我的应用程序,但我仍然无法让记录器记录任何内容。我定义了一个名为RelayAnalysis_Autocad.dll.config的 log4net 配置文件,并将其提供给 log4net 进行配置。我认为还有一些我无法理解的东西。我开始怀疑我们是否可以使用 autocad 插件中的 log4net 进行日志记录?我还删除了环境路径并对其进行了硬编码,以消除有关读取环境变量的任何问题。仍然没有运气。

4

1 回答 1

0

在部署时,您应该将插件配置存储在默认配置文件之一中:

  • User.config
  • acad.exe.config
  • machine.config

可能是在安装过程中仔细更改User.config的最佳文件。此外,您应该设计和编码更改,以便它们可以在卸载时恢复。

仔细检查您是否${NIRVANA_SOFTWARE_INSTALL_PATH}在安装过程中正确替换了该文件夹并且该文件夹具有适当的权限。

此外,我会尝试将以下行添加到 AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile="AbsolutePathToTheConfig")]

(在这种情况下,您不应调用 XmlConfigurator.Configure)或在调用中使用绝对路径

log4net.Config.XmlConfigurator.Configure(new FileInfo("AbsolutePathToTheConfig"));

最后,请注意有关XmlConfigurator.Configure的 log4net 文档指出,所使用的配置文件可能是与 .NET 配置规则不匹配的 XML。

配置文件必须是有效的 XML。它必须至少包含一个名为 log4net 的元素,该元素包含 log4net 配置数据。

因此,在log4net_autocad.config文件中您可以跳过该<configuration>元素:

<log4net>
    <appender name="AutocadRollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Absolute\Path\To\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>
于 2013-05-02T21:57:24.197 回答