配置文件(根目录下创建文件夹并添加配置文件 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".log"" /> <!--按照何种方式产生多个日志文件(日期[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文件夹,生成对应时间的 日志文件
数据库