2017-03-01 41 views
0

我试图与定义使用log4net的来自于这个帖子:log4net config SqLite in codelog4net的创建sqlite的分贝,但不写它

我那里使用静态类(减去测试方法):

namespace My_App.Logging { 
    public class SqLiteLogging { 
     public static class SqLiteAppender { 
      public static IAppender GetSqliteAppender(string dbFilename) { 
       var dbFile = new FileInfo(dbFilename); 

       if (!dbFile.Exists) { 
        CreateLogDb(dbFile); 
       } 

       var appender = new AdoNetAppender { 
        ConnectionType = "System.Data.SQLite.SQLiteConnection, System.Data.SQLite", 
        ConnectionString = $"Data Source={dbFilename};Version=3;", 
        CommandText = 
         "INSERT INTO Log (Date, Level, Logger, Message) VALUES (@Date, @Level, @Logger, @Message)" 
       }; 

       appender.AddParameter(new AdoNetAppenderParameter { 
        ParameterName = "@Date", 
        DbType = DbType.DateTime, 
        Layout = new RawTimeStampLayout() 
       }); 

       appender.AddParameter(new AdoNetAppenderParameter { 
        ParameterName = "@Level", 
        DbType = DbType.String, 
        Layout = new Layout2RawLayoutAdapter(new PatternLayout("%level")) 
       }); 

       appender.AddParameter(new AdoNetAppenderParameter { 
        ParameterName = "@Logger", 
        DbType = DbType.String, 
        Layout = new Layout2RawLayoutAdapter(new PatternLayout("%logger")) 
       }); 

       appender.AddParameter(new AdoNetAppenderParameter { 
        ParameterName = "@Message", 
        DbType = DbType.String, 
        Layout = new Layout2RawLayoutAdapter(new PatternLayout("%message")) 
       }); 

       appender.Threshold = log4net.Core.Level.All; 
       appender.BufferSize = 1; 

       appender.ActivateOptions(); 

       return appender; 
      } 

      public static void CreateLogDb(FileInfo file) { 
       using (var conn = new SQLiteConnection()) { 
        conn.ConnectionString = $"Data Source={file.FullName};New=True;Compress=True;Synchronous=Off"; 
        conn.Open(); 

        using (var cmd = conn.CreateCommand()) { 
         cmd.CommandText = @" 
CREATE TABLE IF NOT EXISTS Log(
    LogId  INTEGER PRIMARY KEY, 
    Date  DATETIME NOT NULL, 
    Level  VARCHAR(50) NOT NULL, 
    Logger VARCHAR(255) NOT NULL, 
    Message TEXT DEFAULT NULL 
); 
"; 

         cmd.ExecuteNonQuery(); 
        } 

        conn.Close(); 
       } 
      } 
     } 
    } 
} 

我呼吁在ActionResult法测井方法在我Home观点:

namespace My_App.Controllers { 
    public class HomeController : Controller { 
     private static ILog _log; 

     public ActionResult Index() { 
      var dbFile = AppDomain.CurrentDomain.GetData("DataDirectory") + "/log4net.sqlite"; 
      BasicConfigurator.Configure(SqLiteLogging.SqLiteAppender.GetSqliteAppender(dbFile)); 
      _log = LogManager.GetLogger(typeof(HomeController)); 
      _log.Info("Hello there"); 
      return View(); 
     } 

     ... 

在应用程序的创建SQLite的分贝dir但是没有插入任何日志写入。据我所知,使用调试器,没有什么是抛出错误。

我见过有关给IIS'用户'写数据库的db目录的其他文章,但它显然有创建的权限。

想法?

编辑我修改了SqLiteAppender方法以反映当前的工作条件。首先,根据以下建议,我添加了appender.BufferSize = 1;,然后我更改了与“消息”字段关联的布局。由于某些原因,Layout2RawLayoutAdapter版本比我原来的版本更好。

+0

为log4net启用跟踪输出,并看到它抱怨没有定义RepositoryAttribute。将尝试 –

+0

设置RepositoryAttribute没有任何用处,或者我不明白这一点。我将阈值级别设置为All,但似乎也没有做任何事 –

+0

有一点需要注意的是,在创建数据库和配置log4net时,连接字符串的区别在于:您可以使用“FileInfo.Fullname”创建,但只能使用配置时的'dbFilename'字符串。可能值得尝试在log4net连接字符串中将'{dbFilename}'更改为'{dbFile.Fullname}'。 – Filburt

回答

2

ado提供程序有一个默认的缓冲区来同时写入多个消息。您可以更改缓冲区:

appender.BufferSize = 1; 

然后所有消息都会直接写入。

+0

这看起来像我失踪了!谢谢 –

+0

如果你有很多的日志记录,那么你可以用更大的缓冲区获得更好的性能 – Peter