2017-03-01 5 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 방법의 로깅 방법 전화 :

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는 DB를이 응용 프로그램의 012,376에서 작성 중입니다dir하지만 로그 쓰기가 삽입되지 않습니다. 디버거를 사용하여 알 수있는 한 오류를 던지지 않습니다.

저는 IIS의 '사용자'가 db 디렉토리에 perm perm을 쓰는 것에 대한 다른 글을 보았습니다 만, 분명히 생성 할 수있는 perm이 있습니다.

아이디어가 있으십니까?

편집 나는 현재 작업 조건을 반영하여 SqLiteAppender 방법을 변경했습니다. 첫째, 아래의 조언에 따라 appender.BufferSize = 1;을 추가 한 다음 "메시지"필드와 연결된 레이아웃을 변경했습니다. 웬일인지 Layout2RawLayoutAdapter 버전은 내가 원래 가지고 있었던 것보다 잘 작동한다.

+0

log4net의 추적 출력이 활성화되어 있고 정의되지 않은 RepositoryAttribute에 대해 불평하는 것을보십시오. –

+0

RepositoryAttribute 설정이 아무런 도움이되지 않았거나 잘 이해하지 못한다. 나는 임계 값 레벨을 모두로 설정하고 아무 것도하지 않는 것 같습니다 –

+0

DB를 만들 때와 log4net을 설정할 때 연결 문자열의 차이점을주의해야합니다 :'FileInfo.Fullname'을 사용하여 만들지 만 사용하십시오 설정시'dbFilename' 문자열. log4net 연결 문자열에서'{dbFilename}'을'{dbFile.Fullname} '으로 변경해 볼 가치가 있습니다. – Filburt

답변

2

ado 공급자에는 여러 메시지를 동시에 작성하는 기본 버퍼가 있습니다. 다음을 사용하여 버퍼를 변경할 수 있습니다.

appender.BufferSize = 1; 

그러면 모든 메시지가 직접 기록됩니다.

+0

내가 놓친 것처럼 보입니다! 고맙습니다. –

+0

로깅이 많으면 더 큰 버퍼로 더 나은 성능을 얻습니다. – Peter