硬件管理平台-硬件产品库-日志模块
硬件管理平台-硬件产品库-日志模块
log4net
本项目使用的是log4net,实际上没有什么原因,也没有怎么进行选型,因为他比较符合log4j,因此选择了log4net,的确有些草率。
随着log4j爆出了大漏洞,只能希望log4net是没有的。
使用范围
使用log4net最主要是给硬件项目使用的,因为硬件项目是反射的代码,在现场时除了网关项目外,内部的代码是最难跟踪的,运行期间如果出现问题我们也无法还原,所以log4net主要用于硬件项目。
正文
在硬件项目中我们引用log4net模块,这样有个好处是可以定位到具体项目的位置,所以每个项目都需要引用一次log4net模块。
-
通过使用Nuget添加log4net的依赖
-
在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".log"" /> <!--按照何种方式产生多个日志文件(日期[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".log"" /> <!--按照何种方式产生多个日志文件(日期[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,分别为logerror和logerinfo,分别代表错误日志和日常输出日志。
-
在HardwareGatewayProductization项目的Properties->AssemblyInfo.cs添加
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
-
在HardwareGatewayProductization项目中添加log4net的声明,如果不添加系统会默认不引用,这样子就导致了硬件项目也无法引用成功
#region 添加log日志变量 readonly ILog _loginfo = LogManager.GetLogger("loginfo"); readonly ILog _logerror = LogManager.GetLogger("logerror"); #endregion
综上所述:最外层的项目(启动项目)必须将log4net的配置,引用,声明都走完,其子项目才能使用,否则无法生效,而且还不会报错。
只能通过调试发现_loginfo的相关属性都为false
而真正成功时_loginfo的属性下图所示:
-
在空调硬件项目中添加代码: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); }
-
在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)]
可直接定位到具体文件的特定行,这样有助于我们查找问题。