c# – Log4Net不会在发布模式下写入日志 – 控制台应用程序

我有一个控制台应用程序,并有一个包装Log4Net方法的类库.现在,当在调试模式下运行应用程序时,它会写入日志,但是当它在发布模式下构建时,它不会写入日志文件.这会是什么解决方案?示例代码和配置文件如下所示

我的开发环境是

> Visual Studio 2013和.NET Framework 4.5

控制台应用

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            log4net.GlobalContext.Properties["LogFileName"] = "TestLogin.txt";
            Logger log = new Logger(typeof(Program));
            log.Info("Logging is enabled!!");
        }
    }
}

控制台应用程序中的App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <log4net>
      <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file type="log4net.Util.PatternString" value ="%property{LogFileName}"/> 
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %level  - %message%newline%exception" />
        </layout>
      </appender>
      <root>
        <level value="ALL" />
        <appender-ref ref="RollingFileAppender" />
      </root>
    </log4net>
</configuration>

班级图书馆

using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Logging
{
    public class Logger
    {
        private readonly ILog log = null;

        public Logger(Type type)
        {
            log = LogManager.GetLogger(type);
        }
        public void Info(object message)
        {
            log.Info(message);
        }
    }
}

我已经关注了帖子,它没有帮助我弄清楚为什么Log4Net不会在发布模式下写入日志文件?

log4net doesn’t log when running a .Net 4.0 Windows application built in Release mode

解决方法:

有一些解决方法.

>您可以添加[MethodImpl(MethodImplOptions.NoInlining)]
属性为类库中的Logger构造函数方法.
>你可以添加[assembly:log4net.Config.XmlConfigurator(Watch =
())到Console项目中的AssemblyInfo.cs(不是类库项目)
>您可以添加log4net.Config.XmlConfigurator.Configure();在
启动Logger构造函数.

我认为发生这种情况的原因是,在发布模式下,您的类库是内联的,因此当log4net尝试查找属性时,它认为调用程序集是您的exe,它不包含该属性.

PS.

我假设你知道你的Logger类意味着你失去了按方法名称过滤的能力,因为log4net只会看到Logger.Info方法名称.

上一篇:c# – 使用MinimalLock锁定模型的log4net在以编程方式设置文件名时不起作用


下一篇:基于log4net的日志组件扩展分装,实现自动记录交互日志 XYH.Log4Net.Extend