log4net在部署时不从Autocad插件登录

我正在使用autocad的.net API开发AutoCAD 2012插件 . 当Autocad启动时,Autocad插件是加载到Autocad运行时的dll . 我已经能够使用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不会在部署中记录(甚至创建日志文件) .

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

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

  • log.Logger.Name 正确返回我正在使用的 Logger 的名称 .

  • log.Logger.IsEnabledFor(log4net.Core.Level.All)返回false,即使我在配置文件中配置了 Level Value=All .

EDIT-2 我试着定义配置文件,如答案的引用URL所述 . 我引用文件中概述的方法 .

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

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

回答(1)

2 years ago

在部署时,您应该将插件配置存储在default config files之一中:

  • User.config

  • acad.exe.config

  • machine.config

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

双击检查您在安装过程中正确替换了 ${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>