zoukankan      html  css  js  c++  java
  • 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文件夹,生成对应时间的 日志文件

    数据库

     

  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/licm/p/11872229.html
Copyright © 2011-2022 走看看