【问题标题】:Log4Net does not log when Process is initiated through another application当通过另一个应用程序启动进程时,Log4Net 不记录
【发布时间】:2016-11-15 18:27:26
【问题描述】:

我有两个应用程序(AB)。 A 使用 Process.Start() 实例化 B。两者都使用 log4net 将数据记录到两个不同的 XML 文件(File1File2)。

B 被直接实例化时,它会记录到文件中。但是当它 通过A实例化,它不会将信息记录到文件中。

以下是我的配置:

<log4net>
    <logger name="A.Program" additivity="true">
      <level value="INFO"/>
      <appender-ref ref="ARollingFileAppender"/>
    </logger>

    <logger name="B.Program" additivity="true">
      <level value="INFO"/>
      <appender-ref ref="BRollingFileAppender"/>
    </logger>

    <appender name="ARollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="logs/File1.xml"/>
      <appendToFile value="true"/>
      <datePattern value="yyyyMMdd"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="100"/>
      <maximumFileSize value="10MB"/>
      <layout type="log4net.Layout.XmlLayoutSchemaLog4j">
        <locationInfo value="true"/>
      </layout>
    </appender>

    <appender name="BRollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="logs/File2.xml"/>
      <appendToFile value="true"/>
      <datePattern value="yyyyMMdd"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="100"/>
      <maximumFileSize value="10MB"/>
      <layout type="log4net.Layout.XmlLayoutSchemaLog4j">
        <locationInfo value="true"/>
      </layout>
    </appender>    
  </log4net>

我尝试在 A 实例化 B 后对其执行 log4net 调试。它显示以下没有错误:

log4net:打开文件以写入 [ File2 的位置 ] 附加 [True]

但是当我在同一位置检查 File2 时,它没有写入任何日志。

【问题讨论】:

  • log4net 是在 app/web 配置中还是独立文件?如果是前者,是否在两个应用程序中都适用?另外,您如何使用 XmlConfigurator 或程序集属性配置 log4net?
  • 它在一个独立的文件中。要配置我使用程序集属性: [程序集:log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "Configuration/CLogging.Config.xml", ConfigFileExtension = "xml")] private static readonly log4net.ILog logger = log4net.LogManager .GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  • 您找到解决方案了吗?我也遇到了同样的情况。

标签: c# log4net


【解决方案1】:

你需要添加:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

到附加程序。这将对文件进行最小锁定。但是,如果您记录很多,这将影响您的性能。在这种情况下,最好为每个应用程序提供自己的日志文件。

但是,如果您希望每个应用程序都记录到自己的日志文件中,您也可以从您的配置中删除其他应用程序的附加程序。

【讨论】:

    【解决方案2】:

    要配置我使用程序集属性...

    我怀疑这是你的问题。您没有指定该属性是在项目 A 还是项目 B(或两者)中定义,但请注意 the documentation

    使用属性可以更清晰地定义应用程序的配置将从何处加载。

    但值得注意的是,属性纯粹是被动的。它们仅供参考。

    因此,如果您使用配置属性,您必须调用 log4net 以允许它读取属性。对LogManager.GetLogger 的简单调用将导致调用程序集上的属性被读取和处理。

    因此,必须在应用程序启动期间尽早进行日志调用,并且肯定是在加载和调用任何外部程序集之前。

    在这种情况下,改用 XmlConfiguration 会更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多