一、首先在项目中添加log4net的引用,这里不再展示
二、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>
三、Log4NetHelper.cs
using log4net;
using log4net.Config;
using log4net.Repository;
using System;
using System.ComponentModel;
using System.IO;
namespace Producer
{
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
}
}
四、Program.cs
1.控制台应用程序
using System;
namespace Producer
{
class Program
{
static void Main(string[] args)
{
//将log4net在项目中启用
Log4NetHelper.Configure();
Console.ReadKey();
}
}
}
2.Web应用程序,在Startup.cs中添加
在Startup.cs中添加如下属性:
public static ILoggerRepository repository { get; set; }
在Startup构造函数中添加如下代码:
public Startup(IConfiguration configuration)
{
....原代码....
repository = LogManager.CreateRepository("repositoryName");
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
}
在Controller或者其他地方调用时采用以下方法,以下以HomeController为例:
public class HomeController : Controller
{
private ILog log;
public HomeController()
{
log = LogManager.GetLogger(Startup.repository.Name, typeof(HomeController));
}
public IActionResult Index()
{
log.Info("进入HomeController的Index方法");
return View();
}
}
3.Web应用程序,在Program.cs中添加
public class Program{
public static void Main(string[] args){
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)=>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logger=>logger.AddLog4Net("log4net.config"))
//使用ini作为配置文件
.ConfigureAppConfiguration((hostingContext,config)=>{
config.Sources.Clear();
config.AddIniFile("Config.ini",optional:false,reloadOnChange:true);
})
.ConfigureWebHostDefaults(webBuilder=>{
webBuilder.UseStartUp<StartUp>();
})
}
在Controller或者其他地方调用时采用以下方法,以下以HomeController为例:
public class HomeController : Controller
{
private readonly ILogger<HomeCntroller> _logger;
public HomeController(ILogger<HomeCntroller> logger)
{
_logger = logger;
}
public IActionResult Index()
{
//第一种
_logger.Log(LogLeval.Informstion,"进入HomeController的Index方法");
//第二种
_logger.LogInformation("进入HomeController的Index方法");
return View();
}
}