【问题标题】:Log4net: configuration xml file and text log file location at runtimeLog4net:运行时配置 xml 文件和文本日志文件位置
【发布时间】:2012-10-15 13:48:05
【问题描述】:

我有一个包含 10 个 dll 的项目,每个 dll 使用 log4net 进行日志记录。该项目不是我开始的,我是这样得到的,我需要继续它。因为这是我第一次使用 log4net,所以我想知道如何在运行时获取配置文件 (xml) 和日志文件(记录器写入日志的文件)。我使用断点停止应用程序执行,我希望能够使用快速监视窗口来获取这些参数。

感谢您的帮助。

【问题讨论】:

    标签: c# log4net


    【解决方案1】:

    就个人而言,我认为您可能会走错路,因为您最好尝试查看 log4net 的配置方式并从中确定它记录信息的位置。

    通常的起始位置是 app.config 文件,它可能包含 log4net 配置本身,或者对另一个外部文件的引用,但配置也可以完全在运行时完成,因此不能保证甚至有一个配置文件,但您可以尝试查看

    log4net.Config.XmlConfigurator.m_repositoryName2ConfigAndWatchHandler["log4net-default-repository"]
    

    这可能会显示配置文件的位置。

    文件名比较诡异,因为

    • 可能没有文件,因为日志记录可能会转到另一个设备(例如控制台或数据库)
    • 由于日志记录被禁用,可能没有文件。
    • 您可以登录到两个或更多文件
    • 文件名可能取决于类/dll
    • 可以为一个类启用日志记录,为另一个类禁用。

    【讨论】:

      【解决方案2】:

      这是一个类似的例子:

          public static void ChangeRemoteAddress(System.Net.IPAddress remoteAddressIp)
          {
              var hier = log4net.LogManager.GetRepository() as Hierarchy;
              if (hier == null)
              {
                  Console.WriteLine("Unable to change Syslog filename, null hierarchy");
                  return;
              }
              var sysLogAppender =
                  (SyslogAppender)hier.GetAppenders().
                                            First(appender => appender.Name.Equals("UdpAppender",
                                                StringComparison.InvariantCultureIgnoreCase));
      
              if (null == sysLogAppender)
              {
                  Console.WriteLine("Unable to change Syslog filename, appender not found");
                  return;
              }
              sysLogAppender.RemoteAddress = remoteAddressIp;
              sysLogAppender.ActivateOptions();
          }
      

      我得到了“层次结构”,然后可以得到附加程序并通过其名称检查我想要的那个。就我而言,我希望能够以编程方式更改我的 UDP 附加程序的远程地址,但您可以通过这种方式处理任何预定义的“设置”。如果您使用自定义“设置”会有点麻烦,但这应该可以帮助您。

      因此,这将使您能够访问 XML 配置文件(作为对象)。例如,滚动文件附加程序的日志文件的文件名将以类似的方式访问。

      【讨论】:

      • log4net.LogManager.GetRepository().GetAppenders() 返回一个包含零元素的 IAppender 数组。知道为什么吗?有可能log4net在任何地方都没有写任何日志信息?
      【解决方案3】:

      对于我来说,dll 必须只返回异常。应用程序可以使用 log4net 或其他记录器并记录来自 dll 的异常。 log.config 的路径我通常存储在 app.config appSettings 中。

      您可以尝试在 dll 中制作类似

      const string RELATIVE_LOGGER_CONFIG_FILE_PATH="log.config";
      string directory=System.IO.Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);
      return System.IO.Path.Combine(directory, RELATIVE_LOGGER_CONFIG_FILE_PATH)
      

      ,但我认为是不正确的。只需从 dll 中返回异常。

      PS 此代码为 log4net 设置配置文件

      log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));   
      

      【讨论】:

      • 感谢您的回答。我的主要问题是找到实际的日志文件(我找不到它)。我需要一种在运行时获取当前日志文件的完整路径的方法,并且不太重要但仍然想要在运行时获取当前的 xml 配置文件路径。你能帮我解决这个问题吗?
      • 私有静态字符串 _relativeLoggerConfigFilePath=ConfigurationManager.AppSettings[RELATIVE_LOGGER_CONFIG_FILE_PATH];字符串目录= System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); return System.IO.Path.Combine(directory, _relativeLoggerConfigFilePath);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2010-11-22
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多