NETCORE - 日志插件 Log4Net 写入数据库
NETCORE - 日志插件 Log4Net 写入数据库
项目环境:.NET6 WebApi
1. 安装依赖包
Microsoft.Extensions.Logging.Log4Net.AspNetCore:6.1.0
2. 在项目中增加 Log4Net.config 配置文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <log4net debug="true"> <logger name="Logger"> <!--<priority value="ALL"/>--> <level value="ALL"/> <!--<appender-ref ref="AdoNetAppender" /> <appender-ref ref="MysqlAdoNetAppender" /> <appender-ref ref="AdoNetAppender_MySql" />--> <appender-ref ref="rollingAppender" /> <!--<appender-ref ref="EventLogAppender" />--> </logger> <!-- Define some output appenders --> <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"> <file value="log/" /> <!--追加日志内容--> <appendToFile value="true" /> <!--防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--可以为:Once|Size|Date|Composite--> <!--Composite为Size和Date的组合--> <rollingStyle value="Composite" /> <!--当备份文件时,为文件名加的后缀--> <datePattern value="yyyyMMdd'.txt'" /> <!--日志最大个数,都是最新的--> <!--rollingStyle节点为Size时,只能有value个日志--> <!--rollingStyle节点为Composite时,每天有value个日志--> <maxSizeRollBackups value="3" /> <!--可用的单位:KB|MB|GB--> <maximumFileSize value="2MB" /> <!--置为true,当前最新日志文件名永远为file节中的名字--> <staticLogFileName value="false" /> <!--输出级别在INFO和ERROR之间的日志--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ALL" /> <param name="LevelMax" value="FATAL" /> </filter> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/> </layout> </appender> <!--写入到sqlite数据库--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <!--缓冲区事件的大小,设置为小于或者等于1的值,则不会发生任何缓冲,日志记录同步执行,否则事件将被缓冲--> <bufferSize value="1" /> <!--数据库类型--> <connectionType value="System.Data.SQLite.SQLiteConnection,System.Data.SQLite" /> <!--数据库地址--> <connectionString value="Data Source=~/log.db;Version=3;" /> <!--写入日志语句--> <commandText value="INSERT INTO Log(Date, Level, Logger, Message) VALUES (@Date, @Level, @Logger, @Message)" /> <parameter> <!--配置字段--> <parameterName value="@Date" /> <!--字段数据类型--> <dbType value="DateTime" /> <!--北京时间--> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@Level" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@Logger" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@Message" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> <!--写入到mysql数据库--> <appender name="MysqlAdoNetAppender" type="log4net.Appender.AdoNetAppender"> <!--缓冲区事件的大小,设置为小于或者等于1的值,则不会发生任何缓冲,日志记录同步执行,否则事件将被缓冲--> <bufferSize value="1" /> <!--数据库类型--> <connectionType value="MySql.Data.MySqlClient.MySqlConnection,MySql.Data" /> <!--数据库地址--> <connectionString value="server=192.168.1.188;port=3306;database=enav;uid=root;pwd=root;" /> <!--写入日志语句--> <commandText value="INSERT INTO lognet(`Date`, `Level`, `Logger`, `Message`) VALUES (@date, @level, @logger, @message)" /> <parameter> <!--配置字段--> <parameterName value="@date" /> <!--字段数据类型--> <dbType value="DateTime" /> <!--北京时间--> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@level" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> <appender name="AdoNetAppender_MySql" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/> <param name="ConnectionString" value="server=192.168.1.188;port=3306;database=enav;uid=root;pwd=root"/> <commandText value="INSERT INTO loggermall (`log_thread`,`log_level`,`log_logger`,`log_message`) VALUES (@log_thread,@log_level,@log_logger,@log_message)" /> <parameter> <parameterName value="@log_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="%-5level"/> </layout> </parameter> <parameter> <parameterName value="@log_logger"/> <dbType value="String"/> <size value="50"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger"/> </layout> </parameter> <parameter> <parameterName value="@log_message"/> <dbType value="String"/> <size value="4000"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message"/> </layout> </parameter> </appender> <!--写入到windows日志中--> <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL --> <!--<root> </root>--> </log4net> </configuration>
3. 增加日志类 Log4NetHelper.cs
using log4net; using log4net.Config; using log4net.Repository; using System.ComponentModel; namespace SendFileStream.Common { public class Log4NetHelper { //控制台应用程序加上以下代码 private static ILoggerRepository repository { get; set; } private static ILog _log; private static ILog log { get { if (_log == null) { Configure(); } return _log; } } public static void Configure(string repositoryName = "LogFileAppender", string configFile = "log4net.config") { //控制台应用程序加上以下两句代码 repository = LogManager.CreateRepository(repositoryName); XmlConfigurator.Configure(repository, new FileInfo(configFile)); _log = LogManager.GetLogger(repositoryName, "Logger"); } /// <summary> /// 调用Log4Net写日志,日志等级为:错误(Error) /// </summary> /// <param name="logContent">日志内容</param> public static void WriteLog(string logContent) { WriteLog(null, logContent, Log4NetLevel.Error); } /// <summary> /// 调用Log4Net写日志 /// </summary> /// <param name="logContent">日志内容</param> /// <param name="log4NetLevel">日志等级,枚举类型</param> public static void WriteLog(string logContent, Log4NetLevel log4NetLevel) { WriteLog(null, logContent, log4NetLevel); } /// <summary> /// 调用Log4Net写日志 /// </summary> /// <param name="type">类的类型,指定日志中错误的具体类。例如:typeof(Index),Index是类名,如果为空表示不指定类</param> /// <param name="logContent">日志内容</param> /// <param name="log4NetLevel">日志等级,枚举类型</param> public static void WriteLog(Type type, string logContent, Log4NetLevel log4NetLevel) { switch (log4NetLevel) { case Log4NetLevel.Warn: log.Warn(logContent); break; case Log4NetLevel.Debug: log.Debug(logContent); break; case Log4NetLevel.Info: log.Info(logContent); break; case Log4NetLevel.Fatal: log.Fatal(logContent); break; case Log4NetLevel.Error: log.Error(logContent); break; } } public static void Info(string msg) { log.Info(msg); } } public enum Log4NetLevel { [Description("警告信息")] Warn = 1, [Description("调试信息")] Debug = 2, [Description("一般信息")] Info = 3, [Description("严重错误")] Fatal = 4, [Description("错误日志")] Error } }
4.
参考:https://blog.csdn.net/yhj198927/article/details/122238931