在linux中有内建基于日志系统标准协议的日志记录系统,详情参考笔者的文章-Linux日志系统架构和文件 。python编程中, Python标准库中的logging模块提供了日志相关的功能,详情参考-Python使用logging模块完成日志记录 。上面的两个日志记录的方法都可以完成日志记录与日志轮转。在测控领域的LabVIEW平台,笔者以前都是用数据库来保存告警信息,但是对于大量的运行信息保存在数据库就不合适,笔者在思考LabVIEW怎么实现监控的日志系统呢?
于是乎,在NI的技术支持网页上面找到了一个函数,一个平时没有注意到的函数。
当使用打开/创建/替换文件函数(Open/Create/Replace File)来打开文件。当我多次写入文件时,存储在文件中的数据在每次写入时都会被新数据覆盖。如何在每次写入文件时将新数据附加到文件末尾?在实际的应用场景中,即完成日志信息写入文件中。
使用编程»文件I / O»高级文件函数下的函数选板上的“设置文件位置” 函数(Set File Position),并此VI的from(0:start)枚举输入设置为end ,设置文件位置函数中的引用句柄连接到写入文件的VI的文件输入,这会将新数据附加到文件末尾。
行尾常量(End of Line Constant)(在示例中参见)在这种情况下连接到字符串输入,以便为写入文件的每个值创建一个新行。如果在“写入文本文件”函数中输入数组类型,则不需要此常量,因为它会自动将其添加到值末尾。
日志文件以年月(根据日志量大小,或者可以定位为更小周期)来命名,在存在这个文件时就写入日志信息,不存在这个文件时说明到了月度轮换,写到下一个月命名的日志文件中。下面的案例时笔者循环六次写入到文本文件中,同时字符串可以替换为字符串数组,这样就不需要行结束符。
生成日志文件后,对于过期的文件怎么删除呢?这里就使用(windows平台)批处理来完成这个功能。如下,路径需要替换为你自己的路径,过期时间也可以根据保留周期来修改。最后就是用windows的任务计划程序来完成定时调用这个批处理来完成过期日志删除。
forfiles /p "E:\logrecord" /s /m *.* /d -100 /c "cmd /c del @path"
那么在linux中,就使用shell脚本来删除,然后利用crontab定时调用脚本。
find /home/ubuntu/logrecord/ -mtime +100 -name '*.log' -exec rm -r {} \;
基于这个需求,笔者在VI Package Manager里面搜索log,找到了一个附加工具包Logger,这个工具包可以实现一个简单的日志实用程序,为不同的日志记录语句提供了级别:跟踪、调试、信息、警告、错误和致命,这个和python的logging库类似。使用这个包可以生成csv格式的文本日志文件。
根据这个附加工具包Logger,反馈到上面的写入文本文件函数实现的日志上面,笔者思考了两个方面的问题。
1、使用写入文本文件函数是否存在文件的资源争抢问题
附加工具包Logger写入日志文件是在单独的线程上完成的,以保持实时目标的确定性。那么反馈到上面“写入文本文件”函数中,在同时写入日志文件时会发生什么呢?笔者将上面的程序载复制一份,修改写入文件中的字符串为Other,即在一个vi中同时执行写入文本文件,查看文件发现同时操作写入时会发生问题。那么在使用写入文本文件函数来实现监控的日志系统时,一个进程只能操作一个日志文件,不然可能存在资源争抢,数据有误。
但是,笔者范了一个错误,“写入文本文件”函数封装成子vi后,程序调用这个子vi来写入日志信息到文件中,这个子vi是非重入执行,意味着调用子vi会按照顺序来执行,不会存在资源争抢的问题!
2、使用CSV文件来保存日志增强可读性
.csv是一种特殊的纯文本的文件格式(Comma Separated Values逗号分隔值),字符之间已英文字符的逗号或制表符(Tab)分隔,在windows系统环境上.csv文件打开方式有多种,如记事本、excel、VS Code等,只要是文本编辑器都能正确打开。
那么笔者在字符串中增加逗号分隔,新建文件也是.csv。程序框图如下,那么生成的日志文件就可以使用excel来打开了。
网友评论