日志:存储项目发生的所有事情
数据格式:时间+操作+结果
日志文件的后缀:***.log
作用:通过分析日志有助于项目bug的修复;有助于历史的回溯
日志的级别:Info信息、Warning警告、Debug调试、Error错误、Fatal致命错误
日志工具:log4net,使用时需要进行配置
1.导入工具类
cs
using log4net;
using System;
using System.Reflection;
namespace ZK.VP3
{
public static class LogHelper
{
// 从配置文件中根据名字获取
public static readonly ILog loginfo = LogManager.GetLogger("loginfo");
public static readonly ILog logerror = LogManager.GetLogger("logerror");
public static readonly ILog logdebug = LogManager.GetLogger("logdebug");
public static readonly ILog logwarn = LogManager.GetLogger("logwarn");
public static readonly ILog logfatal = LogManager.GetLogger("logfatal");
public static readonly ILog logDynamic = LogManager.GetLogger("logDynamic");
private static readonly ILog logDefault = LogManager.GetLogger("logcustom");
public static void Info(object info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
public static void Info(object excptionType, object message, object stackTrace)
{
if (loginfo.IsInfoEnabled)
{
loginfo.ErrorFormat("{0}:{1}\n{2}", excptionType, message, stackTrace);
}
}
public static void Debug(object info)
{
if (logdebug.IsDebugEnabled)
{
logdebug.Debug(info);
}
}
public static void Debug(object info, Exception ex)
{
if (logdebug.IsDebugEnabled)
{
logdebug.Debug(info, ex);
}
}
public static void Warn(object info)
{
if (logwarn.IsWarnEnabled)
{
logwarn.Warn(info);
}
}
public static void Error(object info)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info);
}
}
public static void Error(object info, Exception se)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, se);
}
}
public static void Fatal(object info)
{
if (logfatal.IsFatalEnabled)
{
logfatal.Fatal(info);
}
}
public static void Fatal(object info, Exception se)
{
if (logfatal.IsFatalEnabled)
{
logfatal.Fatal(info, se);
}
}
public static void Other(object info)
{
if (logDynamic.IsInfoEnabled)
{
logDynamic.Info(info);
}
}
public static void CustomInfo(object info)
{
if (logDefault.IsInfoEnabled)
{
logDefault.Info(info);
}
}
}
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;
}
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);
}
}
}
}
}
}
2.安装第三方工具

3.添加配置文件log4net.config
cs
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<root>
<level value="ALL" />
</root>
<logger name="OperationLog">
<level value="INFO" />
<appender-ref ref="OperationLogAppender" />
</logger>
<logger name="ErrorLog">
<level value="WARN" />
<appender-ref ref="ErrorLogAppender" />
</logger>
<!--错误日志类-->
<logger name="logerror">
<!--日志类的名字-->
<level value="ALL" />
<!--定义记录的日志级别-->
<appender-ref ref="ErrorAppender" />
<!--记录到哪个介质中去-->
</logger>
<!--信息日志类-->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="InfoAppender" />
</logger>
<!--调试日志类-->
<logger name="logdebug">
<!--日志类的名字-->
<level value="ALL" />
<!--定义记录的日志级别-->
<appender-ref ref="DebugAppender" />
<!--记录到哪个介质中去-->
</logger>
<!--警告日志类-->
<logger name="logwarn">
<!--日志类的名字-->
<level value="ALL" />
<!--定义记录的日志级别-->
<appender-ref ref="WarnAppender" />
<!--记录到哪个介质中去-->
</logger>
<!--重大错误日志类-->
<logger name="logfatal">
<!--日志类的名字-->
<level value="ALL" />
<!--定义记录的日志级别-->
<appender-ref ref="FatalAppender" />
<!--记录到哪个介质中去-->
</logger>
<!--动态日志类-->
<logger name="logDynamic">
<level value="ALL" />
<appender-ref ref="DynamicAppender" />
</logger>
<!-- 自定义日志类 -->
<logger name="logcustom">
<level value="ALL" />
<appender-ref ref="FileAppenderCustom"></appender-ref>
</logger>
<!--定义输出到文件中-->
<!--错误日志附加介质-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
<param name="File" value="..\\Log\\LogError\\" />
<!--日志输出到exe程序这个相对目录下-->
<param name="AppendToFile" value="true" />
<!--输出的日志不会覆盖以前的信息-->
<param name="MaxSizeRollBackups" value="100" />
<!--备份文件的个数-->
<param name="MaxFileSize" value="10240" />
<!--当个日志文件的最大大小-->
<param name="StaticLogFileName" value="false" />
<!--是否使用静态文件名-->
<param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd".htm"" />
<!--日志文件名-->
<param name="RollingStyle" value="Date" />
<!--文件创建的方式,这里是以Date方式创建-->
<!--错误日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=red>%n异常时间:%d [%t] <BR>%n异常级别:%-5p <BR>%n异 常 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
<!--重大错误日志附加介质-->
<appender name="FatalAppender" type="log4net.Appender.RollingFileAppender">
<!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
<param name="File" value="..\\Log\\LogFatal\\" />
<!--日志输出到exe程序这个相对目录下-->
<param name="AppendToFile" value="true" />
<!--输出的日志不会覆盖以前的信息-->
<param name="MaxSizeRollBackups" value="100" />
<!--备份文件的个数-->
<param name="MaxFileSize" value="10240" />
<!--当个日志文件的最大大小-->
<param name="StaticLogFileName" value="false" />
<!--是否使用静态文件名-->
<param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd".htm"" />
<!--日志文件名-->
<param name="RollingStyle" value="Date" />
<!--文件创建的方式,这里是以Date方式创建-->
<!--错误日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=red>%n异常时间:%d [%t] <BR>%n异常级别:%-5p <BR>%n异 常 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
<!--信息日志附加介质-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="..\\Log\\LogInfo\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd".txt"" />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<!--param name="ConversionPattern" value="<HR COLOR=blue>%n日志时间:%d [%t] <BR>%n日志级别:%-5p <BR>%n日 志 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /-->
<param name="ConversionPattern" value="[日志时间:%d] [%t] [%-5p]:%m%n" />
</layout>
</appender>
<!--调试日志附加介质-->
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="..\\Log\\LogDebug\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd".txt"" />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<!--param name="ConversionPattern" value="<HR COLOR=blue>%n日志时间:%d [%t] <BR>%n日志级别:%-5p <BR>%n日 志 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /-->
<param name="ConversionPattern" value="[日志时间:%d] [%t] [%-5p]:%m%n" />
</layout>
</appender>
<!--警告日志附加介质-->
<appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="..\\Log\\LogWarn\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd".txt"" />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<!--param name="ConversionPattern" value="<HR COLOR=blue>%n日志时间:%d [%t] <BR>%n日志级别:%-5p <BR>%n日 志 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /-->
<param name="ConversionPattern" value="[日志时间:%d] [%t] [%-5p]:%m%n" />
</layout>
</appender>
<!--动态日志附加介质-->
<appender name="DynamicAppender" type="log4net.Appender.RollingFileAppender">
<!--输出日志文件的路径-->
<param name="File" value="..\\Log\\LogOther\\" />
<!--输出日志时自动向后追加-->
<param name="AppendToFile" value="true" />
<!--防止多线程时不能写Log,官方说线程非安全,但实际使用时,本地测试正常,部署后有不能写日志的情况-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd".txt"" />
<param name="RollingStyle" value="Date" />
<!--输出格式-->
<!--样例:[日志时间:2023-11-08 10:56:12,247] [1] [INFO ]:系统启动!-->
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="[日志时间:%d] [%t] [%-5p]:%m%n" />
</layout>
</appender>
<!-- 自定义日志附加介质 -->
<appender name="FileAppenderCustom" type="log4net.Appender.RollingFileAppender">
<!--输出日志文件的路径-->
<param name="File" value="..\\Log\\LogCustom\\" />
<!--输出日志时自动向后追加-->
<appendToFile value="true" />
<!--防止多线程时不能写Log,官方说线程非安全,但实际使用时,本地测试正常,部署后有不能写日志的情况-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd".txt"" />
<param name="RollingStyle" value="Date" />
<layout type="ZK.VP3.CustomLayout">
<conversionPattern 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>
</log4net>
</configuration>
4.将log4net.config的复制模式修改为始终复制
5.在AssemblyInfo.cs中指定配置
cs
//添加
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
6.在需要生成日志的位置调用