全国做膏药的网站有多少家呢,搜索引擎优化代理,大气机械网站,手机网站制作平台1.简单使用实例 1.1 添加log4net.dll的引用。 在NuGet程序包中搜索log4net并添加#xff0c;此次我所用版本为2.0.17。如下图#xff1a; 1.2 添加配置文件 右键项目#xff0c;添加新建项#xff0c;搜索选择应用程序配置文件#xff0c;命名为log4net.config#xff0c…1.简单使用实例 1.1 添加log4net.dll的引用。 在NuGet程序包中搜索log4net并添加此次我所用版本为2.0.17。如下图 1.2 添加配置文件 右键项目添加新建项搜索选择应用程序配置文件命名为log4net.config步骤如下图 1.2.1 log4net.config简单配置示例 下面是一个简单的配置示例
log4net.config配置
?xml version1.0 encodingutf-8 ?
configuration
log4netlogger nameDefaultLog!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--!--如果没有定义LEVEL的值则缺省为DEBUG--level valueALL /appender-ref refFileAppenderDefault/appender-ref/logger!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。--appender nameFileAppenderDefault typelog4net.Appender.RollingFileAppender!--绝对路径--!--file valueD:\KangarooLog.txt/file--!--日志输出到exe程序这个相对目录下--file value../../Log/DefalutLog /!--相对路径,在项目的根目录下--!--以最后一个路径为准,所以上面的绝对路径下不会写日志--!--file value./Log/Kangaroo.txt/file--!--防止多线程时不能写Log,官方说线程非安全--!--实际使用时,本地测试正常,部署后没有不能写日志的情况--lockingModel typelog4net.Appender.FileAppenderMinimalLock /!--追加日志内容true后续输出的日志会追加到之前的日志文件--appendToFile valuetrue /!--可以为:Once|Size|Date|Composite--!--Composite为Size和Date的组合--rollingStyle valueComposite /!--日志最大个数,都是最新的--!--rollingStyle节点为Date时,该节点不起作用--!--rollingStyle节点为Size时,只能有value个日志--!--rollingStyle节点为Composite时,每天有value个日志--maxSizeRollBackups value10 /!--当备份文件时,为文件名加的后缀--!--后缀为*.txt时,例:AX.txt_2008-07-24.PxP 应该是程序上的一个bug--!--后缀为*.TXT时,例:AX.txt_2008-07-25.TXT--datePattern value_yyyy-MM-dd.log /!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--maximumFileSize value10MB /!--置为true,当前最新日志文件名永远为file节中的名字--staticLogFileName valuefalse /!--输出级别在INFO和ERROR之间的日志--!--filter typelog4net.Filter.LevelRangeFilterparam nameLevelMin valueINFO /param nameLevelMax valueERROR //filter--!--必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出--filter typelog4net.Filter.LevelMatchFilterparam nameLevelToMatch valueWARN //filterfilter typelog4net.Filter.DenyAllFilter /layout typelog4net.Layout.PatternLayoutconversionPattern value%n%n【日志级别】%-5level%n【记录时间】%date%n【执行时间】[%r]毫秒%n【执行Log分类的名称】%logger%n【传入信息内容】%message%n//layout/appender
/log4net
/configuration
!--layout节点的配置说明--
!-- Made By YSL --
!-- %m(message):输出的日志消息如ILog.Debug(…)输出的一条消息 --
!-- %n(new line):换行 --
!-- %d(datetime):输出当前语句运行的时刻 --
!-- %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 --
!-- %t(thread id):当前语句所在的线程ID --
!-- %p(priority): 日志的当前优先级别即DEBUG、INFO、WARN…等 --
!-- %c(class):当前日志对象的名称例如 --
!-- 模式字符串为%-10c -%m%n --
!-- 代码为 --
!-- ILog logLogManager.GetLogger(“Exam.Log”); --
!-- log.Debug(“Hello”); --
!-- 则输出为下面的形式 --
!-- Exam.Log - Hello --
!-- %L输出语句所在的行号 --
!-- %F输出语句所在的文件名 --
!-- %-数字表示该项的最小长度如果不够则用空格填充 --
1.2.2 设置log4net.config配置文件属性 点击log4net.config将其文件属性设为始终复制如下图 1.3 在项目中引入该配置文件 这里有两种方式引入配置文件。 1.3.1 在项目的 AssemblyInfo.cs 中引入配置文件 首先在项目中新建一个Config文件夹将之前创建的log4net.config文件放入其中随后在 AssemblyInfo.cs 中添加如下语句 1.3.2 在项目运行时动态引入配置文件 使用固定语句引入配置文件如下所示其中configFilePath 为配置文件的绝对路径。
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(configFilePath)); 1.4 创建帮助类使用日志进行记录 我们首先创建名为 Log4Helper 的类并使用固定的log4net.LogManager.GetLogger()语句实例化对应的Log对象然后调用其对应的方法即可写入日志。示例代码如下
Log4Helper代码 public class Log4Helper{private static readonly log4net.ILog logDefault log4net.LogManager.GetLogger(DefaultLog);/// summary/// 测试默认配置信息输出输出范围做了限制/// /summarypublic static void TestDefaultLog(){logDefault.Debug(这是条调试信息);logDefault.Info(这是条提示信息);logDefault.Warn(这是条警告信息);logDefault.Error(这是条错误信息);logDefault.Fatal(这是条致命错误信息);}/// summary/// Log4Net初始化可读取自定义配置/// /summary/// param nameconfigFilePath/parampublic static void Log4NetInit(string configFilePath){log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(configFilePath));}/// summary/// 返回指定名称的日志对象/// /summarypublic static log4net.ILog Log(string appenderName){return log4net.LogManager.GetLogger(appenderName);}}
1.5 在主程序中引用 最后一步就是在主程序中引用 Log4Helper 中的日志记录方法如下所示
private void Application_Startup(object sender, StartupEventArgs e){Log4Helper.TestDefaultLog();}
根据上面 log4net.config 配置中 file 节点中的地址在项目中会生成 Log 文件夹该文件夹下会生成类似 DefalutLog_2024-10-28.log 的文件。该文件名由 file 节点和 datePattern 节点两部分组合而成其中staticLogFileName节点需要被设置为 false 若为 true 则当前最新日志文件名永远为 file 节点中的名字其余日志会根据 datePattern 节点自动添加后缀。 打开日志文件会发现里面只有 WARN 警告信息例如 【日志级别】WARN
【记录时间】2024-10-28 00:18:28,828
【执行时间】[53]毫秒
【执行Log分类的名称】DefaultLog
【传入信息内容】这是条警告信息 这是因为配置中的 filter 过滤节点详见注释将其注释再次运行则会正常显示全部日志信息。 2. 配置文件节点详解 log4net的主要组成有四部分分别是 Logger、Appender、Layout、Filter等详见下方。 2.1 Logger 节点配置详解 以上文的配置为例解释
logger nameDefaultLog!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--!--如果没有定义LEVEL的值则缺省为DEBUG--level valueALL /appender-ref refFileAppenderDefault/appender-ref
/logger
level 定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由低到高依次是:
ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF 如果你 level 定义 INFO那么低于 INFO 级别以下的信息将不会记入日志啥意思呢 就是说就算你在程序里用 log.Debug() 来写入一个日志信息可是你在配置中指定 level 为 INFO由于 DEBUG 级别低于 INFO所以不会被记入日志。这样的处理非常灵活。 在具体写日志时一般可以这样理解日志等级 FATAL致命错误记录系统中出现的能使用系统完全失去功能服务停止系统崩溃等使系统无法继续运行下去的错误。例如数据库无法连接系统出现死循环。 ERROR一般错误记录系统中出现的导致系统不稳定部分功能出现混乱或部分功能失效一类的错误。例如数据字段为空数据操作不可完成操作出现异常等。 WARN警告记录系统中不影响系统继续运行但不符合系统运行正常条件有可能引起系统错误的信息。例如记录内容为空数据内容不正确等。 INFO一般信息记录系统运行中应该让用户知道的基本信息。例如服务开始运行功能已经开户等。 DEBUG 调试信息记录系统用于调试的一切信息内容或者是一些关键数据内容的输出。 appender-ref要引用的 appender 的名字由 Layout 控制输出格式。 最后还要说一个LogManager类它用来管理所有的Logger。它的GetLogger静态方法可以获得配置文件中相应的Logger
log4net.ILog log log4net.LogManager.GetLogger(logger-name); 2.2 Appender 节点配置详解 以上文的 FileAppenderDefault 节点为例 FileAppenderDefault 节点配置
!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。--appender nameFileAppenderDefault typelog4net.Appender.RollingFileAppender!--绝对路径--!--file valueD:\KangarooLog.txt/file--!--日志输出到exe程序这个相对目录下--file value../../Log/DefalutLog /!--相对路径,在项目的根目录下--!--以最后一个路径为准,所以上面的绝对路径下不会写日志--!--file value./Log/Kangaroo.txt/file--!--防止多线程时不能写Log,官方说线程非安全--!--实际使用时,本地测试正常,部署后没有不能写日志的情况--lockingModel typelog4net.Appender.FileAppenderMinimalLock /!--追加日志内容true后续输出的日志会追加到之前的日志文件--appendToFile valuetrue /!--可以为:Once|Size|Date|Composite--!--Composite为Size和Date的组合--rollingStyle valueComposite /!--日志最大个数,都是最新的--!--rollingStyle节点为Date时,该节点不起作用--!--rollingStyle节点为Size时,只能有value个日志--!--rollingStyle节点为Composite时,每天有value个日志--maxSizeRollBackups value10 /!--当备份文件时,为文件名加的后缀--!--后缀为*.txt时,例:AX.txt_2008-07-24.PxP 应该是程序上的一个bug--!--后缀为*.TXT时,例:AX.txt_2008-07-25.TXT--datePattern value_yyyy-MM-dd.log /!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--maximumFileSize value10MB /!--置为true,当前最新日志文件名永远为file节中的名字--staticLogFileName valuefalse /!--输出级别在INFO和ERROR之间的日志--!--filter typelog4net.Filter.LevelRangeFilterparam nameLevelMin valueINFO /param nameLevelMax valueERROR //filter--!--必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出--filter typelog4net.Filter.LevelMatchFilterparam nameLevelToMatch valueWARN //filterfilter typelog4net.Filter.DenyAllFilter /layout typelog4net.Layout.PatternLayoutconversionPattern value%n%n【日志级别】%-5level%n【记录时间】%date%n【执行时间】[%r]毫秒%n【执行Log分类的名称】%logger%n【传入信息内容】%message%n//layout/appender
每个节点均写有注释这里额外介绍下 appender 的输出方式( type 属性)如下所示 appender 输出方式
AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式。AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志。BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。ConsoleAppender 将日志输出到应用程序控制台。EventLogAppender 将日志写到Windows Event Log。FileAppender 将日志输出到文件。ForwardingAppender 发送日志事件到子Appenders。LocalSyslogAppender 将日志写到local syslog service (仅用于UNIX环境下)。MemoryAppender 将日志存到内存缓冲区。NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。OutputDebugStringAppender 将日志输出到Debuger如果程序没有Debuger就输出到系统Debuger。如果系统Debuger也不可用将忽略消息。RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service。RemotingAppender 通过.NET Remoting将日志写到远程接收端。RollingFileAppender 将日志以回滚文件的形式写到文件中。SmtpAppender 将日志写到邮件中。SmtpPickupDirAppender 将消息以文件的方式放入一个目录中像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。TelnetAppender 客户端通过Telnet来接受日志事件。TraceAppender 将日志写到.NET trace 系统。UdpAppender 将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。
2.3 Filter 节点配置详解 filter只能作为 appender 的子元素type 属性表示 Filter 的类型。常用子元素 param 数量0个或多个作用设置一些参数。 额外补充下 filter 的类型说明:
DenyAllFilter 阻止所有的日志事件被记录LevelMatchFilter 只有指定等级的日志事件才被记录LevelRangeFilter 日志等级在指定范围内的事件才被记录LoggerMatchFilter Logger名称匹配才记录PropertyFilter 消息匹配指定的属性值时才被记录StringMathFilter 消息匹配指定的字符串才被记录
2.4 Layout 节点配置详解 layout 节点只能作为 appender 的子元素。type 属性表示 Layout 的类型。 额外补充 layout 节点的 type 属性取值
ExceptionLayout 只呈现日志事件中异常的文本信息PatternLayout 可以通过类型字符串来配置的布局RawPropertyLayout 从日志事件中提取属性值RawTimeStampLayout 从日志事件中提取日期RawUtcTimeStampLayout 从日志事件中提取UTC日期SimpleLayout 很简单的布局XmlLayout 把日志事件格式化为XML元素的布局
这其中我们主要使用的还是PatternLayout 类型而在 ConversionPattern 节点中我们可以进一步的配置日志输出格式以 PatterLayout 的格式化字符串输出为例 PatterLayout 的格式化字符串 %m、%message 输出的日志消息%d、%datetime 输出当前语句运行的时刻格式%date{yyyy-MM-dd HH:mm:ss,fff}%r、%timestamp 输出程序从运行到执行到当前语句时消耗的毫秒数%p、%level 日志的当前优先级别%c、%logger 当前日志对象的名称%L、%line 输出语句所在的行号%F、%file 输出语句所在的文件名警告只在调试的时候有效调用本地信息会影响性能%a、%appdomain 引发日志事件的应用程序域的名称。%C、%class、%type 引发日志请求的类的全名警告会影响性能%exception 异常信息%u、%identity 当前活动用户的名字我测试的时候%identity返回都是空的。警告会影响性能%l、%location 引发日志事件的名空间、类名、方法、行号。警告会影响性能依赖pdb文件%M、%method 发生日志请求的方法名警告会影响性能%n、%newline 换行符%x、%ndc NDC(nested diagnostic context)%X、%mdc、%P、%properties 等介于 %property%property 输出{log4net:Identity, log4net:UserName, log4net:HostName} %t、%thread 引发日志事件的线程如果没有线程名就使用线程号。%w、%username 当前用户的WindowsIdentity,类似HostName/Username。警告会影响性能%utcdate 发生日志事件的UTC时间。例如%utcdate{HH:mm:ss,fff}%% 输出一个百分号
额外补充下 PatterLayout 格式修饰符
格式修饰符对齐最小宽最大宽说明%20logger右对齐20无如果logger名不足20个字符就在左边补空格%-20logger左对齐20无如果logger名不足20个字符就在右边补空格%.30logger左对齐无30超过30个字符将截断%20.30logger右对齐2030logger名要在20到30之间少了在左边补空格多了截断%-20.30logger左对齐2030logger名要在20到30之间少了在右边补空格多了截断 3. 如何输出自定义类 自定义扩展输出通过继承 log4net.Layout.PatternLayout 和 log4net.Layout.Pattern.PatternLayoutConverter 类使用 log4net.Core.LoggingEvent 类的方法得到了要输出的 LogEntity 类的名称。 然后通过反射得到各个属性的值使用 PatternLayout 类 AddConverter 方法传入得到的值在 PatternLayoutConverter 中对其进行处理。注意配置文件 Appender 中的 Layout type 用到的类的命名空间以及类名要同步更改为自定义类的。详见示例
自定义拓展类的代码
namespace WPFPractice
{public class CustomLayout : log4net.Layout.PatternLayout{public CustomLayout(){this.AddConverter(Custom, typeof(CustomConvert));}}public class CustomConvert : log4net.Layout.Pattern.PatternLayoutConverter{protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent){if (!string.IsNullOrEmpty(Option)){object obj loggingEvent.MessageObject;if (obj ! null){PropertyInfo info obj.GetType().GetProperty(Option);if (info ! null){object cusMsg info.GetValue(obj, null);writer.Write(cusMsg);}}}}}
}
与之对应的我们的配置文件也添加以下代码
配置文件新增代码
logger nameCustomLog!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--!--如果没有定义LEVEL的值则缺省为DEBUG--level valueALL /appender-ref refFileAppenderCustom/appender-ref/loggerappender nameFileAppenderCustom typelog4net.Appender.RollingFileAppenderfile value../../Log/CustomLog /appendToFile valuetrue /lockingModel typelog4net.Appender.FileAppenderMinimalLock /rollingStyle valueComposite /maxSizeRollBackups value5 /datePattern value_yyyy-MM-dd.log /maximumFileSize value10MB /staticLogFileName valuefalse /layout typeWPFPractice.CustomLayoutconversionPattern value%n%n【日志级别】%-5level%n【记录时间】%date%n【执行时间】[%r]毫秒%n【执行线程ID】[%thread]%n【执行Log分类的名称】%logger%n【耗材类型名】%Custom{LabTypeName}%n【耗材名】%Custom{LabName}%n【耗材编号】%Custom{LabNumber}%n【是否吸头】%Custom{IsTip}%n【传入信息内容/类型】%message%n //layout/appender
接下来我们新建一个类 LabwareModel并在帮助类 Log4Helper 中添加调用 CustomLog 的方法来测试能否输出自定义类 LabwareModel 中的内容。
自定义类 LabwareModel
public class LabwareModel
{public string LabTypeName { get; set; } 采样管;public string LabName { get; set; } Custom_2000ul;public double LabNumber { get; set; } 200;public int IsTip { get; set; } 1;
}
帮助类 Log4Helper 如下
查看帮助类 Log4Helper private static readonly log4net.ILog logDefault log4net.LogManager.GetLogger(DefaultLog);/// summary/// 生成默认实例/// /summary/// returns/returnspublic static LabwareModel GetLabwareModel() {LabwareModel labwareModel new LabwareModel();return labwareModel;}/// summary/// 测试自定义配置信息输出/// /summarypublic static void TestCustomLog(){var labware GetLabwareModel();logCustom.Debug(这是条调试信息);logCustom.Info(这是条提示信息);logCustom.Warn(这是条警告信息);logCustom.Error(labware);logCustom.Fatal(这是条致命错误信息);}
在主程序中调用进行测试
private void Application_Startup(object sender, StartupEventArgs e)
{Log4Helper.TestCustomLog();Log4Helper.TestDefaultLog();
}
根据上面 FileAppenderCustom 配置中 file 节点中的地址在项目中会生成 Log 文件夹该文件夹下会生成类似 CustomLog_2024-10-28.log 的文件。打开文件会看到输出内容如下
日志输出内容 【日志级别】DEBUG
【记录时间】2024-10-28 00:18:28,812
【执行时间】[37]毫秒
【执行线程ID】[1]
【执行Log分类的名称】CustomLog
【耗材类型名】
【耗材名】
【耗材编号】
【是否吸头】
【传入信息内容/类型】这是条调试信息 【日志级别】INFO
【记录时间】2024-10-28 00:18:28,823
【执行时间】[48]毫秒
【执行线程ID】[1]
【执行Log分类的名称】CustomLog
【耗材类型名】
【耗材名】
【耗材编号】
【是否吸头】
【传入信息内容/类型】这是条提示信息 【日志级别】WARN
【记录时间】2024-10-28 00:18:28,825
【执行时间】[50]毫秒
【执行线程ID】[1]
【执行Log分类的名称】CustomLog
【耗材类型名】
【耗材名】
【耗材编号】
【是否吸头】
【传入信息内容/类型】这是条警告信息 【日志级别】ERROR
【记录时间】2024-10-28 00:18:28,826
【执行时间】[51]毫秒
【执行线程ID】[1]
【执行Log分类的名称】CustomLog
【耗材类型名】采样管
【耗材名】Custom_2000ul
【耗材编号】200
【是否吸头】1
【传入信息内容/类型】WPFPractice.LabwareModel 【日志级别】FATAL
【记录时间】2024-10-28 00:18:28,828
【执行时间】[53]毫秒
【执行线程ID】[1]
【执行Log分类的名称】CustomLog
【耗材类型名】
【耗材名】
【耗材编号】
【是否吸头】
【传入信息内容/类型】这是条致命错误信息