log4net的使用

配置文件(根目录下创建文件夹并添加配置文件  Config/log4net.config  )

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <!--定义输出到文件中-->
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
    <!--设置日志存储路径-->
    <param name="File" value="log/" />
    <!--是否追加到文件-->
    <param name="AppendToFile" value="true" />
    <!--配置追加程序以使用最小锁定模型,该模型允许多个进程写入同一文件。-->
    <lockingModel type = " log4net.Appender.FileAppender + MinimalLock" />
    <!--配置附加程序以使用“进程间”锁定模型。-->
    <!--<lockingModel type = " log4net.Appender.FileAppender + InterProcessLock" />-->
    <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
    <param name="MaxSizeRollBackups" value="100" />
    <param name="MaxFileSize" value="1024" />
    <!--是否只写到一个文件中-->
    <param name="StaticLogFileName" value="false" />
    <!--这是按日期产生文件夹,并在文件名前也加上日期-->
    <param name="DatePattern" value="yyyy/MM/dd&quot;.log&quot;" />
    <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
    <param name="RollingStyle" value="Date" />

    <layout type="log4net.Layout.PatternLayout">
      <!-- ConversionPattern 解释
          %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
          %n(new line):換行
          %d(datetime):输出当前语句运行的时刻
          %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
          %t(thread id):当前语句所在的线程ID
          %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
          %c(class):当前日志对象的名称
          %L:输出语句所在的行号
          %F:输出语句所在的文件名
          %-数字:表示该项的最小长度,如果不够,则用空格填充
        -->
      <param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异常位置:[%thread] (%file:%line) %n消息描述:%message%n异常:%exception%n%n " />
    </layout>
    <lockingmodel type="log4net.appender.fileappender+minimallock" />
    <filter type="log4net.Filter.LevelRangeFilter">
      <!--OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->
      <!-- Off 所有的写入方法都不写到日志里
             FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。
             ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。
              WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。
             INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。
             DEBUG (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。
             ALL所有的写入方法都写到日志里
        -->
      <param name="LevelMax" value="FATAL" />
      <!--只有等级在LevelMax和LevelMin之间(或等于LevelMax、LevelMin)的日志等级才会被记录-->
      <param name="LevelMin" value="INFO" />
    </filter>
  </appender>
  <!--定义输出到控制台命令行中 -->
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />-->
      <conversionPattern value="%n异常时间:%d [%t] %n异常级别:%-5p %n异常位置:[%thread] (%file:%line) %n消息描述:%message%n异常:%exception%n%n "/>
    </layout>
  </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>

  <!--定义输出到数据库-->
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <!--缓存区大小(缓冲区为n条日志的时候,开始写入数据库)调试时,建议写 1-->
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <!--数据库连接字符串--> <connectionString value="data source=.;initial catalog=TestDataBase;integrated security=false;persist security info=True;User ID=sa;Password=123456" /> <commandText value="INSERT INTO Log ([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="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="%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="4000" /> <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> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMax" value="FATAL" /> <!--只有等级在LevelMax和LevelMin之间(或等于LevelMax、LevelMin)的日志等级才会被记录--> <param name="LevelMin" value="INFO" /> </filter> </appender> <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。--> <root> <!--文件形式记录日志--> <appender-ref ref="LogFileAppender" /> <!--控制台控制显示日志--> <appender-ref ref="ConsoleAppender" /> <!--Windows事件日志--> <appender-ref ref="EventLogAppender" /> <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉--> <appender-ref ref="AdoNetAppender" /> </root> </log4net>

创建数据库的SQL语句

CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)

  

一、ASP.NET MVC中使用

1)、添加程序包引用

2)、 初始化配置文件

  在Global.asax文件中

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            FileInfo fileInfo = new FileInfo(Server.MapPath("Config/log4net.config"));
            // 初始化配置配置文件
            log4net.Config.XmlConfigurator.Configure(fileInfo);

          
        }

3)、使用(可封装一个 LogHelper 类 )

 public ActionResult Index()
        {
      ILog logWriter = LogManager.GetLogger("logger");//logger就相当于一个key标识,相同的key会返回相同的对象,反之 try { int a = 0; int b = 1; int c = b / a; } catch (Exception ex) {   logWriter.Error(ex.Message, ex);//写入日志    { }

 二、NetCore 中的使用

  1)、安装程序包  Microsoft.Extensions.Logging.Log4Net

 ·2)、注册log4net服务

  在Program类中

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging((logging) =>
                {
                    //作用是过滤掉System和Microsoft开头的命名空间下的组件产生的警告级别一下的日志,实际上主要就是一些框架性日志
                    logging.AddFilter("System", LogLevel.Warning);//忽略系统日志
                    logging.AddFilter("Microsoft", LogLevel.Warning);//忽略系统日志

                    logging.AddLog4Net("Config/log4net.config");//指定log4net配置文件(注册log4net中间件)
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

  3)、使用

public class HomeController : Controller
    {
        //通过构造函数依赖注入
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public JsonResult Test()
        {
            try
            {
                int a = 0;
                int b = 1;
                int c = b / a;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);//写入日志
            }
            return new JsonResult(new
            {
                status = true
            });
        }
  }

  

在项目文件夹中,找到log文件夹,生成对应时间的 日志文件

数据库

 

原文地址:https://www.cnblogs.com/licm/p/11872229.html