2017-03-01 13 views
0

私の試みを書くこのポストから来ていません:log4netのは、sqliteのDBを作成しますが、それを定義してlog4netの使用する

log4net config SqLite in codeは私が(マイナス試験方法)が使用される静的クラスを持っている:

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

と私は私のHomeビューでActionResult方法でログメソッドを呼び出す:sqliteのDBはアプリので作成されている

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

     ... 

をdir、ただしログの書き込みは挿入されていません。私がデバッガを使って知る限り、何もエラーを投げていません。

私は、IISの「ユーザー」書き込み権限をdbディレクトリに与えることに関する他の記事を見てきましたが、明らかに作成する権限があります。

アイデア?

EDIT私はSqLiteAppenderの方法を変更して現在の作業条件を反映させました。まず、以下のアドバイスに基づいてappender.BufferSize = 1;を追加し、次に「メッセージ」フィールドに関連付けられたレイアウトを変更しました。なんらかの理由でLayout2RawLayoutAdapterのバージョンが元のバージョンよりもうまく機能します。

+0

log4netのトレース出力を有効にし、RepositoryAttributeが定義されていないと不平を言うのを見てください。その –

+0

RepositoryAttributeの設定は何も役に立たなかったか、それだけでは十分理解できません。私はスレッショルドレベルをAllに設定していますが、それでも何もしないようです –

+0

DBを作成するときとlog4netを設定するときの違いは接続文字列の違いです: 'FileInfo.Fullname'を使って作成しますが、設定時には 'dbFilename'文字列。あなたのlog4net接続文字列で '{dbFilename}'を '{dbFile.Fullname} 'に変更しようとする価値があります。 – Filburt

答えて

2

adoプロバイダには、同時に複数のメッセージを書き込むデフォルトのバッファがあります。

appender.BufferSize = 1; 

すべてのメッセージは直接書き込まれます。

+0

私は行方不明のように見えます!ありがとうございます –

+0

ロギングがたくさんある場合は、より大きなバッファでより良いパフォーマンスを得ることができます – Peter

関連する問題