c#lognet4日志使用

本文详细介绍了Log4Net的日志配置流程,包括Nuget包的安装、配置文件的设置、日志级别的定义及各类Appender的使用,帮助开发者理解和应用Log4Net进行有效的日志管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:首先从Visual Studio中的Nuget包管理中搜索下载 Log4Net dll文件
选择安装的项目(哪个类库中需要记录日志就勾选上)
在这里插入图片描述
在上面搜索lognet,下载第一个
在这里插入图片描述

第二步:打开配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <!--类库-->
  <log4net>
    <!--类:名字叫ErrorLog    证明这个类要用来记录错误信息-->
    <logger name="ErrorLog">
      <!--设置这个类的等级是最低-->
      <level value="ALL"/>
      <!--设置这个引用-->
      <appender-ref ref="AppenderError"/>
    </logger>
    <!--类:名字叫InforLog    证明这个类要用来记录普通信息-->
    <logger name="InforLog">
      <level  value="ALL"/>
      <appender-ref ref="AppenderInfor"/>
    </logger>
    <!--提供记录错误信息的类中对错误信息的记录方式,记录方式是将信息日志写进一个文件中-->
    <appender name="AppenderError" type="log4net.Appender.RollingFileAppender">
      <!--设置文件存储的位置-->
      <param  name="File" value="Log\\Error\\"/>
      <param name="MaxSizeRollBackups" value="100" />
      <!--是否追加到文件-->
      <param name="AppendToFile" value="true"/>
      <!--当个日志文件的最大大小-->
      <param name="MaxFileSize" value="1024" />
      <!--是否使用静态文件名-->
      <param name="StaticLogFileName" value="false" />
      <!--日志文件名-->
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
      <!--文件创建的方式,这里是以Date方式创建  size  Composite-->
      <param name="RollingStyle" value="Date" />
      <!--记录日志信息的格式-->
      <layout type="log4net.Layout.PatternLayout">
       <param name="ConversionPattern" value="%n异常时间:%d %n异常级别:%-5p%n异常内容:%m%n" />
      </layout>
    </appender>
    <appender name="AppenderInfor" type="log4net.Appender.RollingFileAppender">
      <!--设置文件存储的位置-->
      <param  name="File" value="Log\\Infor\\"/>
      <param name="MaxSizeRollBackups" value="100" />
      <!--是否追加到文件-->
      <param name="AppendToFile" value="true"/>
      <!--当个日志文件的最大大小-->
      <param name="MaxFileSize" value="1024" />
      <!--是否使用静态文件名-->
      <param name="StaticLogFileName" value="false" />
      <!--日志文件名-->
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
      <!--文件创建的方式,这里是以Date方式创建  size  Composite-->
      <param name="RollingStyle" value="Date" />
      <!--记录日志信息的格式-->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p  %n日志内容:%m%n%n" />
      </layout>
    </appender>
      </log4net>
</configuration>

第三步:打开项目AssemblyInfo.cs文件(UI层)最下面添加

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]

在这里插入图片描述

第四步:在需要记录日志的cs文件中初始化: 创建一个类在这里插入图片描述
在这里插入图片描述
然后在以上配置文件中找到路径去文件夹里看看就生成了日志文件了。

Log4Net结构

(1)Log4Net核心组件
Log4net主要分为5个核心组件: Logger, Appender, Filter, Layout, Object Render。

( 2)Logger介绍
Logger是负责日志的记录者,假设我们需要记录一些正常的运行时日志和出现异常时的错误日志,那么我们可以通过在配置文件当中添加两个Logger实现。Logger主要用于记录日志的分类和控制日志的级别。
它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。 log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。

(3)Appender介绍 Appender提供记录的介质,我们可能要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置。我们可以通过Appender配置实现,而且Log4Net当中已经默认提供了一些常用的Appender,我们可以简单地修改一些配置文件就实现同时向数据库和同时向文件中写入的功能。

(4)Filter介绍 Filter就是过滤器,使用过滤器可以过滤掉Appender输出的部分内容,只输出感兴趣的日志。

(5)Layout介绍 Layout用于控制Appender的输出格式,可以使线性的也可以使XML。一个Appender只能有一个Layout配置。

(6)Object Render介绍 Object Render将告诉logger如何把一个对象转化为一个字符串记录到日志里。ILog中定义的记录日志的方法接收的参数是Object,而不是String。 例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它。这时logger就会知道如何把Orange记录到日志中了。

logger节点配置详解

logger节点支持的属性:name、additivity。

name : 必须的,logger的名称,在代码中得到ILog对象时用到。
additivity: 可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。

logger支持的子元素:level、appender-ref、param。
level : 最多一个。在这个级别或之上的才会被记录。OFF、FATAL、ERROR、WARN 、INFO、DEBUG、ALL appender-ref : 0个或多个,要引用的appender的名字。
param : 0个或多个,设置一些参数。

日志级别等级 高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL

appender节点配置

支持的属性:name、type(name属性必须唯一,type属性必须指定)。
name 必须的,appender对象的名称
type 必须的,appender对象的输出类型

常用的子元素:appender-ref、filter、layout、param
appender-ref 0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。 filter 0个或多个,定义此appender使用的过滤器。
layout 最多一个。定义appender使用的输出格式。
param 0个或多个, 设置Appender类中对应的属性的值。
appender的输出方式(type属性)
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的形式广播。

filter节点配置

filter只能作为的子元素,type属性表示Filter的类型。
常用子元素数量0个或多个,作用设置一些参数。

filter的类型说明
DenyAllFilter 阻止所有的日志事件被记录
LevelMatchFilter 只有指定等级的日志事件才被记录
LevelRangeFilter 日志等级在指定范围内的事件才被记录
LoggerMatchFilter Logger名称匹配,才记录
PropertyFilter 消息匹配指定的属性值时才被记录
StringMathFilter 消息匹配指定的字符串才被记录
MdcFilter
NdcFilter

Layout节点配置详解

layout节点配置
layout节点只能作为的子元素。type属性表示Layout的类型。常用子元素数量0个或多个,作用设置一些参数。
Layout用于控制Appender的输出格式,可以使线性的也可以使XML。最常用的Layout应该是用户自定义格式的PatternLayout,其次是SimpleLayout和ExceptionLayout。然后还有4个Layout,其中有两个是输出Xml的Layout,但是中文会有问题。ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。

layout节点的type属性取值
ExceptionLayout 只呈现日志事件中异常的文本信息
PatternLayout 可以通过类型字符串来配置的布局
RawPropertyLayout 从日志事件中提取属性值
RawTimeStampLayout 从日志事件中提取日期
RawUtcTimeStampLayout 从日志事件中提取UTC日期
SimpleLayout 很简单的布局
XmlLayout 把日志事件格式化为XML元素的布局

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    右对齐       20             30             logger名要在20到30之间,少了在左边补空格,多了截断
%-20.30logger   左对齐       20             30             logger名要在20到30之间,少了在右边补空格,多了截断

<think>好的,我现在需要处理用户的问题,用户问的是关于C#中的HslCommunication.LogNet。首先,我需要回忆一下HslCommunication这个库的相关信息。HslCommunication是一个由中国开发者开发的开源库,主要用于工业通信和数据采集,支持多种协议如Modbus、西门子PLC通信等。而LogNet应该是这个库中的日志记录模块。 接下来,我要确定用户的具体需求。用户可能是在使用HslCommunication时遇到了日志记录的问题,或者想了解如何正确使用LogNet模块。用户之前问过关于C#处理字节数组写入文件的问题,现在转向日志记录,可能是在开发过程中需要记录通信日志或其他操作日志。 用户的问题结构可能希望得到一个介绍,包括功能、基本用法、配置选项、注意事项等。需要结构清晰,分点说明。同时用户之前的回复中使用了表格和代码示例,可能希望类似的详细说明。 首先,我需要确认HslCommunication.LogNet的主要功能。根据记忆,LogNet提供了分级的日志记录(如Debug、Info、Error等),支持多种存储方式(文本文件、数据库等),可能有日志轮转、按大小或时间分割文件的功能。 接下来,需要整理基本使用步骤。比如如何初始化日志实例,如何记录不同级别的日志,如何配置存储路径和格式。此外,可能还需要提到线程安全性,因为日志记录通常涉及异步操作。 然后,考虑高级配置,比如日志文件的最大数量、单个文件大小限制、自动删除旧日志等。这些都是实际应用中常见的需求。 同时,需要注意潜在的问题,比如权限问题导致无法写入日志文件,日志级别配置不当导致日志过多或过少,以及性能影响。特别是高频率的日志记录可能影响程序性能,需要合理配置。 还要考虑用户可能的使用场景,比如工业控制环境中,日志的可靠性和实时性要求较高,可能需要确保日志模块的稳定性和效率。此外,是否需要示例代码来说明如何初始化和使用LogNet,比如创建LogNet实例,记录信息、错误等。 需要验证HslCommunication的文档或示例代码,确保提供的信息准确。比如,是否LogNet有不同的实现类,如LogNetFile用于文件存储,LogNetDateTime根据时间分割文件,或者LogNetSingle单例模式。 可能还需要提到日志的检索和分析,比如如何通过日志文件来排查通信故障,或者集成到现有的日志系统中。如果LogNet支持自定义的日志处理器,用户可能需要扩展功能,比如将日志发送到远程服务器。 最后,总结使用LogNet的最佳实践,帮助用户避免常见错误,如定期清理日志、合理设置日志级别、异常处理等。确保用户能够高效、可靠地使用日志模块。</think>以下是关于C# `HslCommunication.LogNet` 的详细介绍和分析: --- ### **一、组件定位** `HslCommunication.LogNet` 是开源库 **HslCommunication** 中的日志记录模块,专为工业通信场景设计,提供**线程安全、高性能的日志管理**功能,支持: - 多级别日志记录(DEBUG/INFO/WARN/ERROR) - 多种存储模式(文件、数据库、内存等) - 日志文件自动分割与清理 - 时间戳精确到毫秒级 --- ### **二、核心功能解析** #### 1. **日志等级控制** ```csharp LogNetBase.LogLevel = LogLevel.DEBUG; // 设置记录的最低级别 ``` | 等级 | 典型应用场景 | |---------|------------------------------| | DEBUG | 调试细节(如通信字节流) | | INFO | 关键操作记录(连接/断开) | | WARN | 非致命异常(超时重试) | | ERROR | 系统级错误(硬件通信失败) | #### 2. **存储模式对比** ```csharp // 文件存储(按大小分割) ILogNet log = new LogNetFile("logs/comm.log", 1024*1024); // 文件存储(按日期分割) ILogNet log = new LogNetDateTime("logs/", LogVolumePer.Day); // 内存存储(调试用) ILogNet log = new LogNetMemory(); ``` | 模式 | 优势 | 适用场景 | |--------------|---------------------------|------------------------| | `LogNetFile` | 硬盘存储,可靠性高 | 长期运行的生产环境 | | `LogNetDateTime` | 按时间归档方便检索 | 需要历史追溯的系统 | | `LogNetMemory` | 零IO延迟,快速存取 | 单元测试/临时调试 | #### 3. **关键方法** ```csharp log.WriteDebug("Received: " + ByteArrayToHex(data)); // DEBUG级日志 log.WriteException("PLC通信超时", ex); // 自动记录异常堆栈 log.FiltrateKeyword = "Error"; // 关键词过滤 ``` --- ### **三、最佳实践** #### 1. **初始化配置** ```csharp ILogNet log = new LogNetDateTime( savePath: @"C:\Logs", generateFile: LogVolumePer.Hour, maxFileCount: 168 // 保留最近7天日志(24*7) ); log.LogSaveMode = LogSaveMode.Console | LogSaveMode.File; // 双输出 ``` #### 2. **异常处理模板** ```csharp try { plc.ReadBytes("D100", 10); } catch (Exception ex) { log.WriteException($"读取D100失败", ex); log.WriteWarn("尝试切换备用通道..."); // 重试逻辑 } ``` #### 3. **性能优化建议** - 避免高频记录大体积数据(如持续记录原始字节流) - 生产环境建议关闭`DEBUG`级别 - 使用异步写入(组件内部已实现队列缓冲) --- ### **四、典型问题排查** 1. **无日志文件生成** - 检查目录权限:应用程序需有写入权限 - 验证日志级别:确保当前日志等级≤输出等级 2. **日志内容不全** ```csharp // 确保在程序退出前刷新缓冲区 log.Dispose(); ``` 3. **磁盘空间不足** ```csharp new LogNetFile(..., maxFileCount: 100); // 限制最大文件数 ``` --- ### **五、扩展应用** 通过继承`ILogNet`接口可实现自定义日志行为: ```csharp public class DatabaseLogger : ILogNet { public void WriteLog(LogLevel level, string keyWord, string text) { // 写入SQL Server/MongoDB等 } } ``` --- **推荐使用场景**:工业PLC通信监控、SCADA系统运行日志、设备报文分析等对日志完整性和可靠性要求较高的领域。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值