硬件管理平台-硬件产品库-日志模块

发布时间 2023-08-05 17:34:41作者: 摧残一生

硬件管理平台-硬件产品库-日志模块

log4net

本项目使用的是log4net,实际上没有什么原因,也没有怎么进行选型,因为他比较符合log4j,因此选择了log4net,的确有些草率。

随着log4j爆出了大漏洞,只能希望log4net是没有的。

使用范围

使用log4net最主要是给硬件项目使用的,因为硬件项目是反射的代码,在现场时除了网关项目外,内部的代码是最难跟踪的,运行期间如果出现问题我们也无法还原,所以log4net主要用于硬件项目。

正文

在硬件项目中我们引用log4net模块,这样有个好处是可以定位到具体项目的位置,所以每个项目都需要引用一次log4net模块。

  1. 通过使用Nuget添加log4net的依赖

  2. HardwareGatewayProductization项目中添加log4net.config文件,并将其属性复制到输出路径改为:如果较新则复制。

    log4net.config配置文件信息为

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
      </configSections>
      <log4net>
        <logger name="logerror">
          <level value="ERROR" />
          <appender-ref ref="ErrorAppender" />
        </logger>
        <logger name="loginfo">
          <level value="INFO" />
          <appender-ref ref="InfoAppender" />
        </logger>
        <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
          <!--设置日志存储路径-->
          <param name="File" value="WebLog//LogError//" />
          <!--是否追加到文件-->
          <param name="AppendToFile" value="true" />
          <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
          <param name="MaxSizeRollBackups" value="100" />
          <param name="MaxFileSize" value="1024" />
          <!--是否只写到一个文件中-->
          <param name="StaticLogFileName" value="false" />
          <!--这是按日期产生文件夹,并在文件名前也加上日期-->
          <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />
          <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
          <param name="RollingStyle" value="Date" />
          <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异常位置:[%l][%thread] (%file:%line) %n消息描述:%message%n异常:%exception%n%n " />
          </layout>
        </appender>
        <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
          <!--设置日志存储路径-->
          <param name="File" value="WebLog//LogInfo//" />
          <!--是否追加到文件-->
          <param name="AppendToFile" value="true" />
          <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
          <param name="MaxSizeRollBackups" value="100" />
          <param name="MaxFileSize" value="1024" />
          <!--是否只写到一个文件中-->
          <param name="StaticLogFileName" value="false" />
          <!--这是按日期产生文件夹,并在文件名前也加上日期-->
          <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />
          <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
          <param name="RollingStyle" value="Date" />
          <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="日志时间:%d [%t] %n日志级别:%-5p %n消息描述:%m [%l] %n " />
          </layout>
        </appender>
      </log4net>
    </configuration>
    

    该xml表述了有两种类型的logger,分别为logerrorlogerinfo,分别代表错误日志和日常输出日志。

  3. HardwareGatewayProductization项目的Properties->AssemblyInfo.cs添加

    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
    
  4. HardwareGatewayProductization项目中添加log4net的声明,如果不添加系统会默认不引用,这样子就导致了硬件项目也无法引用成功

    #region 添加log日志变量
    readonly ILog _loginfo = LogManager.GetLogger("loginfo");
    readonly ILog _logerror = LogManager.GetLogger("logerror");
    #endregion
    

    综上所述:最外层的项目(启动项目)必须将log4net的配置,引用,声明都走完,其子项目才能使用,否则无法生效,而且还不会报错。

    只能通过调试发现_loginfo的相关属性都为false

    而真正成功时_loginfo的属性下图所示:

  5. 在空调硬件项目中添加代码:TestAirConditionClient文件中添加logger的引用

    #region 添加log日志变量
    readonly ILog _loginfo = LogManager.GetLogger("loginfo");
    readonly ILog _logerror = LogManager.GetLogger("logerror");
    #endregion
    

    我们以GetHardwareInfo方法为例,添加一个调用

    public override HardwareProperties GetHardwareInfo()
    {
        _loginfo.Info("空调测试的日志例子");
        return new HardwareProperties("04", "0401", IAriConditionClient.Type, Model, null, null, Version, Describe, typeof(AirConditionInfo), OperationFun, null, TimeingFun, null);
    }
    
  6. UtilsLibaray也添加log4net的引用,将其他项目中关于log4net的属性复制到本地都改为false。

写在最后

运行后会发现在产品库文件中新建了一个WebLog文件夹,其中LogInfo文件夹下的日志如下:

日志时间:2023-08-05 17:27:00,167 [1] 
日志级别:INFO  
消息描述:空调测试的日志例子 [_01TestAirConditionLibrary.TestAirConditionClient.GetHardwareInfo(G:\Working\笔记\MD笔记\开源项目\HardwareGatewayProject\Hardware\AirConditionLibrary\01TestAirCondition\TestAirConditionClient.cs:30)] 
 日志时间:2023-08-05 17:27:00,181 [1] 
日志级别:ERROR 
消息描述:空调测试的日志例子 [_01TestAirConditionLibrary.TestAirConditionClient.GetHardwareInfo(G:\Working\笔记\MD笔记\开源项目\HardwareGatewayProject\Hardware\AirConditionLibrary\01TestAirCondition\TestAirConditionClient.cs:31)] 

可直接定位到具体文件的特定行,这样有助于我们查找问题。