2017-07-27 54 views
3

我打开了调试,所以我很确定它连接到数据库。我说这是因为如果我拼错了数据库名称,它会输出一个错误。Log4Net似乎连接到数据库,但不插入

我不知道我在做什么错。我知道我有参数尚未使用。

我所做的是将this tutorial修改为一个项目。如果您需要了解更多信息,请告诉我。

Log4Net.config

<?xml version="1.0" encoding="utf-8" ?> 
<log4net debug="true"> 
    <root> 
    <level value="ALL"/> 
    <appender-ref ref="AdoNetAppender"/> 
    <appender-ref ref="DebugAppender"/> 
    </root> 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="1" /> 
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    <connectionString value="Data Source=server;Initial Catalog=db; User Id=user; Password=pass" /> 
    <commandText value="INSERT INTO LogException ([LogLevel],[LogMessage],[StackTrace],[Object],[CreateDateTime]) VALUES (@log_level, @message, @stacktrace, @exception, @date)" /> 
    <parameter> 
     <parameterName value="@log_date" /> 
     <dbType value="DateTime" /> 
     <layout type="log4net.Layout.RawTimeStampLayout" /> 
    </parameter> 
    <parameter> 
     <parameterName value="@thread" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%thread" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@log_level" /> 
     <dbType value="String" /> 
     <size value="50" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%level" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@logger" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%logger" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@message" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%message" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@exception" /> 
     <dbType value="String" /> 
     <size value="2000" /> 
     <layout type="log4net.Layout.ExceptionLayout" /> 
    </parameter> 
    <parameter> 
     <parameterName value="@entryAssembly" /> 
     <dbType value="String" /> 
     <size value="200" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{entryAssembly}" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@callingAssembly" /> 
     <dbType value="String" /> 
     <size value="200" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{callingAssembly}" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@method" /> 
     <dbType value="String" /> 
     <size value="2000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{method}" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="@stacktrace" /> 
     <dbType value="String" /> 
     <size value="2000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%stacktrace" /> 
     </layout> 
    </parameter> 
    </appender> 
</log4net> 

Log4netLoggingService.cs

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using Logging.Contracts.Log; 
using log4net; 
using log4net.Appender; 
using log4net.Config; 
using log4net.Filter; 
using log4net.Util; 


namespace Logging 
{ 
    public class Log4NetLoggingService : ILoggingService 
    { 
     private readonly ILog _logger; 

     static Log4NetLoggingService() 
     { 
      var log4NetConfigFilePath = @"C:\Work\folder\Main\Logging\Log4Net.config"; 

      XmlConfigurator.ConfigureAndWatch(new FileInfo(log4NetConfigFilePath)); 

     } 

     //targets reads from and enum to know where to save. 
     public Log4NetLoggingService(LogTarget targets = LogTarget.All) 
     { 
      _logger = LogManager.GetLogger(new StackFrame(1).GetMethod().DeclaringType); 
#if DEBUG 
      var error = LogManager.GetRepository().ConfigurationMessages.Cast<LogLog>(); 
#endif 

      if (targets.HasFlag(LogTarget.All)) 
       return; 

      SwitchOffLogTargets(targets); 
     } 

     protected ILog logger { get { return _logger; } } 

     public void Fatal(ErrorLogEntry logEntry) 
     { 
      logEntry.Level = Level.Fatal.ToString(); 
      if (_logger.IsFatalEnabled) 
       _logger.Fatal(logEntry); 
     } 

     public void Error(ErrorLogEntry logEntry) 
     { 
      logEntry.Level = Level.Error.ToString(); 
      if (_logger.IsErrorEnabled) 
       _logger.Error(logEntry); 
     } 

     public void Warn(LogEntry logEntry) 
     { 
      logEntry.Level = Level.Warn.ToString(); 
      if (_logger.IsWarnEnabled) 
       _logger.Warn(logEntry); 
     } 

     public void Info(LogEntry logEntry) 
     { 
      logEntry.Level = Level.Info.ToString(); 
      if (_logger.IsInfoEnabled) 
       _logger.Info(logEntry); 
     } 

     public void Debug(LogEntry logEntry) 
     { 
      logEntry.Level = Level.Debug.ToString(); 
      if (_logger.IsDebugEnabled) 
       _logger.Debug(logEntry); 
     } 

     private void SwitchOffLogTargets(LogTarget targets) 
     { 
      var appenders = _logger.Logger.Repository.GetAppenders().ToList(); 

      if (!targets.HasFlag(LogTarget.Database)) 
      { 
       var db = appenders.FirstOrDefault(piA => piA is AdoNetAppender); 
       if (db != null) 
        ((AdoNetAppender)db).AddFilter(new DenyAllFilter()); 
      } 

      if (!targets.HasFlag(LogTarget.TextFile)) 
      { 
       var file = appenders.FirstOrDefault(piA => piA is RollingFileAppender); 
       if (file != null) 
        ((RollingFileAppender)file).AddFilter(new DenyAllFilter()); 
      } 

      if (!targets.HasFlag(LogTarget.Trace)) 
      { 
       var trace = appenders.FirstOrDefault(piA => piA is AspNetTraceAppender); 
       if (trace != null) 
        ((AspNetTraceAppender)trace).AddFilter(new DenyAllFilter()); 
      } 

     } 
    } 
} 

更新:

事实证明我的最新尝试的作品。我拼错了配置文件名。我希望这可以帮助未来的人。我打算写一篇关于此的博客文章。

Log4Net.config

<?xml version="1.0" encoding="utf-8" ?> 
<log4net> 
    <root> 
    <level value="ALL" debug="true"/> 
    <!--Add the appenders you want to use here--> 
    <appender-ref ref="AdoNetAppender"/> 
    <!--to debug log4net. check the output window of Visual Studio--> 
    <appender-ref ref="DebugAppender"/> 
    </root> 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="1" /> 
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    <connectionString value="data source=(localdb)\MSSQLLocalDB;initial catalog=log4NetTestDB;integrated security=false;persist security info=True;" /> 
    <commandText value="INSERT INTO LogException ([Message]) VALUES (@message)" /> 
     <parameter> 
     <parameterName value="@message" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%message" /> 
     </layout> 
     </parameter> 
    </appender> 
</log4net> 

ILoggingAdapter

namespace Logging 
{ 
    public interface ILoggingAdapter 
    { 
     TimeSpan ExecutionTime { get; set; } 
     int Counter { get; set; } 
     void Info(string message); 
     void Warn(string message); 

    } 
} 

记录器

namespace Logging 
{ 
    public sealed class Logger : ILoggingAdapter 
    { 
     private ILog _log = LogManager.GetLogger(typeof(Logger)); 

     public TimeSpan ExecutionTime { get; set; } 
     public int Counter { get; set; } 
     public string Info { get; set; } 
     public string Warn { get; set; } 


     void ILoggingAdapter.Info(string message) 
     { 
      throw new NotImplementedException(); 
     } 

     void ILoggingAdapter.Warn(string message) 
     { 
      _log.Warn(message); 
     } 
    } 
} 
+2

也许这只是我,但对于一个链接的解决方案似乎太笨拙,并将事情颠倒:Imho日志记录应尽可能无摩擦,尽可能快速,如果您需要ETL一点,分析日志不会受到伤害。此外,您似乎并未打算使用建议的序列化功能 - 可以轻松配置多个日志目标和日志级别,而无需任何代码。如果你只是想登录到你的数据库,这个博客会让你误入歧途。 – Filburt

+0

是的,我开始认为这是一个有缺陷的方法。我被它的粒度所吸引,特别是因为我不确定现在和将来的日志需求是什么。 –

+0

Trust @George和我:Log4Net和可用的appender几乎可以满足任何你想象的灵活性。最好你从基本设置开始,并在稍后添加花里胡哨的功能。如果你发现你不能没有非常具体的功能,那么最好考虑开发一个适当的appender,而不是按照博客中显示的方式修改现有的appender。 – Filburt

回答

3

好的所以SEV eral notes

  • 你是否试过以指定的用户身份登录数据库并运行所需的插入查询?
  • 您是否在log4net中尝试过enabling debug mode以查看引擎盖下发生了什么?
  • 与上述相关,在根上​​使用两个记录器 - 一个用于db,另一个用于文件。这是一个糟糕的想法只使用数据库日志记录,因为如果数据库失败,你不会得到一个有关它失败的日志。最起码,你的本地开发环境应该被记录到文件
  • beefycoder has written a ton about understanding log4net注意到许多地方该教程
  • 我不知道为什么你正在做的东西一样if (_logger.IsInfoEnabled) - 这就是LogInfo已经
  • 为什么地球上你将LogEntry作为参数类型?像这样使用服务类的整个目的是打破对log4net的严重依赖。通过使用该类类型,您刚刚在消费者中创建了对log4net的严格依赖关系。只需传递字符串。同样,你不会需要整个logEntry.Level = Level.Warn.ToString();废话
  • 你的文件中的硬编码路径字符串。这现在不适用于其他开发人员的机器。
  • 在构造函数中进行堆栈检查 - 现在,您已经显着减缓了使用此类的所有类的构建,其中在启用内联的RELEASE模式下构建时会给出不同的结果。不要使用服务类,只需创建一个扩展方法或传入您希望记录器采用的对象作为参数来执行相同的操作。
  • 你的代码配置重写XML配置(我认为的优先顺序... log4net的的规则是模糊的 - 这就是很大的原因,我更喜欢NLOG)
  • SwitchOffLogTargets为什么!?只要更改配置文件,如果你想要的行为。配置文件可以随时定义它想要的任何目标并进行更改,但在这里,您只是假设它恰好具有某些内容。
+0

我打算抓这个,从简单的事情开始。感谢您对这种方法的有益回顾。 –

相关问题