我有一个控制台应用程序,并有一个包装Log4Net方法的类库。现在,当在调试模式下运行应用程序时,它会写入日志,但是当它在发布模式下构建时,它不会写入日志文件。这会是什么解决方案?示例代码和配置文件在下面给出
我的开发环境是
控制台应用
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
答案 0 :(得分:5)
有一些解决方法。
您可以添加[MethodImpl(MethodImplOptions.NoInlining)]
属性为类库中的Logger构造函数方法。
您可以将[assembly: log4net.Config.XmlConfigurator(Watch =
true)]
添加到Console Project中的AssemblyInfo.cs(而不是类库项目)
您可以在地址添加log4net.Config.XmlConfigurator.Configure();
启动Logger构造函数。
我认为发生这种情况的原因是在发布模式下,您的类库是内联的,因此当log4net尝试查找属性时,它认为调用程序集是您的exe,它不包含该属性。
PS。
我认为您知道您的Logger类意味着您无法按方法名称进行过滤,因为log4net只会看到Logger.Info方法名称。
答案 1 :(得分:1)
应将[assembly: log4net.Config.XmlConfigurator(Watch = true)]
行添加到AssemblyInfo.cs
文件夹中的Properties
文件中。
答案 2 :(得分:1)
对于拥有MVC应用程序且在AssemblyInfo.cs中已经有[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
行且在Global.asax.cs中已经有log4net.Config.XmlConfigurator.Configure();
但仍未写入的用户,请确保应用程序池用户有权写入您正在编写日志的位置。
为了解决这个问题,我只是在IIS服务器上创建了一个不在inetpub
内的日志目录,给了它足够的权限(我想它可以是&#34; Everyone&#34;,&#34; Full控制&#34;如果它只是一个子日志目录并且您感觉很懒惰,并在log4net.config(或Web.config,如果你没有隔离它)中写入完整路径)。
这是我的配置文件:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL"/>
<appender-ref ref="RollingFileAppender"/>
</root>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:/absolute/path/to/logfile.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maximumFileSize value="10MB"/>
<datePattern value="yyyyMMdd'-FULL.log'" />
<maxSizeRollBackups value="-1"/>
<staticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
答案 3 :(得分:0)
我在我的Logging.dll和我的Program.exe assembly.cs中有这个。然后它在调试和释放模式下都有效。我的程序是一个Windows服务。
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
答案 4 :(得分:0)
确保将log4net.config文件添加到最终发行版二进制文件中,并且与ConfigFile = "log4Net.config"
中提到的路径相对应。
我遇到了同样的问题,然后我意识到我只是在我的发行二进制文件中丢失了此配置文件。