gpt4 book ai didi

c# - Log4Net 在 Release模式下不写入日志 - 控制台应用程序

转载 作者:太空狗 更新时间:2023-10-30 00:41:10 25 4
gpt4 key购买 nike

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

我的开发环境是

  • 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 在 Release模式下不写入日志文件?

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 =
    true)]
    到控制台项目(不是类库项目)中的 AssemblyInfo.cs

  • 您可以添加 log4net.Config.XmlConfigurator.Configure();开始您的 Logger 构造函数。

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

附言。

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

关于c# - Log4Net 在 Release模式下不写入日志 - 控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com