.Net Core使用log4net

一、首先在项目中添加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();
        }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值