私の試みを書くこのポストから来ていません: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
のバージョンが元のバージョンよりもうまく機能します。
log4netのトレース出力を有効にし、RepositoryAttributeが定義されていないと不平を言うのを見てください。その –
RepositoryAttributeの設定は何も役に立たなかったか、それだけでは十分理解できません。私はスレッショルドレベルをAllに設定していますが、それでも何もしないようです –
DBを作成するときとlog4netを設定するときの違いは接続文字列の違いです: 'FileInfo.Fullname'を使って作成しますが、設定時には 'dbFilename'文字列。あなたのlog4net接続文字列で '{dbFilename}'を '{dbFile.Fullname} 'に変更しようとする価値があります。 – Filburt