【问题标题】:Log4Net logger class not creating file when called from WCF Service Library Project?从 WCF 服务库项目调用时,Log4Net 记录器类未创建文件?
【发布时间】:2018-10-05 06:02:34
【问题描述】:

在类库项目中有这个 Log4net 类。使用 .dll 后从 Windows 应用程序访问时,会创建文件并写入日志。

在我的 WCF 服务库项目中使用我的类库项目的相同 .dll 时,根本不会创建该文件。

我从 windows 应用程序和 wcf 服务库项目写入日志的方式与下面完全相同。

为什么从 WCF 调用时行为不同?

我如何在同一解决方案中从其他项目调用记录器类:

public Logger Logger;
Logger = Logger.Instance();
Logger.Debug("Product Service is called");

类库项目中的记录器类:

    public class Logger
{
    private static volatile Logger instance;
    private static object syncRoot = new Object();
    private static log4net.ILog logger = null;
    private object _lock = new object();

    private Logger()
    {
        if (logger == null)
        {
            XmlConfigurator.Configure();
            logger = log4net.LogManager.GetLogger("LoggerManager");
        } 
    }

    public static Logger Instance()
    { 
        if (instance == null)
        {
            lock (syncRoot)
            {
                if (instance == null)
                    instance = new Logger();
            }
        } 
        return instance;
    } 


    public void Info(string info, [CallerMemberName] string memberName = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0)
    {
        lock (_lock)
        {
            logger.Info(string.Format("Info : {0} in member {1}, file {2} at line {3}", info, memberName, filePath, lineNumber));
        }
    }
}

log4net.config.xml:

  <log4net debug="false">
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="c:\Logs\App.Log" />
    <threshold value="ALL" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <maximumFileSize value="1MB" />
    <maxSizeRollBackups value="10" />
    <datePattern value="yyyyMMdd" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="*%-10level %-30date %message [%logger] [%thread] %newline" />
    </layout>
  </appender>
  <logger name="Logger">
    <level value="ALL"/>
    <appender-ref ref="RollingFileAppender"/>
  </logger> 

  <root>
    <level value="ALL" />
    <appender-ref ref="RollingFile" /> 
  </root>
</log4net>

【问题讨论】:

    标签: c# wcf log4net


    【解决方案1】:

    在您的 WCF 服务的相应 app.config 文件中是否有 &lt;log4net&gt; 部分?如果缺少,则不会创建日志文件。

    编辑

    在聊天室中追查到问题后,解决方法是复制WCF dll的输出目录中缺少的log4net.config.xml。然后出现了日志文件。

    【讨论】:

    • 为什么我的 WCF 服务项目的 app.config 中应该有 log4net
      ?它是在记录器类所在的另一个项目中配置的。写入日志的 Windows 应用程序的 app.config 中没有这样的 log4net
      ,但它仍然可以工作。
    • 我不想在所有项目中都有 log4net 配置或引用 log4net dll。为此,我确实有一个单独的类库,它将被共享。想以这种方式实现。可能吗?
    • 当你启动你的WCF服务时,只会加载WCF服务的app.config。所以必须有&lt;log4net&gt; 部分。 &lt;log4net&gt; 部分只能在您启动的项目的app.config 中。例如你有库lib1.dlllib2.dll、你的WCF服务service.exe和一个Windows应用程序app.exe。所有四个都使用log4net。然后你需要app.configservice.exeapp.configapp.config 中的log4net 部分app.exe
    • 当我的 Windows 应用程序能够在其 app.config 中没有 log4net
      的情况下执行此操作时,我不明白。可能是因为 win app 的输出是 .exe ?无论如何,我尝试按照您的建议添加我的 wcf 服务库应用程序 app.config。但是还是不行!!!注意:不是service.exe,是service.dll。因为它是 WCF 服务库项目而不是 WCF 服务应用程序项目
    • 啊。没有得到你(“......在其 app.config 中没有 log4net
      的情况下做到这一点......”)。启动 exe 时 log4net 文件在哪里?你是通过代码配置log4net吗?
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2012-12-07
    • 2013-08-23
    • 1970-01-01
    • 2011-01-26
    • 2016-09-25
    • 2013-11-26
    • 2012-09-21
    相关资源
    最近更新 更多