NETCORE - 日志插件 Log4Net 写入数据库

无心々菜 / 2023-07-21 / 原文

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