Log4Net文件附加器未记录日志。

4

我的FileAppender无法工作。可能不是权限问题,因为我是本地管理员。

我已经启用了内部调试,但从log4net中没有收到任何错误或异常信息。

以下是我的配置文件。 谢谢

<log4net>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
            </layout>
        </appender>
        <appender name="FileAppender" type="log4net.Appender.FileAppender">
            <file value="C:\log-file.txt" />
            <appendToFile value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
            </layout>
        </appender>
        <root>
            <level value="DEBUG" />
            <appender-ref ref="ConsoleAppender" />
            <appender-ref ref="FileAppender" />
        </root>
    </log4net>

记录日志的代码如下:-
public class Logger
{
    private static readonly ILog defaultLog;
    static Logger()
    {
        BasicConfigurator.Configure();
        defaultLog = LogManager.GetLogger("default");
    }

    public static void Log(string errorMessage, Exception exception)
    {
        defaultLog.Error(errorMessage, exception);
    }
}

尝试直接运行你的exe文件,而不是通过Visual Studio运行。看看是否会创建成功。另外,ConsoleAppender是否起作用?你使用的调用log4net的代码是什么? - Matt Dawdy
@Matt,ConsoleAppender 运行良好。在 VS 外部运行也不起作用。 - BenCr
@MattDawdy,我应该提一下的是,它被强制成为一个x64应用程序。 - BenCr
只是基本的配置器。我刚刚尝试了在 AnyCpu 平台配置,但它并没有修复任何问题。 - BenCr
@StefanEgli,你解决了它。调用XmlConfigurator修复了这个问题。谢谢。 - BenCr
显示剩余2条评论
4个回答

7

根据您的描述,我推测您使用了BasicConfigurator(仅支持ConsoleAppender),而没有使用XmlConfigurator。切换到XmlConfigurator应该可以解决您的问题。


2
特别是:* BasicConfigurator.Configure()方法的调用创建了一个相当简单的log4net设置。该方法已经硬编码添加了一个ConsoleAppender到根记录器中。输出将使用PatternLayout格式化,该格式设置为“ %-4timestamp [%thread] %-5level%logger%ndc - %message%newline”模式。*(http://logging.apache.org/log4net/release/manual/configuration.html) - Ross Patterson

6
有两种主要的选项可用于启用日志记录。更多详细信息请参见配置手册。
  1. 使用 XmlConfigurator.Configure()
  2. [assembly: log4net.Config.XmlConfigurator(Watch=true)] 添加到 AssemblyInfo.cs
BasicConfigurator.Configure() 只能写入控制台。

欢呼。assemblyInfo.cs 缺少了 gubbins。 - geedubb

1

你试过使用RollingFileAppender吗?

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
  <file value="C:\log-file.txt" />
  <maximumFileSize value="10MB" />
  <maxSizeRollBackups value="10" />
  <rollingStyle value="Composite" />
  <appendToFile value="true" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
  </layout>
</appender>

0
我创建了这个辅助类。
1)您可以在应用程序中初始化所需的多个appender,因此如果一个dll调用另一个dll,则两者都可以初始化appender,并且两个appender都将起作用。 2)您还可以关闭appender(例如文件appender),然后将其作为电子邮件发送。
Log4NetFileHelper log = new Log4NetFileHelper();
        log.Init(); //Initialize
        log.AddConsoleLogging(); //Add Console Logging
        log.AddFileLogging(Path.Combine(AssemblyDirectory, "BatchConsole.log")); //Add Console Logging
        log.AddFileLogging(Path.Combine(AssemblyDirectory, "BatchConsole_error.log"),log4net.Core.Level.Error); //Add Console Logging



public class Log4NetFileHelper
{
    private string  DEFAULT_LOG_FILENAME=string.Format("application_log_{0}.log",DateTime.Now.ToString("yyyyMMMdd_hhmm"));
    Logger root;
    public Log4NetFileHelper()
    {

    }

    public virtual void Init()
    {
        root = ((Hierarchy)LogManager.GetRepository()).Root;
        //root.AddAppender(GetConsoleAppender());
        //root.AddAppender(GetFileAppender(sFileName));
        root.Repository.Configured = true;
    }

    #region Public Helper Methods
    #region Console Logging
    public virtual void AddConsoleLogging()
    {
        ConsoleAppender C = GetConsoleAppender();
        AddConsoleLogging(C);
    }

    public virtual void AddConsoleLogging(ConsoleAppender C)
    {
        root.AddAppender(C);
    }
    #endregion

    #region File Logging
    public virtual FileAppender AddFileLogging()
    {
        return AddFileLogging(DEFAULT_LOG_FILENAME);
    }

    public virtual FileAppender AddFileLogging(string sFileFullPath)
    {
        return AddFileLogging(sFileFullPath, log4net.Core.Level.All);
    }

    public virtual FileAppender AddFileLogging(string sFileFullPath, log4net.Core.Level threshold)
    {
        return AddFileLogging(sFileFullPath, threshold,true);  
    }

    public virtual FileAppender AddFileLogging(string sFileFullPath, log4net.Core.Level threshold, bool bAppendfile)
    {
        FileAppender appender = GetFileAppender(sFileFullPath, threshold , bAppendfile);
        root.AddAppender(appender);
        return appender;
    }

    public virtual SmtpAppender AddSMTPLogging(string smtpHost, string From, string To, string CC, string subject, log4net.Core.Level threshhold)
    {
        SmtpAppender appender = GetSMTPAppender(smtpHost, From, To, CC, subject, threshhold);
         root.AddAppender(appender);
         return appender;
    }

    #endregion


    public log4net.Appender.IAppender GetLogAppender(string AppenderName)
    {
        AppenderCollection ac = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Appenders;

        foreach(log4net.Appender.IAppender appender in ac){
            if (appender.Name == AppenderName)
            {
                return appender;
            }
        }

        return null;
    }

    public void CloseAppender(string AppenderName)
    {
        log4net.Appender.IAppender appender = GetLogAppender(AppenderName);
        CloseAppender(appender);
    }

    private void CloseAppender(log4net.Appender.IAppender appender)
    {
        appender.Close();
    }

    #endregion

    #region Private Methods

    private SmtpAppender GetSMTPAppender(string smtpHost, string From, string To, string CC, string subject, log4net.Core.Level threshhold)
    {
        SmtpAppender lAppender = new SmtpAppender();
        lAppender.Cc = CC;
        lAppender.To = To;
        lAppender.From = From;
        lAppender.SmtpHost = smtpHost;
        lAppender.Subject = subject;
        lAppender.BufferSize = 512;
        lAppender.Lossy = false;
        lAppender.Layout = new
        log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");
        lAppender.Threshold = threshhold;
        lAppender.ActivateOptions();
        return lAppender;
    }

    private ConsoleAppender GetConsoleAppender()
    {
        ConsoleAppender lAppender = new ConsoleAppender();
        lAppender.Name = "Console";
        lAppender.Layout = new 
        log4net.Layout.PatternLayout(" %message %n");
        lAppender.Threshold = log4net.Core.Level.All;
        lAppender.ActivateOptions();
        return lAppender;
    } 
    /// <summary>
    /// DETAILED Logging 
    /// log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");
    ///  
    /// </summary>
    /// <param name="sFileName"></param>
    /// <param name="threshhold"></param>
    /// <returns></returns>
    private FileAppender GetFileAppender(string sFileName , log4net.Core.Level threshhold ,bool bFileAppend)
    {
        FileAppender lAppender = new FileAppender();
        lAppender.Name = sFileName;
        lAppender.AppendToFile = bFileAppend;
        lAppender.File = sFileName;
        lAppender.Layout = new 
        log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");
        lAppender.Threshold = threshhold;
        lAppender.ActivateOptions();
        return lAppender;
    }

    //private FileAppender GetFileAppender(string sFileName)
    //{
    //    return GetFileAppender(sFileName, log4net.Core.Level.All,true);
    //}

    #endregion

    private void  ConfigureLog(string sFileName)
    {


    }
}

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