当参数大于2时,命名空间/类/方法不显示在日志文件中

时间:2017-02-14 09:51:22

标签: c# wcf logging log4net log4net-configuration

我有一个WCF服务应用程序,在其Web.config中,我定义了以下log4net配置:

<log4net>
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="F:\InternalAPIServer\logs\InternalAPIServer.log"/>
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="2" />
    <maximumFileSize value="1MB" />
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] [%-5p] %C.%M - %m%n"/>
    </layout>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="LogFileAppender" />
  </root>
</log4net>

在代码中,当我使用一个或两个参数调用记录器时:

Log.InfoFormat("Server certificate validity dates: [{0} - {1}].", ServerCertificate.GetEffectiveDateString(), ServerCertificate.GetExpirationDateString());

日志在日志文件中显示正常:

2017-02-14 17:12:01,056 [12] [INFO ] InternalAPIServer.Connection.ValidateServerCertficate - Server certificate validity dates: [31/5/2016 8:00:00 AM - 7/6/2017 8:00:00 PM].

但是当我用三个参数调用记录器时:

Log.InfoFormat("Server certificate issuer: [{0}], validity dates: [{1} - {2}].", ServerCertificate.Issuer, ServerCertificate.GetEffectiveDateString(), ServerCertificate.GetExpirationDateString());

日志不再正常,因为名称空间,类和方法名称变为&#34;?。?&#34;:

2017-02-14 17:22:01,056 [12] [INFO ] ?.? - Server certificate issuer: [CN=DigiCert SHA2 Secure Server CA, O=DigiCert Inc], C=US, validity dates: [31/5/2016 8:00:00 AM - 7/6/2017 8:00:00 PM].

为什么会这样?当记录器的参数数量超过两个时,如何保留命名空间,类和方法名称?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我并不完全了解您应该与Log4Net一起使用的参数,但是您的错误必须发生,因为您应该传递一个纯字符串。

您可以使用@PersistenceContext

来实现
String.Format()

因此,您应该可以使用

string message = String.Format("Server certificate issuer: [{0}], validity dates: [{1} - {2}].",
    ServerCertificate.Issuer, 
    ServerCertificate.GetEffectiveDateString(), 
    ServerCertificate.GetExpirationDateString())

Log.InfoFormat(message);