.NetMVC或者webApi使用日志插件 Log4Net 写入数据库 Mysql
·
网上资料太乱,反正对于web开发按照我的一步步操作就行
1.装一下这3个包

2. 在项目中增加 Configs 文件夹,内增加 Log4Net.config 配置文件,把这个复制进去
//能看懂就行,用的时候复制就行这是log4net官网地址Apache log4net – Apache log4net: Config Examples - Apache log4net
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!-- Define some output appenders -->
<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
<!-- value="logs/log.log"-->
<file value="logs/" />
<!--追加日志内容-->
<appendToFile value="true" />
<!--防止多线程时不能写Log,官方说线程非安全-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--可以为:Once|Size|Date|Composite-->
<!--Composite为Size和Date的组合-->
<rollingStyle value="Composite" />
<!--当备份文件时,为文件名加的后缀-->
<datePattern value="yyyyMMdd/"log.log"" />
<!--日志最大个数,都是最新的-->
<!--rollingStyle节点为Size时,只能有value个日志-->
<!--rollingStyle节点为Composite时,每天有value个日志-->
<maxSizeRollBackups value="20" />
<!--可用的单位:KB|MB|GB-->
<maximumFileSize value="3MB" />
<!--置为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>
<!-- error日志 -->
<appender name="errorAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Composite" />
<datePattern value="yyyyMMdd/"error.log"" />
<maxSizeRollBackups value="20" />
<maximumFileSize value="3MB" />
<staticLogFileName value="false" />
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<appender name="mysqlAppender" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
<bufferSize value="0" />
<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
<connectionString value="server=127.0.0.1;database=test_db;user=root;pwd=123456;SslMode=none" />
<commandText value="INSERT INTO logs(app_name,log_date, thread, `level`, logger, message, `exception`)VALUES(@app_name,@log_date, @thread,@log_level, @logger, @message, @exception);" />
<parameter>
<parameterName value="@app_name" />
<dbType value="String" />
<size value="100" />
<layout type="log4net.Layout.PatternLayout" >
<conversionPattern value="api" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="100" />
<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" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="1000" />
<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-->
<!--OFF:0-->
<!--FATAL:FATAL-->
<!--ERROR: ERROR,FATAL-->
<!--WARN: WARN,ERROR,FATAL-->
<!--INFO: INFO,WARN,ERROR,FATAL-->
<!--DEBUG: INFO,WARN,ERROR,FATAL-->
<!--ALL: DEBUG,INFO,WARN,ERROR,FATAL-->
<priority value="ALL"/>
<level value="INFO"/>
<!--使用上面配置的那个规则,ref指定上面的规则名称-->
<appender-ref ref="rollingAppender" />
<appender-ref ref="errorAppender" />
<appender-ref ref="mysqlAppender" />
</root>
</log4net>
这三个是对应的创建的3个附加器,ref=创建的附加器的名字,这样配置才有效
<appender-ref ref="rollingAppender" />
<appender-ref ref="errorAppender" />
<!--<appender-ref ref="mysqlAppender" />-->//你们可以先把数据库的给注释掉,先配置文件写入,如果不注释可能报错。
3.对于MVC或者webapi里的Program.cs
添加
builder.Logging.AddLog4Net("Configs/log4net.config");
//添加log4net日志,一般只要这一句就行
builder.Logging.AddLog4Net("Configs/log4net.config");
//这些我都没试试,小伙伴们可以试试
// 配置日志记录
builder.Logging.ClearProviders(); // 清除默认的提供者,如果你不想要它们的话
// 添加控制台输出提供者
builder.Logging.AddConsole();
// 为 "Microsoft" 和 "System" 设置最低日志级别为 Error
builder.Logging.AddFilter("Microsoft", LogLevel.Error);
builder.Logging.AddFilter("System", LogLevel.Error);
// 对于应用程序本身的日志,记录 Information 及以上级别的日志
builder.Logging.AddFilter("MyAppNamespace", LogLevel.Information);
//这个是总结把上边的总结一下
//对所有其他来源的日志,仅记录 Warning 和更高级别的日志
builder.Logging.AddFilter((category, logLevel) =>
{
if (category.StartsWith("Microsoft") || category.StartsWith("System"))
{
return logLevel >= LogLevel.Error;
}
else if (category.StartsWith("MyAppNamespace"))
{
return logLevel >= LogLevel.Information;
}
else
{
return logLevel >= LogLevel.Warning;
}
});
/*
在这个例子中,我们首先清除了默认的日志提供者(这步是可选的,取决于你是否需要默认的提供者)。然后添加了控制台输出提供者,并通过 AddFilter 方法设置了针对不同类别的日志记录规则。最后,我们定义了一个 lambda 表达式作为过滤逻辑,它根据日志类别动态地决定哪些日志应该被记录。
请注意,MyAppNamespace 应该替换为你自己的应用程序命名空间,以便正确应用日志级别到你的应用程序代码。这段代码确保了你的应用程序能够以一种有组织且有效的方式记录日志信息。*/
4.Controller里添加测试代码
如果是MVC
using Microsoft.AspNetCore.Mvc;
namespace TestLog4_.Controllers
{
public class ValuesController : Controller
{
private readonly ILogger<HomeController> _logger;
public ValuesController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
ViewData["Index"] = "TestLog4net";
_logger.LogInformation($"logger{GetType().FullName}-----info被构造");
_logger.LogError($"{GetType()},error,接口访问错误");
_logger.LogWarning($"{GetType().FullName}----TestWarning");
return View();
}
}
}
如果是Webapi
namespace SendFileStream.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly ILogger<ValuesController> LoggerValue;
public ValuesController(ILogger<ValuesController> logger)
{
this.LoggerValue = logger;
}
[HttpGet]
public string Get()
{
LoggerValue.LogInformation($"{this.GetType()},info,接口访问");
LoggerValue.LogError($"{this.GetType()},error,接口访问错误");
return "cc";
}
}
}
5.运行查看结果

6,数据库写入
<appender-ref ref="mysqlAppender" />去掉注释
创建一下,数据库名是test_db
CREATE TABLE `logs` (
`log_id` bigint NOT NULL AUTO_INCREMENT,
`app_name` varchar(100) NOT NULL,
`log_date` datetime NOT NULL,
`thread` varchar(100) NOT NULL,
`level` varchar(50) NOT NULL,
`logger` varchar(255) NOT NULL,
`message` varchar(1000) NOT NULL,
`exception` varchar(2000) NOT NULL,
PRIMARY KEY (`log_id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
7.运行一下成功了

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)