一. Log4Net介绍
Log4net是以Java中的Log4j转移来的一个.Net版的开源系统日志架构,它的功用很强劲,可以将日志分为不一样的级别,以不一样的格式輸出到不一样的存储介质中,例如:数据库查询、txt文件、内存缓冲区、电子邮件、控制面板、ANSI终端设备、远程控制协调器这些,大家在这里具体讲解最经常使用的二种:txt文件和数据库查询。
(PS:其他的存储介质详见
http://logging.apache.org/log4net/release/config-examples.html)
Log4net将日志分为五个等级,分别是: FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息),每一个等级都相应着一组轻载方式开展启用。
官方网站详细地址:
http://logging.apache.org/log4net/index.html
Nuget地址:
https://www.nuget.org/packages/log4net/
Nuget安裝:Install-Package log4net
最新版:2.0.8 (2018-08-09)
这节关键围绕着2个关键的存储介质:【txt文件】和【SQLServer数据库查询】进行,包含的知识要点有:
①. 基本上的应用流程。
②. 复位关系环境变量的多种方式。
③. 编码启用详细说明。
④. 环境变量详细说明。
⑤. 简易的封装形式与在MVC框架中的启用。
二. 基本上应用流程
大家先以控制台程序为例子,简易详细介绍Log4net储存日志到txt文本文本文档中,后边在做源代码的详细说明。
1. 新创建01-SimpleDemo控制台程序,根据命令 【Install-Package log4net】安裝相对应程序流程集。
Net如何配备log4net(log4net配置详细说明)
2. 在默认设置环境变量中App.config(B/S程序流程则为web.config)中开展配备,关键分二块:
A. 在<configuration></configuration>连接点下新增加连接点下新增加(要在其最顶端):
<configSections>
<section name = “log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler,log4net” />
</configSections>
B. 在<configuration></configuration>根节点下,配备log4net的关键配备编码, 关键连接点如下所示:
<log4net> <appender> </appender> <root></root> </log4net>
详尽编码如下所示:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!-- 1. 加上log4net的连接点申明配备编码--> 4 <configSections> 5 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 6 </configSections> 7 <!--2. log4net的关键配备编码--> 8 <log4net> 9 <!--把日志信息内容輸出到以日期取名的资料里--> 10 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 11 <!--文件夹名称的部位--> 12 <file value="D:\MyLog1\" /> 13 <appendToFile value="true" /> 14 <!--动态性形成文件夹名称--> 15 <param name="StaticLogFileName" value="false" /> 16 <!--以日期取名--> 17 <param name="DatePattern" value="yyyyMMdd".log"" /> 18 <rollingStyle value="Date" /> 19 <!--日志在日志文档中的布置 *** --> 20 <layout type="log4net.Layout.PatternLayout"> 21 <conversionPattern value="%newline %n记录:�te %n线程ID:[%thread] %n日志等级: %-5level %n出差错类:%logger property: [%property{NDC}] - %n不正确叙述:%message%newline %n"/> 22 </layout> 23 <!--应用最少锁住实体模型(minimal locking model),以容许好几个过程可以载入同一个文档 --> 24 <lockingModel type="log4net.Appender.FileAppender MinimalLock" /> 25 </appender> 26 <root> 27 <level value="ALL"></level> 28 <appender-ref ref="RollingFileAppender"></appender-ref> 29 </root> 30 </log4net> 31 <startup> 32 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" /> 33 </startup> 34 </configuration>
3. 编码启用
1 log4net.Config.XmlConfigurator.Configure; 2 ILog log = LogManager.GetLogger("test"); 3 log.Debug("调试信息");
4. 运作結果
Net如何配备log4net(log4net配置详细说明)
截至这里,日志储存取得成功。
三. 复位环境变量
前边提及在默认设置环境变量中App.config(B/S程序流程则为web.config)中开展配备,可以根据编码
log4net.Config.XmlConfigurator.Configure; 来复位配备,或是还能够根据 [assembly: log4net.Config.XmlConfigurator] 反射面的方式开展复位配备,二者可以做到相同的实际效果,意味着了二种复位环境变量的方式。
PS: [assembly:
log4net.Config.XmlConfigurator] 可以加在 现阶段应用文档的 namespace上功能于现阶段文档,或是加进Properties/AssemblyInfo.cs中,则该新项目全局性都不用再复位了。
Net如何配备log4net(log4net配置详细说明)
在具体项目中,默认设置的环境变量里很有可能包括许多架构的信息内容,这个时候把 log4net的配备编码再放进进来,便会看起来有点儿混乱,或是有一些“奇怪”的人把默认设置环境变量更名了,这个时候应用以上默认设置的2种 *** 就不太好用了,那麼这样的事情怎么处理呢?
这儿主要详细介绍 根据
log4net.Config.XmlConfigurator.Configure; 来关系环境变量。
状况一: 应用默认设置环境变量的状况
1. 编码配备:
log4net.Config.XmlConfigurator.Configure;
2. 反射面配备:[assembly:
log4net.Config.XmlConfigurator]
(这儿仅仅举例说明,非常少有改动默认设置环境变量名字的)
1. 编码配备: 更先将App1.config文件的特性中的“形成实际操作”改成“ 置入的資源”,随后根据下列编码开展配备。
1 Assembly assembly = Assembly.GetExecutingAssembly; 2 var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.App1.config"); 3 log4net.Config.XmlConfigurator.Configure(xml);
注:编码中的 _01_SimpleDemo 为类名名。
2. 反射面配备:[assembly:
log4net.Config.XmlConfigurator(ConfigFile = “log4net.xml”)]
注:用这些 *** 特性中的:拷贝到輸出文件目录必须改成:自始至终拷贝,形成实际操作不用配备,应用默认设置:无 就可以
Net如何配备log4net(log4net配置详细说明)
状况三:新创建独立xml文件,开展log4net的配备 (强烈推荐选用这类 *** ,和原环境变量区别开,独立配备便捷,处理 *** 和状况二是一致的)
1. 编码配备:更先将log4net.xml文件的特性中的“形成实际操作”改成“ 置入的資源”,随后根据下列编码开展配备。
1 Assembly assembly = Assembly.GetExecutingAssembly; 2 var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.log4net.xml"); 3 log4net.Config.XmlConfigurator.Configure(xml);
注:编码中的 _01_SimpleDemo 为类名名。
状况四:不论是改动默认设置环境变量的名字为 或是 新创建独立的xml做为环境变量 → 可以根据相对路径的形式实现解决 【不建议这类 *** 】
1. 立即写相对路径 (留意这类 *** 【不用】配备文件名后缀为 “置入的資源”)
1 log4net.Config.XmlConfigurator.Configure(new FileInfo(@"D:\06-我的开发设计之途\DotNet管理体系\05-DotNet框架篇\03-Log4net详解\Code\01-SimpleDemo\log4net.xml"));
2 根据代码获得绝对路径 (留意这类 *** 【不用】配置文件名后缀的“形成实际操作”改为 “置入的資源”,但必须改为“自始至终拷贝”,保证輸出到bin文档下)
1 string assemblyFilePath = Assembly.GetExecutingAssembly.Location; 2 string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath); 3 string configFilePath = assemblyDirPath " //log4net.xml"; 4 log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));
PS:B/S程序流程下根据
log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath(“~”) @”/log4net.xml”)); 来配置。
四. 代码启用详解
Log4net容许好几个ILog目标与此同时存有,根据代码:ILog log = LogManager.GetLogger(“xxx”); 来建立。
A: 日志级别由高到低各自为:FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息),此外也有 OFF和 ALL 。
几个方面表明:OFF表示全部信息内容也不载入,ALL表明全部信息内容都载入,大家还可以根据:<root><level value = “WARN” ></ level ></root>那样配置,表明WARN等级及其高过WARN以上的等级才会被载入日志。
B: 写入日志的方式 有:Debug、Error、Fatal、Info、Warn五个方式,每一个方式都是有2个轻载,如下图:
Net如何配置log4net(log4net配置详解)
共享在应用配置文档为log4net.xml的情形下的启用代码:
1 Assembly assembly = Assembly.GetExecutingAssembly; 2 var xml = assembly.GetManifestResourceStream("_01_SimpleDemo.log4net.xml"); 3 log4net.Config.XmlConfigurator.Configure(xml); 4 ILog log = LogManager.GetLogger("test"); 5 log.Debug("调试信息"); 6 log.Info("一般信息内容"); 7 log.Warn("警示"); 8 try 9 { 10 int.Parse("ddd"); 11 } 12 catch (Exception ex) 13 { 14 log.Error("一般不正确", ex); 15 } 16 log.Fatal("严重错误");
五. 配置文档详解
Log4net的配置文件关键分成两绝大多数:分别是 【自定配置连接点】和 【关键代码配置】,自定配置连接点代码固定不动,如下图,关键代码配置主要坐落于:<log4net></log4net>连接点中,里边包含<appender></appender>连接点配置日日志輸出方式 和 <root></root>连接点,用以设定纪录日志的档次和开启什么輸出方式。
Net如何配置log4net(log4net配置详解)
几个方面表明:
1. 自定配置连接点 <section name=”log4net” type=”
log4net.Config.Log4NetConfigurationSectionHandler,log4net” /> 代码固定不动,立即拷贝就可以。
2. <root></root> 连接点关键用于: 配置日志的的輸出等级和载入日志的輸出方式。
A: level中的value值表明该值以及以上的日志级别才会輸出,日志级别包含:OFF > FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息) > ALL ,例如:
<level value="INFO"></level> 表明仅有INFO以及以上的日志级别才会被储存。
PS:OFF表明全部信息内容也不载入,ALL表明全部信息内容都载入。
B: <appender-ref></appender-ref>标识用以载入日志的輸出方式代码,根据ref和appender标签的中name特性密切相关,例如:
<appender-ref ref="RollingFileAppender"></appender-ref> 表明打开txt文档储存日志的 *** 。
3. <appender></appender>连接点,用于配置日志的輸出方式的,这节主要是讲解了輸出到 【txt文本文本文档】中 和 【数据库查询】。
A:共享一下数据库查询的表构造,详尽配置见接下来的代码共享,必须留意字段名种类相符合,而且要显式特定其长短。
Net如何配置log4net(log4net配置详解)
B:有关txt文本文本文档的取名,可以储存到一个文件夹名称里,还可以依照时间段来区别文件夹名称,而且取名可以 动态性 特定取名的 *** 。
Net如何配置log4net(log4net配置详解)
C:有关日志图片大小的详细说明和文档数量的表明,关键必须三个连接点相互配合应用(具体研发中,假如一个txt尤其大,开启的过程中会十分的慢,卡屏,因此该流程必须配置一下)。
PS:更先要配置 RollingStyle 连接点为Size方式或是Composite方式,随后配置 maximumFileSize 连接点设定每一个文档的尺寸,最终配置 MaxSizeRollBackups 连接点,设定日志文档的数量。超过尺寸后在全部文件夹名称后全自动提升整数重命名,数据较大的最开始载入。
用下边的代码简易测试一下:
1 <param name="RollingStyle" value="Composite" /> 2 <param name="maximumFileSize" value="10KB" /> 3 <param name="MaxSizeRollBackups" value="5" />
Net如何配置log4net(log4net配置详解)
详尽代码如下所示:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!-- 一. 加上log4net的自定配置连接点--> 4 <configSections> 5 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 6 </configSections> 7 <!--二. log4net的关键配置代码--> 8 <log4net> 9 <!--(一) 配置日志的輸出方式--> 10 <!--1. 輸出方式(一) 将日志以回退文档的方式写到文档中--> 11 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 12 <!--1.1 文件夹名称的部位(还可以写绝对路径)--> 13 <param name="File" value="D:\MyLog1\" /> 14 <!--相对路径 C/S程序流程形成在Debug文件目录下--> 15 <!--<param name="File" value="/Logs/" />--> 16 <!--1.2 是不是增加到文档--> 17 <param name="AppendToFile" value="true" /> 18 <!--1.3 应用最少锁住实体模型(minimal locking model),以容许好几个过程可以载入同一个文档 --> 19 <lockingModel type="log4net.Appender.FileAppender MinimalLock" /> 20 <!--1.4 配置Unicode编号--> 21 <Encoding value="UTF-8" /> 22 <!--1.5 是不是只提到一个文档里--> 23 <param name="StaticLogFileName" value="false" /> 24 <!--1.6 配置依照什么 *** 造成好几个日志文档 (Date:日期、Size:图片大小、Composite:日期和文件大小的搅拌 *** )--> 25 <param name="RollingStyle" value="Composite" /> 26 <!--1.7 详细介绍多种多样日志的的取名和放置在硬盘的方式--> 27 <!--1.7.1 在根目录下立即以日期取名txt文件 留意"的部位,去空格 --> 28 <param name="DatePattern" value="yyyy-MM-dd".log"" /> 29 <!--1.7.2 在根目录下按日期造成文件夹名称,文件名固定不动 test.log --> 30 <!--<param name="DatePattern" value="yyyy-MM-dd/"test.log"" />--> 31 <!--1.7.3 在根目录下按日期造成文件夹名称,这也是按日期造成文件夹名称,并在文件名前也再加上日期 --> 32 <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-test.log"" />--> 33 <!--1.7.4 在根目录下按日期造成文件夹名称,这再产生下一级固定不动的文件夹名称 --> 34 <!--<param name="DatePattern" value="yyyyMMdd/"OrderInfor/test.log"" />--> 35 <!--1.8 配备每一个日志的尺寸。【只在1.6 RollingStyle 挑选混和 *** 与图片大小 *** 下能起功效!!!】可以用的企业:KB|MB|GB。不必应用小数,不然会一直载入现阶段日志, 36 超过尺寸后在全部文件夹名称后全自动提升整数重命名,数据较大的最开始载入。--> 37 <param name="maximumFileSize" value="10MB" /> 38 <!--1.9 较多造成的日志文档数量,超出则保存全新的n个 将value的值设定-1,则不分文档数量 【只在1.6 RollingStyle 挑选混和 *** 与图片大小 *** 下能起功效!!!】 39 与1.8中maximumFileSize图片大小是搭配应用的--> 40 <param name="MaxSizeRollBackups" value="5" /> 41 <!--1.10 环境变量文档的合理布局文件格式,应用PatternLayout,自定合理布局--> 42 <layout type="log4net.Layout.PatternLayout"> 43 <conversionPattern value="记录:�te %n线程ID:[%thread] %n日志等级:%-5level %n出差错类:%logger property: [%property{NDC}] - %n不正确叙述:%message%newline %n%newline"/> 44 </layout> 45 </appender> 46 47 <!--2. 輸出方式(二) 纪录日志到数据库查询--> 48 <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 49 <!--2.1 设定缓冲区域尺寸,仅有日志纪录超额定值才会一块载入到数据库查询--> 50 <param name="BufferSize" value="1" /> 51 <!--2.2 引入--> 52 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 53 <!--2.3 连接数据库字符串数组--> 54 <connectionString value="data source=localhost;initial catalog=LogDB;integrated security=false;persist security info=True;User ID=sa;Password=123456" /> 55 <!--2.4 SQL句子 *** 到特定表--> 56 <commandText value="INSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (@threadId, @log_level, @log_name, @log_msg, @log_exception,@log_time)" /> 57 <!--2.5 数据库查询字段名配对--> 58 <!-- 进程号--> 59 <parameter> 60 <parameterName value="@threadId" /> 61 <dbType value="String" /> 62 <size value="100" /> 63 <layout type="log4net.Layout.PatternLayout"> 64 <conversionPattern value="%thread" /> 65 </layout> 66 </parameter> 67 <!--日志等级--> 68 <parameter> 69 <parameterName value="@log_level" /> 70 <dbType value="String" /> 71 <size value="100" /> 72 <layout type="log4net.Layout.PatternLayout"> 73 <conversionPattern value="%level" /> 74 </layout> 75 </parameter> 76 <!--日志纪录类名字--> 77 <parameter> 78 <parameterName value="@log_name" /> 79 <dbType value="String" /> 80 <size value="100" /> 81 <layout type="log4net.Layout.PatternLayout"> 82 <conversionPattern value="%logger" /> 83 </layout> 84 </parameter> 85 <!--日志信息内容--> 86 <parameter> 87 <parameterName value="@log_msg" /> 88 <dbType value="String" /> 89 <size value="5000" /> 90 <layout type="log4net.Layout.PatternLayout"> 91 <conversionPattern value="%message" /> 92 </layout> 93 </parameter> 94 <!--出现异常信息内容 指的是如Infor 方式的第二个主要参数的值--> 95 <parameter> 96 <parameterName value="@log_exception" /> 97 <dbType value="String" /> 98 <size value="2000" /> 99 <layout type="log4net.Layout.ExceptionLayout" /> 100 </parameter> 101 <!-- 日志记录--> 102 <parameter> 103 <parameterName value="@log_time" /> 104 <dbType value="DateTime" /> 105 <layout type="log4net.Layout.RawTimeStampLayout" /> 106 </parameter> 107 </appender> 108 <!--(二). 配备日志的的輸出等级和载入日志的輸出方式--> 109 <root> 110 <!--1. level中的value值表明该值以及以上的日志等级才会輸出--> 111 <!--OFF > FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息) > ALL --> 112 <!--OFF表明全部信息内容也不载入,ALL表明全部信息内容都载入--> 113 <level value="ALL"></level> 114 <!--2. append-ref标识表明要载入前边的日志輸出方式编码 根据ref和appender标签的中name特性密切相关--> 115 <appender-ref ref="RollingFileAppender"></appender-ref> 116 <appender-ref ref="AdoNetAppender"></appender-ref> 117 </root> 118 </log4net> 119 120 </configuration>
六. 简易的封装形式及详细编码共享
这儿仿真模拟在系统软件架构中对Log4net开展简洁的封装形式,随后在MVC框架中启用,并共享所有编码。
流程一:新创建Ypf.Utils类库,做为专用工具类库,引进log4net程序流程集,并将前边使用的log4net.xml 拷贝进去,改特性为置入資源,随后新创建LogUtils类(不必起名叫LogHelp),对Log4net的方式 开展简洁的封装形式,主要包含:复位编码、ILog案例建立、五类日志等级的封装形式。
需注意:这类封装形式会提供一个问题,会致使导出的资料中出差错类始终表明的为LogUtils这一封装形式类,这儿选用StackTrace类开展曲折解决一下,就可以精准定位到实际的出差错部位了,如下图:
Net如何配备log4net(log4net配置详细说明)
log4net.xml文件编码如下所示:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!-- 一. 加上log4net的修改配备连接点--> 4 <configSections> 5 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 6 </configSections> 7 <!--二. log4net的关键配备编码--> 8 <log4net> 9 <!--(一) 配备日志的輸出方式--> 10 <!--1. 輸出方式(一) 将日志以回退文档的方式写到文档中--> 11 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 12 <!--1.1 文件夹名称的部位(还可以写绝对路径)--> 13 <param name="File" value="D:\MyLog1\" /> 14 <!--绝对路径--> 15 <!--<param name="File" value="Logs/" />--> 16 <!--1.2 是不是增加到文档--> 17 <param name="AppendToFile" value="true" /> 18 <!--1.3 应用最少锁住实体模型(minimal locking model),以容许好几个过程可以载入同一个文档 --> 19 <lockingModel type="log4net.Appender.FileAppender MinimalLock" /> 20 <!--1.4 配备Unicode编号--> 21 <Encoding value="UTF-8" /> 22 <!--1.5 是不是只提到一个文档里--> 23 <param name="StaticLogFileName" value="false" /> 24 <!--1.6 配备依照什么 *** 造成好几个日志文档 (Date:日期、Size:图片大小、Composite:日期和文件大小的搅拌 *** )--> 25 <param name="RollingStyle" value="Composite" /> 26 <!--1.7 详细介绍多种多样日志的的取名和放置在硬盘的方式--> 27 <!--1.7.1 在根目录下立即以日期取名txt文件 留意"的部位,去空格 --> 28 <param name="DatePattern" value="yyyy-MM-dd".log"" /> 29 <!--1.7.2 在根目录下按日期造成文件夹名称,文件名固定不动 test.log --> 30 <!--<param name="DatePattern" value="yyyy-MM-dd/"test.log"" />--> 31 <!--1.7.3 在根目录下按日期造成文件夹名称,这也是按日期造成文件夹名称,并在文件名前也再加上日期 --> 32 <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-test.log"" />--> 33 <!--1.7.4 在根目录下按日期造成文件夹名称,这再产生下一级固定不动的文件夹名称 --> 34 <!--<param name="DatePattern" value="yyyyMMdd/"OrderInfor/test.log"" />--> 35 <!--1.8 配备每一个日志的尺寸。【只在1.6 RollingStyle 挑选混和 *** 与图片大小 *** 下能起功效!!!】可以用的企业:KB|MB|GB。不必应用小数,不然会一直载入现阶段日志, 36 超过尺寸后在全部文件夹名称后全自动提升整数重命名,数据较大的最开始载入。--> 37 <param name="maximumFileSize" value="10MB" /> 38 <!--1.9 较多造成的日志文档数量,超出则保存全新的n个 将value的值设定-1,则不分文档数量 【只在1.6 RollingStyle 挑选混和 *** 与图片大小 *** 下能起功效!!!】 39 与1.8中maximumFileSize图片大小是搭配应用的--> 40 <param name="MaxSizeRollBackups" value="5" /> 41 <!--1.10 环境变量文档的合理布局文件格式,应用PatternLayout,自定合理布局--> 42 <layout type="log4net.Layout.PatternLayout"> 43 <conversionPattern value="记录:�te %n线程ID:[%thread] %n日志等级:%-5level %n出差错类:%logger property: [%property{NDC}] - %n不正确叙述:%message%newline %n%newline"/> 44 </layout> 45 </appender> 46 47 <!--2. 輸出方式(二) 纪录日志到数据库查询--> 48 <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 49 <!--2.1 设定缓冲区域尺寸,仅有日志纪录超额定值才会一块载入到数据库查询--> 50 <param name="BufferSize" value="1" /> 51 <!--2.2 引入--> 52 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 53 <!--2.3 连接数据库字符串数组--> 54 <connectionString value="data source=localhost;initial catalog=LogDB;integrated security=false;persist security info=True;User ID=sa;Password=123456" /> 55 <!--2.4 SQL句子 *** 到特定表--> 56 <commandText value="INSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (@threadId, @log_level, @log_name, @log_msg, @log_exception,@log_time)" /> 57 <!--2.5 数据库查询字段名配对--> 58 <!-- 进程号--> 59 <parameter> 60 <parameterName value="@threadId" /> 61 <dbType value="String" /> 62 <size value="100" /> 63 <layout type="log4net.Layout.PatternLayout"> 64 <conversionPattern value="%thread" /> 65 </layout> 66 </parameter> 67 <!--日志等级--> 68 <parameter> 69 <parameterName value="@log_level" /> 70 <dbType value="String" /> 71 <size value="100" /> 72 <layout type="log4net.Layout.PatternLayout"> 73 <conversionPattern value="%level" /> 74 </layout> 75 </parameter> 76 <!--日志纪录类名字--> 77 <parameter> 78 <parameterName value="@log_name" /> 79 <dbType value="String" /> 80 <size value="100" /> 81 <layout type="log4net.Layout.PatternLayout"> 82 <conversionPattern value="%logger" /> 83 </layout> 84 </parameter> 85 <!--日志信息内容--> 86 <parameter> 87 <parameterName value="@log_msg" /> 88 <dbType value="String" /> 89 <size value="5000" /> 90 <layout type="log4net.Layout.PatternLayout"> 91 <conversionPattern value="%message" /> 92 </layout> 93 </parameter> 94 <!--出现异常信息内容 指的是如Infor 方式的第二个主要参数的值--> 95 <parameter> 96 <parameterName value="@log_exception" /> 97 <dbType value="String" /> 98 <size value="2000" /> 99 <layout type="log4net.Layout.ExceptionLayout" /> 100 </parameter> 101 <!-- 日志记录--> 102 <parameter> 103 <parameterName value="@log_time" /> 104 <dbType value="DateTime" /> 105 <layout type="log4net.Layout.RawTimeStampLayout" /> 106 </parameter> 107 </appender> 108 <!--(二). 配备日志的的輸出等级和载入日志的輸出方式--> 109 <root> 110 <!--1. level中的value值表明该值以及以上的日志等级才会輸出--> 111 <!--OFF > FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息) > ALL --> 112 <!--OFF表明全部信息内容也不载入,ALL表明全部信息内容都载入--> 113 <level value="ALL"></level> 114 <!--2. append-ref标识表明要载入前边的日志輸出方式编码 根据ref和appender标签的中name特性密切相关--> 115 <appender-ref ref="RollingFileAppender"></appender-ref> 116 <appender-ref ref="AdoNetAppender"></appender-ref> 117 </root> 118 </log4net> 119 120 </configuration>
LogUtils类编码如下所示
1 using log4net; 2 using System; 3 using System.Collections.Generic; 4 using System.Diagnostics; 5 using System.Linq; 6 using System.Reflection; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace Ypf.Utils 11 { 12 public class LogUtils 13 { 14 //可以申明好几个日志目标 15 public static ILog log = LogManager.GetLogger(typeof(LogUtils)); 16 17 #region 01-复位Log4net的配备 18 /// <summary> 19 /// 复位Log4net的配备 20 /// xml文件一定要改成置入的資源 21 /// </summary> 22 public static void InitLog4Net 23 { 24 Assembly assembly = Assembly.GetExecutingAssembly; 25 var xml = assembly.GetManifestResourceStream("Ypf.Utils.log4net.xml"); 26 log4net.Config.XmlConfigurator.Configure(xml); 27 } 28 #endregion 29 30 31 32 33 /************************* 五种不一样日志等级 *******************************/ 34 //FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息) 35 36 /// <summary> 37 /// 将调节的数据輸出,可以固定到实际的部位(处理高层住宅封装形式产生的问题) 38 /// </summary> 39 /// <returns></returns> 40 private static string getDebugInfo 41 { 42 StackTrace trace = new StackTrace(true); 43 return trace.ToString; 44 } 45 46 #region 01-DEBUG(调试信息) 47 /// <summary> 48 /// Debug 49 /// </summary> 50 /// <param name="msg">日志信息内容</param> 51 public static void Debug(string msg) 52 { 53 log.Debug(getDebugInfo msg); 54 } 55 /// <summary> 56 /// Debug 57 /// </summary> 58 /// <param name="msg">日志信息</param> 59 /// <param name="exception">错误报告</param> 60 public static void Debug(string msg, Exception exception) 61 { 62 log.Debug(getDebugInfo msg, exception); 63 } 64 65 #endregion 66 67 #region 02-INFO(一般信息内容) 68 /// <summary> 69 /// Info 70 /// </summary> 71 /// <param name="msg">日志信息</param> 72 public static void Info(string msg) 73 { 74 log.Info(getDebugInfo msg); 75 } 76 /// <summary> 77 /// Info 78 /// </summary> 79 /// <param name="msg">日志信息内容</param> 80 /// <param name="exception">错误报告</param> 81 public static void Info(string msg, Exception exception) 82 { 83 log.Info(getDebugInfo msg, exception); 84 } 85 #endregion 86 87 #region 03-WARN(警示) 88 /// <summary> 89 /// Warn 90 /// </summary> 91 /// <param name="msg">日志信息内容</param> 92 public static void Warn(string msg) 93 { 94 log.Warn(getDebugInfo msg); 95 } 96 /// <summary> 97 /// Warn 98 /// </summary> 99 /// <param name="msg">日志信息</param> 100 /// <param name="exception">错误报告</param> 101 public static void Warn(string msg, Exception exception) 102 { 103 log.Warn(getDebugInfo msg, exception); 104 } 105 #endregion 106 107 #region 04-ERROR(一般不正确) 108 /// <summary> 109 /// Error 110 /// </summary> 111 /// <param name="msg">日志信息内容</param> 112 public static void Error(string msg) 113 { 114 log.Error(getDebugInfo msg); 115 } 116 /// <summary> 117 /// Error 118 /// </summary> 119 /// <param name="msg">日志信息</param> 120 /// <param name="exception">错误报告</param> 121 public static void Error(string msg, Exception exception) 122 { 123 log.Error(getDebugInfo msg, exception); 124 } 125 #endregion 126 127 #region 05-FATAL(严重错误) 128 /// <summary> 129 /// Fatal 130 /// </summary> 131 /// <param name="msg">日志信息内容</param> 132 public static void Fatal(string msg) 133 { 134 log.Fatal(getDebugInfo msg); 135 } 136 /// <summary> 137 /// Fatal 138 /// </summary> 139 /// <param name="msg">日志信息</param> 140 /// <param name="exception">错误报告</param> 141 public static void Fatal(string msg, Exception exception) 142 { 143 log.Fatal(getDebugInfo msg, exception); 144 } 145 146 #endregion 147 148 149 150 } 151 }
流程二:新创建名Ypf.MVC的MVC5架构,加上对Ypf.Utils类库的引入,在Global.asax全局性文档中加上对 对Log4net开展复位。
Net如何配备log4net(log4net配置详细说明)
随后就可以开心的实现启用检测了哦。
1 /// <summary> 2 /// 测试log4net 3 /// 更先必须再Global中复位log4net 4 /// </summary> 5 /// <returns></returns> 6 public ActionResult Index 7 { 8 //FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息) 9 LogUtils.Debug("出错了"); 10 try 11 { 12 int.Parse("ddf"); 13 } 14 catch (Exception ex) 15 { 16 LogUtils.Debug("出错了",ex); 17 } 18 19 LogUtils.Info("出错了"); 20 try 21 { 22 int.Parse("ddf"); 23 } 24 catch (Exception ex) 25 { 26 LogUtils.Info("出错了", ex); 27 } 28 29 LogUtils.Warn("出错了"); 30 try 31 { 32 int.Parse("ddf"); 33 } 34 catch (Exception ex) 35 { 36 LogUtils.Warn("出错了", ex); 37 } 38 39 LogUtils.Error("出错了"); 40 try 41 { 42 int.Parse("ddf"); 43 } 44 catch (Exception ex) 45 { 46 LogUtils.Error("出错了"%2c ex); 47 } 48 49 LogUtils.Fatal("出错了"); 50 try 51 { 52 int.Parse("ddf"); 53 } 54 catch (Exception ex) 55 { 56 LogUtils.Fatal("出错了", ex); 57 } 58 59 return View; 60 }
七. 填补:分文档存放
在前面的简介中,忽视了一种状况,多种类型的日志(实际操作日志也好,不正确日志也好)都存放在一个txt文档里,在现实研发中很不方便,在这儿详细介绍一种利用Log4net过滤装置完成不一样日志分文件夹名称存放的作用。
几类过滤装置,可以用于过虑掉Appender中的內容:
DenyAllFilter: 阻拦全部的日志事情被记录
LevelMatchFilter: 仅有特定级别的日志事情才被记录
LevelRangeFilter :日志级别在选定范畴内的事情才被记录
LoggerMatchFilter: 与Logger名字配对,才记录
PropertyFilter: 信息配对特定的人物属性值时才被记录
StringMathFilter: 信息配对特定的字符串数组才被记录
分文件夹名称存放的关键所属:
①. 配置文档的调节:利用LoggerMatchFilter和DenyAllFilter过滤装置完成分文档存放。
Net如何配置log4net(log4net配置详细说明)
②:申明ILog目标的情况下,必须与LoggerMatchFilter过滤装置中的Value值相对性应,才可以确保该ILog目标记录的日志存放到该Appender连接点相对应的途径下。
Net如何配置log4net(log4net配置详细说明)
Net如何配置log4net(log4net配置详细说明)
③. 高层住宅启用:
Net如何配置log4net(log4net配置详细说明)
共享一下log4net的配置文档和LogUtils的封装形式文档。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!-- 一. 加上log4net的自定配置连接点--> 4 <configSections> 5 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 6 </configSections> 7 <!--二. log4net的关键配置编码--> 8 <log4net> 9 <!--1. 輸出方式(一) 将日志以回退文档的方式写到文档中--> 10 11 <!--方式一:所有存放到一个文件夹名称里--> 12 <appender name="log0" type="log4net.Appender.RollingFileAppender"> 13 <!--1.1 文件夹的部位(还可以写绝对路径)--> 14 <param name="File" value="D:\MyLog\" /> 15 <!--相对路径--> 16 <!--<param name="File" value="Logs/" />--> 17 <!--1.2 是不是增加到文档--> 18 <param name="AppendToFile" value="true" /> 19 <!--1.3 应用最少锁住实体模型(minimal locking model),以容许好几个过程可以载入同一个文档 --> 20 <lockingModel type="log4net.Appender.FileAppender MinimalLock" /> 21 <!--1.4 配置Unicode编号--> 22 <Encoding value="UTF-8" /> 23 <!--1.5 是不是只提到一个文档里--> 24 <param name="StaticLogFileName" value="false" /> 25 <!--1.6 配置依照什么 *** 造成好几个日志文档 (Date:日期、Size:图片大小、Composite:日期和文件大小的搅拌 *** )--> 26 <param name="RollingStyle" value="Composite" /> 27 <!--1.7 详细介绍多种多样日志的的取名和存放在硬盘的方式--> 28 <!--1.7.1 在根目录下立即以日期取名txt文件 留意"的部位,去空格 --> 29 <param name="DatePattern" value="yyyy-MM-dd".log"" /> 30 <!--1.7.2 在根目录下按日期造成文件夹名称,文件名固定不动 test.log --> 31 <!--<param name="DatePattern" value="yyyy-MM-dd/"test.log"" />--> 32 <!--1.7.3 在根目录下按日期造成文件夹名称,这也是按日期造成文件夹名称,并在文件名前也再加上日期 --> 33 <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-test.log"" />--> 34 <!--1.7.4 在根目录下按日期造成文件夹名称,这再产生下一级固定不动的文件夹名称 --> 35 <!--<param name="DatePattern" value="yyyyMMdd/"OrderInfor/test.log"" />--> 36 <!--1.8 配置每一个日志的尺寸。【只在1.6 RollingStyle 挑选混和 *** 与图片大小 *** 下能起功效!!!】可以用的企业:KB|MB|GB。不必应用小数,不然会一直载入现阶段日志, 37 超过尺寸后在全部文件夹名称后全自动提升整数重命名,数据较大的最开始载入。--> 38 <param name="maximumFileSize" value="10MB" /> 39 <!--1.9 较多造成的日志文档数量,超出则保存全新的n个 将value的值设定-1,则不分文档数量 【只在1.6 RollingStyle 挑选混和 *** 与图片大小 *** 下能起功效!!!】 40 与1.8中maximumFileSize图片大小是搭配应用的--> 41 <param name="MaxSizeRollBackups" value="5" /> 42 <!--1.10 配置文档文件的合理布局文件格式,应用PatternLayout,自定合理布局--> 43 <layout type="log4net.Layout.PatternLayout"> 44 <conversionPattern value="记录時间:�te %n线程ID:[%thread] %n日志等级:%-5level %n出差错类:%logger property: [%property{NDC}] - %n不正确叙述:%message%newline %n%newline"/> 45 </layout> 46 </appender> 47 48 <!--方式二:分文件夹名称存放--> 49 <!--文件夹1--> 50 <appender name="log1" type="log4net.Appender.RollingFileAppender"> 51 <param name="File" value="D:\MyLog\OneLog\" /> 52 <param name="AppendToFile" value="true" /> 53 <lockingModel type="log4net.Appender.FileAppender MinimalLock" /> 54 <Encoding value="UTF-8" /> 55 <param name="StaticLogFileName" value="false" /> 56 <param name="RollingStyle" value="Composite" /> 57 <param name="DatePattern" value="yyyy-MM-dd".log"" /> 58 <param name="maximumFileSize" value="10MB" /> 59 <param name="MaxSizeRollBackups" value="5" /> 60 <layout type="log4net.Layout.PatternLayout"> 61 <conversionPattern value="%message%newline" /> 62 </layout> 63 <!--下边是利用过滤装置开展分文件夹名称存放,二种过滤装置开展相互配合--> 64 <!--与Logger名字(OneLog)配对,才记录,--> 65 <filter type="log4net.Filter.LoggerMatchFilter"> 66 <loggerToMatch value="OneLog" /> 67 </filter> 68 <!--阻拦全部的日志事情被记录--> 69 <filter type="log4net.Filter.DenyAllFilter" /> 70 </appender> 71 <!--文件夹名称2--> 72 <appender name="log2" type="log4net.Appender.RollingFileAppender"> 73 <param name="File" value="D:\MyLog\TwoLog\" /> 74 <param name="AppendToFile" value="true" /> 75 <lockingModel type="log4net.Appender.FileAppender MinimalLock" /> 76 <Encoding value="UTF-8" /> 77 <param name="StaticLogFileName" value="false" /> 78 <param name="RollingStyle" value="Composite" /> 79 <param name="DatePattern" value="yyyy-MM-dd".log"" /> 80 <param name="maximumFileSize" value="10MB" /> 81 <param name="MaxSizeRollBackups" value="5" /> 82 <layout type="log4net.Layout.PatternLayout"> 83 <conversionPattern value="%message%newline" /> 84 </layout> 85 <!--下边是运用过滤装置开展分文件夹名称储放,二种过滤装置开展相互配合--> 86 <!--与Logger名字(TwoLog)配对,才纪录,--> 87 <filter type="log4net.Filter.LoggerMatchFilter"> 88 <loggerToMatch value="TwoLog" /> 89 </filter> 90 <!--阻拦全部的日志事情被纪录--> 91 <filter type="log4net.Filter.DenyAllFilter" /> 92 </appender> 93 94 95 <!--2. 輸出方式(二) 纪录日志到数据库查询--> 96 <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 97 <!--2.1 设定缓冲区域尺寸,仅有日志纪录超额定值才会一块载入到数据库查询--> 98 <param name="BufferSize" value="1" /> 99 <!--2.2 引入--> 100 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 101 <!--2.3 连接数据库字符串数组--> 102 <connectionString value="data source=localhost;initial catalog=LogDB;integrated security=false;persist security info=True;User ID=sa;Password=123456" /> 103 <!--2.4 SQL句子 *** 到特定表--> 104 <commandText value="INSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (@threadId, @log_level, @log_name, @log_msg, @log_exception,@log_time)" /> 105 <!--2.5 数据库查询字段名配对--> 106 <!-- 进程号--> 107 <parameter> 108 <parameterName value="@threadId" /> 109 <dbType value="String" /> 110 <size value="100" /> 111 <layout type="log4net.Layout.PatternLayout"> 112 <conversionPattern value="%thread" /> 113 </layout> 114 </parameter> 115 <!--日志等级--> 116 <parameter> 117 <parameterName value="@log_level" /> 118 <dbType value="String" /> 119 <size value="100" /> 120 <layout type="log4net.Layout.PatternLayout"> 121 <conversionPattern value="%level" /> 122 </layout> 123 </parameter> 124 <!--日志纪录类名字--> 125 <parameter> 126 <parameterName value="@log_name" /> 127 <dbType value="String" /> 128 <size value="100" /> 129 <layout type="log4net.Layout.PatternLayout"> 130 <conversionPattern value="%logger" /> 131 </layout> 132 </parameter> 133 <!--日志信息内容--> 134 <parameter> 135 <parameterName value="@log_msg" /> 136 <dbType value="String" /> 137 <size value="5000" /> 138 <layout type="log4net.Layout.PatternLayout"> 139 <conversionPattern value="%message" /> 140 </layout> 141 </parameter> 142 <!--出现异常信息内容 指的是如Infor 方式的第二个主要参数的值--> 143 <parameter> 144 <parameterName value="@log_exception" /> 145 <dbType value="String" /> 146 <size value="2000" /> 147 <layout type="log4net.Layout.ExceptionLayout" /> 148 </parameter> 149 <!-- 日志记录--> 150 <parameter> 151 <parameterName value="@log_time" /> 152 <dbType value="DateTime" /> 153 <layout type="log4net.Layout.RawTimeStampLayout" /> 154 </parameter> 155 </appender> 156 157 158 <!--(二). 配备日志的的輸出等级和载入日志的輸出方式--> 159 <root> 160 <!--1. level中的value值表明该值以及以上的日志等级才会輸出--> 161 <!--OFF > FATAL(严重错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息) > ALL --> 162 <!--OFF表明全部信息内容也不载入,ALL表明全部信息内容都载入--> 163 <level value="ALL"></level> 164 <!--2. append-ref标识表明要载入前边的日志輸出方式编码 根据ref和appender标签的中name特性密切相关--> 165 166 <!--<appender-ref ref="AdoNetAppender"></appender-ref>--> 167 <appender-ref ref="log0"></appender-ref> 168 <appender-ref ref="log1"></appender-ref> 169 <appender-ref ref="log2"></appender-ref> 170 </root> 171 </log4net> 172 173 </configuration>
1 using log4net; 2 using System; 3 using System.Collections.Generic; 4 using System.Diagnostics; 5 using System.Linq; 6 using System.Reflection; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace Ypf.Utils 11 { 12 public class LogUtils 13 { 14 //申明文件名(这儿分2个文件夹名称) 15 static string log1Name = "OneLog"; 16 static string log2Name = "TwoLog"; 17 18 //可以申明好几个日志目标 19 //方式一:不区分文件夹名称 20 public static ILog log = LogManager.GetLogger(typeof(LogUtils)); 21 22 //方式二:分文件夹名称 23 //如果是要分文件夹储存,这儿的名字必须和环境变量中loggerToMatch连接点中的value相互配合 24 //1. OneLog文件夹 25 public static ILog log1 = LogManager.GetLogger(log1Name); 26 //2. TwoLog文件夹 27 public static ILog log2 = LogManager.GetLogger(log2Name); 28 29 #region 01-复位Log4net的配备 30 /// <summary> 31 /// 复位Log4net的配备 32 /// xml文件一定要改成置入的資源 33 /// </summary> 34 public static void InitLog4Net 35 { 36 Assembly assembly = Assembly.GetExecutingAssembly; 37 var xml = assembly.GetManifestResourceStream("Ypf.Utils.log4net.xml"); 38 log4net.Config.XmlConfigurator.Configure(xml); 39 } 40 #endregion 41 42 /************************* 五种不一样日志级别 *******************************/ 43 //FATAL(致命错误) > ERROR(一般不正确) > WARN(警示) > INFO(一般信息内容) > DEBUG(调试信息) 44 45 #region 00-将调节的数据輸出,可以固定到实际的部位(处理高层住宅封装形式产生的问题) 46 /// <summary> 47 /// 将调节的数据輸出,可以固定到实际的部位(处理高层住宅封装形式产生的问题) 48 /// </summary> 49 /// <returns></returns> 50 private static string getDebugInfo 51 { 52 StackTrace trace = new StackTrace(true); 53 return trace.ToString; 54 } 55 #endregion 56 57 #region 01-DEBUG(调试信息) 58 /// <summary> 59 /// DEBUG(调试信息) 60 /// </summary> 61 /// <param name="msg">日志信息内容</param> 62 /// <param name="logName">文件名</param> 63 public static void Debug(string msg, string logName = "") 64 { 65 if (logName == "") 66 { 67 log.Debug(getDebugInfo msg); 68 } 69 else if (logName == log1Name) 70 { 71 log1.Debug(msg); 72 } 73 else if (logName == log2Name) 74 { 75 log2.Debug(msg); 76 } 77 } 78 /// <summary> 79 /// Debug 80 /// </summary> 81 /// <param name="msg">日志信息内容</param> 82 /// <param name="exception">错误报告</param> 83 public static void Debug(string msg, Exception exception) 84 { 85 log.Debug(getDebugInfo msg, exception); 86 } 87 88 #endregion 89 90 #region 02-INFO(一般信息内容) 91 /// <summary> 92 /// INFO(一般信息) 93 /// </summary> 94 /// <param name="msg">日志信息内容</param> 95 /// <param name="logName">文件名</param> 96 public static void Info(string msg, string logName = "") 97 { 98 if (logName == "") 99 { 100 log.Info(getDebugInfo msg); 101 } 102 else if (logName == log1Name) 103 { 104 log1.Info(msg); 105 } 106 else if (logName == log2Name) 107 { 108 log2.Info(msg); 109 } 110 } 111 /// <summary> 112 /// Info 113 /// </summary> 114 /// <param name="msg">日志信息内容</param> 115 /// <param name="exception">错误报告</param> 116 public static void Info(string msg, Exception exception) 117 { 118 log.Info(getDebugInfo msg, exception); 119 } 120 #endregion 121 122 #region 03-WARN(警示) 123 /// <summary> 124 ///WARN(警告) 125 /// </summary> 126 /// <param name="msg">日志信息内容</param> 127 /// <param name="logName">文件名</param> 128 public static void Warn(string msg, string logName = "") 129 { 130 if (logName == "") 131 { 132 log.Warn(getDebugInfo msg); 133 } 134 else if (logName == log1Name) 135 { 136 log1.Warn(msg); 137 } 138 else if (logName == log2Name) 139 { 140 log2.Warn(msg); 141 } 142 } 143 /// <summary> 144 /// Warn 145 /// </summary> 146 /// <param name="msg">日志信息内容</param> 147 /// <param name="exception">错误报告</param> 148 public static void Warn(string msg, Exception exception) 149 { 150 log.Warn(getDebugInfo msg, exception); 151 } 152 #endregion 153 154 #region 04-ERROR(一般不正确) 155 /// <summary> 156 /// ERROR(一般错误) 157 /// </summary> 158 /// <param name="msg">日志信息内容</param> 159 /// <param name="logName">文件名</param> 160 public static void Error(string msg, string logName = "") 161 { 162 if (logName == "") 163 { 164 log.Error(getDebugInfo msg); 165 } 166 else if (logName == log1Name) 167 { 168 log1.Error(msg); 169 } 170 else if (logName == log2Name) 171 { 172 log2.Error(msg); 173 } 174 } 175 /// <summary> 176 /// Error 177 /// </summary> 178 /// <param name="msg">日志信息内容</param> 179 /// <param name="exception">错误报告</param> 180 public static void Error(string msg, Exception exception) 181 { 182 log.Error(getDebugInfo msg, exception); 183 } 184 #endregion 185 186 #region 05-FATAL(致命错误) 187 /// <summary> 188 /// FATAL(致命错误) 189 /// </summary> 190 /// <param name="msg">日志信息内容</param> 191 /// <param name="logName">文件名</param> 192 public static void Fatal(string msg, string logName = "") 193 { 194 if (logName == "") 195 { 196 log.Fatal(getDebugInfo msg); 197 } 198 else if (logName == log1Name) 199 { 200 log1.Fatal(msg); 201 } 202 else if (logName == log2Name) 203 { 204 log2.Fatal(msg); 205 } 206 } 207 /// <summary> 208 /// Fatal 209 /// </summary> 210 /// <param name="msg">日志信息内容</param> 211 /// <param name="exception">错误报告</param> 212 public static void Fatal(string msg, Exception exception) 213 { 214 log.Fatal(getDebugInfo msg, exception); 215 } 216 217 #endregion 218 219 220 221 } 222 }
在本周于佛罗里达州迈阿密举办的 Pwn2Own 2022 大会上,两名来自荷兰的白帽黑客获得了第四次胜利。作为这场年度黑客大会的大赢家,Dean Keuper 和 Thijs Alkemade 获得了 90000 美元奖励、且捧走了冠军奖杯。此前这对搭档曾于 2012、2018 和 2021 年创下...
一项新研究表明,2021 年通过勒索软件攻击方式牟取的所有资金中有 74% 流向了俄罗斯有关的黑客手中。研究人员说,价值超过 4 亿美元的加密货币支付给了“极有可能与俄罗斯有关联”的团体。研究人员还称,大量基于加密货币的洗钱活动是通过俄罗斯加密公司进行。 这项研究是由 Chainalysi...
Hackernews 编译,转载请注明出处: 在流行的包管理器中已经揭露多个安全漏洞,如果被潜在黑客利用,可能被滥用来运行任意代码和访问敏感信息,包括受感染设备的源代码和访问令牌。 然而,值得注意的是,这些漏洞要求目标开发人员同时处理一个受影响的软件包管理器和一个恶意软件包。 So...
Hackernews 编译,转载请注明出处: 网络攻击的数量和复杂程度日益增加,自然而然地促使许多公司使用更多的网络安全技术。我们知道加强威胁检测能力对于保护是必要的,但是他们也导致了几个意外后果。“越多并不总是越好”的格言非常适合这种情况。 网络安全公司 Cynet 即将举行的一...
美国联邦调查局(FBI)警告个人和公司当心商业电子邮件泄露(BEC)攻击。据估计,2016年6月至2021年12月期间,国内和国际因此的损失已达430亿美元,2019年7月至2021年12月期间此类攻击增加了65%。 BEC攻击通常针对执行合法资金转移请求的企业或个人。它们涉及通过社会工程、网络钓鱼...
SamMobile 报道称,尽管三星总能在 Google 正式发布修复之前,就为自家规模庞大的 Android 移动设备提供安全更新。然而过去多年销售的三星智能机,还是被发现存在一个出厂即有的安全漏洞,使得黑客能够轻易提取包括密码在内的敏感信息。以色列特拉维夫大学的研究人员指出,问题在于 Galax...