C#使用log4net结合sqlite数据库实现记录日志
目录
- 0 前言
- 1 安装包
- 2 下载SQLite
- 3 Sqlite常用命令
- 4 创建日志相关基本表
- 5 log4net配置
- 6 日志记录
- 7 使用C#程序查询sqlite
- 8 实时显示日志
0 前言
为什么要把日志存到数据库里?
因为结构化的数据库存储的日志信息,可以写专门的软件读取历史日志信息,通过各种条件筛选,可操作性极大增强,有这方面需求的开发人员可以考虑。
为什么选择SQLite?
轻量级数据库,免安装,数据库的常用的基本功能都有,可以随程序迁移到不同的电脑上使用。
1 安装包
两个包:
- log4net
- System.Data.SQLite
第二个包也可以使用Microsoft.Data.Sqlite
,查到的资料显示如果环境使用的是 .NET Core 或 .NET 5+,建议使用Microsoft.Data.Sqlite
。但是我并没有测试第二个包,可能使用上有区别YtjtfKbvu。
2 下载Sqlite
如果本地没有sqlite环境的话,需要先下载。官网下载链接
进去之后直接找各自环境对应的版本,如果是Windows环境的话,直接下载下图中标记的tool,中间那个下载链接是下载sqlite3.dll
,不过我并不清楚如何使用,有知道的大佬可以在评论区交流一下。
tool解压之后有如下几个文件,双击打开sqlite3.exe即可。
3 Sqlite常用命令
打开是一个命令行界面,可以使用.help查看常用的命令及解释。
.help
创建数据库文件使用.open xxx
,这条语句,如果发现数据库文件存在,就会直接打开,如果不存在,就会先创建再打开。
.open test.db
在目录内可以看到创建的数据库文件。(划重点,这个文件拷到程序中就可以直接使用sqlite数据库,充分体现了轻量级的魅力)
.databases
可以查询所有数据库文件
.tables
可以查询所有表(我还未创建,所以目前还没有表)
sql语句请自行查询相关资料。
查询的数据以标准格式显示。
.header on .mode column SELECT * FROM COMPANY;
当然sqlite也有可视化的软件,但是我目前没用到,所以没有下载安装,需要的话可以自行查询。
4 创建日志相关基本表
使用命令创建日志表,包含id(使用自增,当然可以换成uuid或者其它形式)、日期、线程号、级别(info、error这些)、记录者、具体记录的信息、异常信息。具体内容要对应log4net的配置。
CREATE TABLE Log ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Date DATETIME, Thread VARCHAR(255), Level VARCHAR(50), Logger VARCHAR(255), Message TEXT, Exception TEXT );
5 log4net配置
更换数据库连接。sql语句的内容一定要对应数据库基本表的字段。
<configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <connectionType value="System.Data.SQLite.SQLiteConjsnection, System.Data.SQLite" /> <connectionString value="Data Source=./database/logs.db;Version=3;" /> <commandText value="INSERT INTO Log (Date, Thread, Level, Logger, Message, Exception) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value="@log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /&gjst; <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value=php"4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender> <root> <level value="ALL" /> <appender-ref ref="AdoNetAppender" /> </root> </log4net> </configuration>
6 日志记录
把生成的db文件拷到程序里,这个文件就是记录文件的数据库了,其它的都不重要。当然,如果想查看数据库的话,也可以把sqlite3.exe拷过来。
读取log4net的配置建议写在AssemblyInfo.cs,这样程序启动时会默认加载配置文件。
//Log4net配置[assembly: log4net.Config.XMLConfigurator(ConfigFile = "log4net.config", Watch = true)]
具体程序如下:
private static readonly ILog log = LogManager.GetLogger(typeof(Form1)); log.Info("这是一条info语句"); log.Warn("这是一条warn语句"); log.Error("这是一条错误语句", new Exception("测试异常"));
查看日志是否正常写入数据库。
7 使用C#程序查询sqlite
程序如下(不过感觉GetString(index)这种方式有点别扭吧,有没有GetString(key)的这种形式,欢迎大佬们补充)
// 构建连接字符串 string connectionString = "Data Source=./database/SoftWareBaseLog.db;Version=3;"; // 创建 SQLite 连接 using (var connection = new SQLiteConnection(connectionString)) { connection.Open(); // 创建 SQL 命令 string sql = "SELECT Message FROM Log where Level='ERROR'"; using (var command = new SQLiteCommand(sql, connection)) { // 执行命令并读取数据 using (var reader = command.ExecuteReader()) { while (reader.Read()) { www.devze.com string msg = reader.GetString(0); Console.WriteLine(msg); } } } }
8 实时显示日志
现在所有日志都写到数据库里了,那要是还想实时显示到界面上,当然也有很多方式实现,不过我这里建议实时显示可以使用log4net的自有功能。
比如我想使用winform中的listbox来实时显示日志,可以建立一个Appender(附加),继承于log4net的AppenderSkeleton
,这是一个抽象类,有一个抽象方法。
具体的,可以参考以下程序,这里会显示所有的日志,如果需要过滤的话,可以在这个基础上改。另外,一定一定一定要给this.Layout赋值,这是日志在界面上的显示方式,如果没有写的话,就会收获一个报错:“A layout must be set”,去网上搜这条内容,不一定能找到解决方案。
public class ListBoxAppender : AppenderSkeleton { private ListBox _ListBox; public ListBoxAppender(ListBox box) { _ListBox = box; this.Layout = new PatternLayout("%date [%thread] %-5level %logger - %message%newline"); } protected override void Append(LoggingEvent loggingEvent) { // 获取日志信息 string logMessage = RenderLoggingEvent(loggingEvent); // 更新 UI 控件 if (_ListBox.InvokeRequired) { _ListBox.Invoke(new Action(() => AppendText(logMessage))); } else { AppendText(logMessage); } } private void AppendText(string text) { _ListBox.Items.Add(text); } }
只需要给log4net配置一次就可以使用,这样,每次调用日志记录,界面上的lbxLog控件就可以一直显示最新的日志信息。
// 添加自定义 Appender var listBoxAppender = new ListBoxAppender(lbxLog); log4net.Config.BasicConfigurator.Configure(listBoxAppender);
但是,我并不建议使用log4net直接操作控件显示日志信息,在多线程短时间写较多日志的情况下,可能会导致软件卡死,更佳的方式是增加缓存机制。
以上就是C#使用log4net结合sqlite数据库实现记录日志的详细内容,更多关于C# log4net结合sqlite记录日志的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论