我有两个应用程序( A 和 B )。 A 使用Process.Start()实例化 B 。两者都使用log4net将数据记录到两个不同的XML文件( File1 和 File2 )。
当 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时,它没有写入任何日志。
答案 0 :(得分:0)
您需要添加:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
到appenders。这将对文件进行最小程度的锁定。但是,如果您记录很多,这将影响您的性能。在这种情况下,最好为每个应用程序提供自己的日志文件。
但是,如果您希望每个应用程序都记录到自己的日志文件,您还可以从配置中删除其他应用程序的appender。
答案 1 :(得分:0)
配置我使用程序集属性...
我怀疑那是你的问题。您没有指定属性是在项目A还是项目B(或两者)中定义,而是从the documentation注意到:
使用属性可以更清晰地定义从何处加载应用程序的配置。
然而值得注意的是,属性纯粹是被动的。它们仅供参考。
因此,如果使用配置属性,则必须调用log4net以允许它读取属性。对
LogManager.GetLogger
的简单调用将导致调用程序集上的属性被读取和处理。因此,必须在应用程序启动期间尽早进行日志记录调用,当然在加载和调用任何外部程序集之前。
在这种情况下,使用XmlConfiguration会更容易。