Log4net - 无法创建日志文件

4

我正在使用log4net创建日志记录,但是它没有产生任何作用。

这是app.config文件的内容:

<?xml version="1.0" encoding="utf-8">
<configuration>
    <configSection>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSection>
    <log4net>
        <appender name="WriteToFile" type="log4net.Appender.FileAppender">
            <file value="log.txt" />
            <layout ="log4net.Layout.SimpleLayout" />
        </appender>
        <root>
            <level value="ALL" />
            <appender-ref ref="WriteToFile"/>
        </root>
    </log4net>
</configuration>

我在 AssemblyInfo.cs 文件中有以下代码:

[assembly: log4net.Config.XmlConfigur(ConfigFile ="App.config", Watch= true)]

这里是尝试写入文件的代码:

private static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

public void write()
{
    log.Info("Some text here");
}

以下是下一行:

log4net.Config.XmlConfigurator.Configure();

试试这个,我认为它会对你有所帮助。https://dev59.com/LHM_5IYBdhLWcg3wlEFH - Brian
你是否在某个没有写入权限的文件夹中运行程序? - BeerBaron
2个回答

9

如果这是一个可执行文件,那么我猜你的配置文件在生成的 bin 文件夹里不叫 App.config,而是叫做 MyApp.exe.config。所以你可以尝试修复这个问题:

ConfigFile ="App.config"

如果您使用默认值,也可以跳过配置文件名:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

同时确保您运行应用程序的帐户具有写入权限,以便将日志文件写入您期望的文件夹中。


更新:

逐步指南:

  1. Create a new Console Application
  2. Install the log4net NuGet
  3. Use the following in your App.config:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
        </configSections>
        <log4net>
            <appender name="WriteToFile" type="log4net.Appender.FileAppender">
                <file value="log.txt" />
                <layout type="log4net.Layout.SimpleLayout" />
            </appender>
            <root>
                <level value="ALL" />
                <appender-ref ref="WriteToFile" />
            </root>
        </log4net>
    </configuration>
    
  4. And in your Program.cs:

    using log4net;
    using System.Reflection;
    
    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
    
    namespace ConsoleApplication1
    {
        class Program
        {
            private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    
            static void Main(string[] args)
            {
                log.Info("Some text here");
            }
        }
    }
    

1
两种方法都尝试了,还是不起作用:( 有其他想法吗? - Golan Kiviti
我已经更新了我的答案,并提供了一个逐步指南到一个工作示例。我不确定你的帖子中是否有错别字,或者你的实际代码中是否有这个问题,但是你展示的XML配置文件是无效的。例如,XML声明缺少一个闭合?,而且这是无效的:<layout ="log4net.Layout.SimpleLayout" />,... - Darin Dimitrov
嗯,奇怪,这些步骤对我来说完全没有问题。你使用的 log4net 版本是哪个?我用的是最新的版本:2.0.5。 - Darin Dimitrov
我测试了2.0.8版本,它可以正常工作。我以管理员身份运行了该应用程序。 - zapoo

2

只有当我运行静态的Configure方法时,我才能成功使用log4net:

        log4net.Config.XmlConfigurator.Configure();

将其封装在以下一个方法中,以读取应用程序的默认配置,无论是web.config还是app.config:

    private static void InitLogging()
    {
        log4net.Config.XmlConfigurator.Configure();
        _logger = Common.Logging.LogManager.GetLogger(typeof(Program));
        _logger.Debug("Logging initialized");
    }

你提出的使用装饰器属性似乎更加优雅,但是上面提到的方法也值得一试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接