C# 无法使log4net与.net windows服务一起工作

C# 无法使log4net与.net windows服务一起工作,c#,.net,logging,log4net,log4net-configuration,C#,.net,Logging,Log4net,Log4net Configuration,我有一个带有app.config和log4net.config的windows服务 app.config: log4net.config: 我也在AssemblyInfo.cs中添加了这个: [assembly: log4net.Config.XmlConfigurator(Watch = true)] 在我的一门课上,我有: private readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().

我有一个带有
app.config
log4net.config
的windows服务

app.config


log4net.config


我也在
AssemblyInfo.cs
中添加了这个:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
在我的一门课上,我有:

private readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

我已授予所有用户对我的日志文件夹的完全权限

“我的bin”文件夹(运行服务的源文件夹)既有我的
app.config
又有
log4net.config

但是没有生成日志文件。我错过了什么设置

于2014年3月4日更新


如果您像我一样使用单独的配置文件(log4net.config),请记住在检查并重新检查后,在解决方案资源管理器中将
复制到输出目录
设置设置为
始终复制

您只需调用
XmlConfigurator.Configure()创建记录器之前(仅一次)

很高兴能帮助你


Ofir

如果您要创建一个不同的配置文件,并将与log4net相关的内容放入其中,那么您需要使用
[程序集:log4net.Config.XmlConfigurator(ConfigFile=@“…\log4net.Config”,Watch=true)]
在AssemblyInfo.cs中,而不仅仅是

[程序集:log4net.Config.XmlConfigurator(Watch=true)]

否则,你必须把

...

App.config中的部分配置

如果其中一些配置看起来很明显,很抱歉,但我会检查这些配置:

  • 确保将log4net.config文件属性Copy to Output设置为Copy Always,通过检查bin目录中的文件进行验证

  • 另请注意与AssemblyInfo.cs属性相关的log4net文档:

使用属性可以更清晰地定义从何处加载应用程序配置。不管它值多少钱 注意,属性纯粹是被动的。它们只是信息。 因此,如果使用配置属性,则必须调用log4net 允许它读取属性。一个简单的电话 LogManager.GetLogger将导致调用程序集上的属性 被读取和处理因此,必须制定一个 在应用程序启动期间尽早记录调用,以及 当然,在加载和安装任何外部程序集之前 调用

  • 要进行故障排除,您可以尝试从程序集级属性切换到显式配置调用

    XmlConfigurator.Configure()

    应该足够了

  • 我总是使log4net.config成为一个完整的配置文件,从

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> ... </log4net> </configuration> ...

只要您的配置文件是log4net.config,您就不需要app.config中与log4net相关的任何内容。log4net在活动用户的权限下运行。请确保活动用户有权创建/修改/删除指定的文本文件。

By Design Log4Net

失败停止,我们的意思是log4net不会抛出意外异常 在运行时可能导致应用程序崩溃

因此,很难找出问题的原因

如何启用log4net内部调试

来自常见问题-

  • 也可以通过在中设置值来启用内部调试 应用程序的配置文件(不是log4net配置文件, 除非log4net配置数据嵌入到应用程序的 配置文件)。log4net.Internal.Debug应用程序设置必须为 将值设置为true。例如:
将此属性设置为True log4net.Util.LogLog.InternalDebugging=True

公共类Log4NetFileHelper
{
私有字符串DEFAULT_LOG_FILENAME=string.Format(“application_LOG_{0}.LOG”,DateTime.Now.ToString(“yyyyMMMdd_hhmm”);
根;
公共日志4NetFileHelper()
{
}
公共虚拟void Init()
{
root=((层次结构)LogManager.GetRepository()).root;
//AddAppender(GetConsoleAppender());
//AddAppender(GetFileAppender(sFileName));
root.Repository.Configured=true;
}
#区域公共助手方法
#区域控制台日志记录
公共虚拟void AddConsoleLogging()
{
ConsoleAppender C=GetConsoleAppender();
addconsolelography(C);
}
公共虚拟void AddConsoleLogging(ConsoleAppender C)
{
根.附加器(C);
}
#端区
#区域文件记录
公共虚拟文件附加器AddFileLogging()
{
返回AddFileLogging(默认的日志文件名);
}
公共虚拟文件附加器AddFileLogging(字符串sFileFullPath)
{
返回AddFileLogging(sFileFullPath、log4net.Core.Level.All);
}
公共虚拟FileAppender AddFileLogging(字符串sFileFullPath,log4net.Core.Level阈值)
{
返回AddFileLogging(sFileFullPath,阈值,true);
}
公共虚拟FileAppender AddFileLogging(字符串sFileFullPath、log4net.Core.Level阈值、bool bAppendfile)
{
FileAppender appender=GetFileAppender(sFileFullPath,threshold,bAppendfile);
root.AddAppender(appender);
返回追加器;
}
公共虚拟SmtpAppender AddSMTPLogging(字符串smtpHost、字符串From、字符串To、字符串CC、字符串subject、log4net.Core.Level threshold)
{
SmtpAppender appender=GetSMTPAppender(smtpHost、From、To、CC、subject、threshold);
root.AddAppender(appender);
返回追加器;
}
#端区
public log4net.Appender.IAppender GetLogAppender(字符串AppenderName)
{
AppenderCollection ac=((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Appenders;
foreach(log4net.Appender.IAppende
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" 
       type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
...
  </log4net>
</configuration>
<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
            <appSettings>
                <add key="log4net.Internal.Debug" value="true"/>
            </appSettings> 
</configuration>
Log4NetFileHelper log = new Log4NetFileHelper();
        log.Init(); //Initialize
        log.AddConsoleLogging(); //Add Console Logging
        log.AddFileLogging(Path.Combine(AssemblyDirectory, "BatchConsole.log")); 
        log.AddFileLogging(Path.Combine(AssemblyDirectory,"BatchConsole_error.log"),log4net.Core.Level.Error); 
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)
    {


    }
}
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]
private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(typeof(class_name));
var assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
XmlConfigurator.Configure(new FileInfo(Path.Combine(assemblyFolder, "log4net.config")));
  private static void InstanceLogger()
    {
        if (logger == null)
            logger = LogManager.GetLogger(typeof(Utility));

        // Code to troubleshoot Log4Net issues through Event log viewer
        StringBuilder sb = new StringBuilder();

        foreach (log4net.Util.LogLog m in logger.Logger.Repository.ConfigurationMessages)
        {
            sb.AppendLine(m.Message);
        }

        throw new Exception("String messages: " + sb.ToString());

    }