log4net创建sqlite db但不写入它

时间:2017-03-01 19:30:11

标签: c# sqlite log4net

我尝试将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();
                }
            }
        }
    }
}

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

        ...

正在应用程序的App_Data目录中创建sqlite数据库,但没有插入任何日志写入。据我所知,使用调试器时没有任何错误。

我已经看过有关向IIS用户提供的其他帖子。将权限写入db目录但显然有创建权限。

想法?

编辑我修改了SqLiteAppender方法以反映当前的工作条件。首先,根据下面的建议,我添加了appender.BufferSize = 1;,然后我更改了与"消息相关联的布局"领域。出于某种原因,Layout2RawLayoutAdapter版本比我原来的版本效果更好。

1 个答案:

答案 0 :(得分:2)

ado提供程序有一个默认缓冲区,可以同时写入多条消息。您可以使用以下命令更改缓冲区:

appender.BufferSize = 1;

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