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());
}