C#日志工具类log4net的使用

日志:存储项目发生的所有事情

数据格式:时间+操作+结果

日志文件的后缀:***.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&quot;.htm&quot;" />
            <!--日志文件名-->
            <param name="RollingStyle" value="Date" />
            <!--文件创建的方式,这里是以Date方式创建-->
            <!--错误日志布局-->
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" />
            </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&quot;.htm&quot;" />
            <!--日志文件名-->
            <param name="RollingStyle" value="Date" />
            <!--文件创建的方式,这里是以Date方式创建-->
            <!--错误日志布局-->
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" />
            </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&quot;.txt&quot;" />
            <param name="RollingStyle" value="Date" />
            <!--信息日志布局-->
            <layout type="log4net.Layout.PatternLayout">
                <!--param name="ConversionPattern" value="&lt;HR COLOR=blue&gt;%n日志时间:%d [%t] &lt;BR&gt;%n日志级别:%-5p &lt;BR&gt;%n日 志 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  /-->
                <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&quot;.txt&quot;" />
            <param name="RollingStyle" value="Date" />
            <!--信息日志布局-->
            <layout type="log4net.Layout.PatternLayout">
                <!--param name="ConversionPattern" value="&lt;HR COLOR=blue&gt;%n日志时间:%d [%t] &lt;BR&gt;%n日志级别:%-5p &lt;BR&gt;%n日 志 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  /-->
                <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&quot;.txt&quot;" />
            <param name="RollingStyle" value="Date" />
            <!--信息日志布局-->
            <layout type="log4net.Layout.PatternLayout">
                <!--param name="ConversionPattern" value="&lt;HR COLOR=blue&gt;%n日志时间:%d [%t] &lt;BR&gt;%n日志级别:%-5p &lt;BR&gt;%n日 志 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  /-->
                <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&quot;.txt&quot;" />
            <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&quot;.txt&quot;" />
            <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.在需要生成日志的位置调用

相关推荐
学逆向的1 小时前
汇编——内存
开发语言·汇编·算法·网络安全
lbb 小魔仙2 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_2 小时前
Java 线程池
java·开发语言
丁小未2 小时前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
杜子不疼.2 小时前
【Qt初识】信号槽(二):自定义信号函数与槽函数
开发语言·qt
Jazz_z3 小时前
通过 Java 实现 Word 转 TXT
java·c#·word
秋田君3 小时前
Qt_QVariant
开发语言·qt
江华森3 小时前
Python 实现高德地图找房(三):地图可视化与高德 JS API
开发语言·javascript·python
丁小未3 小时前
基于MVVM框架的XUUI MoreComplex案例
unity·c#