내 시도를 쓰기이 게시물에서 제공하지 않습니다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
버전은 내가 원래 가지고 있었던 것보다 잘 작동한다.
log4net의 추적 출력이 활성화되어 있고 정의되지 않은 RepositoryAttribute에 대해 불평하는 것을보십시오. –
RepositoryAttribute 설정이 아무런 도움이되지 않았거나 잘 이해하지 못한다. 나는 임계 값 레벨을 모두로 설정하고 아무 것도하지 않는 것 같습니다 –
DB를 만들 때와 log4net을 설정할 때 연결 문자열의 차이점을주의해야합니다 :'FileInfo.Fullname'을 사용하여 만들지 만 사용하십시오 설정시'dbFilename' 문자열. log4net 연결 문자열에서'{dbFilename}'을'{dbFile.Fullname} '으로 변경해 볼 가치가 있습니다. – Filburt