webapi 中 使用log4net 日志记录到数据库中

1. 安装三个nuget包

 

 2. 创建 log4net.config 文件 ,选中 文件鼠标右键,选择属性->复制到输出目录 修改为 始终复制

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <!-- Debug日志 -->
    <appender name="RollingFileDebug" type="log4net.Appender.RollingFileAppender" >
        <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
        <file value="logs\\" />
        <!-- 日志文件的命名规则 -->
        <datePattern value="yyyy-MM-dd/'Debug.log'"/>
        <!-- 将日志信息追加到已有的日志文件中-->
        <appendToFile value="true" />
     <!--可为:Once,Size,Date,Composite-->
     <!--Composite为size和date的组合--> <rollingStyle value="Size" />
     <!--日志最大个数,都是最新的-->
     <!--rollingstyle为size时,只能有value个日志-->
     <!--rollingstyle为composite是,每天有value个日志-->
        <maxSizeRollBackups value="100" />
        <maximumFileSize value="3MB" />
        <!-- 指定按日期切分日志文件 -->
        <rollingStyle value="Date"/>
        <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
        <staticLogFileName value="false" />
        <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%newline%newline【日志时间】: %d  【线程ID】: %thread    %newline【日志级别】: %-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="Debug" />
            <param name="LevelMax" value="Debug" />
        </filter>
    </appender>

    <!-- Info日志 -->
    <appender name="RollingFileInfo" type="log4net.Appender.RollingFileAppender" >
        <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
        <file value="logs\\" />
        <!-- 日志文件的命名规则 -->
        <datePattern value="yyyy-MM-dd/'Info.log'"/>
        <!-- 将日志信息追加到已有的日志文件中-->
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="100" />
        <maximumFileSize value="3MB" />
        <!-- 指定按日期切分日志文件 -->
        <rollingStyle value="Date"/>
        <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
        <staticLogFileName value="false" />
        <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="Info" />
            <param name="LevelMax" value="Info" />
        </filter>
    </appender>

    <!-- WARN日志 -->
    <appender name="RollingFileWarn" type="log4net.Appender.RollingFileAppender" >
        <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
        <file value="logs\\" />
        <!-- 日志文件的命名规则 -->
        <datePattern value="yyyy-MM-dd/'Warn.log'"/>
        <!-- 将日志信息追加到已有的日志文件中-->
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="100" />
        <maximumFileSize value="3MB" />
        <!-- 指定按日期切分日志文件 -->
        <rollingStyle value="Date"/>
        <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
        <staticLogFileName value="false" />
        <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="Warn" />
            <param name="LevelMax" value="Warn" />
        </filter>
    </appender>

    <!-- Error日志 -->
    <appender name="RollingFileError" type="log4net.Appender.RollingFileAppender" >
        <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
        <file value="logs\\" />
        <!-- 日志文件的命名规则 -->
        <datePattern value="yyyy-MM-dd/'Error.log'"/>
        <!-- 将日志信息追加到已有的日志文件中-->
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="100" />
        <maximumFileSize value="3MB" />
        <!-- 指定按日期切分日志文件 -->
        <rollingStyle value="Date"/>
        <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
        <staticLogFileName value="false" />
        <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="Error" />
            <param name="LevelMax" value="Error" />
        </filter>

    </appender>

    <!-- Fatal日志 -->
    <appender name="RollingFileFatal" type="log4net.Appender.RollingFileAppender" >
        <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
        <file value="logs\\" />
        <!-- 日志文件的命名规则 -->
        <datePattern value="yyyy-MM-dd/'Fatal.log'"/>
        <!-- 将日志信息追加到已有的日志文件中-->
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="100" />
        <maximumFileSize value="3MB" />
        <!-- 指定按日期切分日志文件 -->
        <rollingStyle value="Date"/>
        <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
        <staticLogFileName value="false" />
        <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="Fatal" />
            <param name="LevelMax" value="Fatal" />
        </filter>
    </appender>

    <!--数据库配置-->
    <appender name="logAppender_SqlServer" type="log4net.Appender.ADONetAppender">
        <bufferSize value="0"/>
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        <!--链接数据库配置-->
        <connectionString value="Data Source=.;Initial Catalog=WebApiOne;User ID=sa;Password=123456;"/>
        <commandText value="INSERT INTO LogData ([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="50"/>
            <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="200"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%logger"/>
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@message"/>
            <dbType value="String"/>
            <size value="2000"/>
            <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>
        <!--控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 如果没有定义LEVEL的值,则缺省为DEBUG-->
        <appender-ref ref="RollingFileDebug" />
        <appender-ref ref="RollingFileInfo" />
        <appender-ref ref="RollingFileWarn" />
        <appender-ref ref="RollingFileError" />
        <appender-ref ref="RollingFileFatal" />
        <appender-ref ref="logAppender_SqlServer" />
        <level value="DEBUG" />

    </root>

</log4net>

3. 在 Program.cs 中添加如下配置

//log4net
builder.Logging.AddLog4Net("CfgFile/log4net.config");
log4net.Config.XmlConfigurator.Configure();

4. 在 WebApiOne 数据库中创建 LogData 表, 并添加下面的几个字段,数据类型依次是: 第一个是datatime,后面都是string

Date,Thread,Level,Logger,Message,Exception 


5. 使用 

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WEBAPI.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class LoginController : ControllerBase
    {
        private readonly ILogger<LoginController> _logger;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="logger"></param>
        public LoginController(ILogger<LoginController> logger)
        {
            _logger = logger;
            _logger.LogInformation($"{this.GetType()},info,接口访问Info");
            _logger.LogDebug($"{this.GetType()},debugger,接口访问Debugger");
            _logger.LogWarning($"{this.GetType()},warning,接口访Warning");
            _logger.LogError($"{this.GetType()},error,接口访问Error");
        }

        [HttpPost]
        public string Login()
        {
            return "sssssssss";
        }
    }
}

6. 查看: 

 

 



posted @ 2024-06-03 17:17  龙卷风吹毁停车场  阅读(214)  评论(0)    收藏  举报