想给项目软件写一个日志系统,各个论坛找了半天,没找到合适的,自己写了个。
主要实现以下内容:
1.单线程和多线程日志写入
2.高速IO,保证大数据量下日志写入不卡顿
3.日志直接写入txt文件中,软件运行过程中可以打开和复制
4.自动删除过期的日志文件
5.每日的日志以时间戳命名单独保存
6.每条日志自动加时间戳
7.兼容大多数window版本,包括win 2000
.版本 2
.支持库 spec
.支持库 EThread
.程序集 程序集1
.程序集变量 日志文件, 文本型
.程序集变量 当前日期, 文本型
.程序集变量 日志缓冲BUFF, 文本型, , "200"
.程序集变量 日志写入数量, 整数型
.子程序 子程序1
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
.子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码
_临时子程序 () ' 在初始化代码执行完毕后调用测试代码
返回 (0) ' 可以根据您的需要返回任意数值
.子程序 _临时子程序
.子程序 日志文件初始化, , 公开
.局部变量 目录, 文本型
目录 = 取当前目录 () + “\” + “log”
.如果真 (目录_是否存在 (目录) = 假)
创建目录 (目录)
.如果真结束
日志文件 = 取当前目录 () + “\” + “log” + “\” + 到文本 (取日期 (取现行时间 ())) + “.txt”
.如果真 (文件是否存在 (日志文件) = 假)
写到文件 (日志文件, 到字节集 (“”))
.如果真结束
当前日期 = 到文本 (取日期 (取现行时间 ()))
调试输出 (“日期:” + 到文本 (当前日期))
调试输出 (“文件名:” + 日志文件)
.子程序 根据日期生成日志文件名字, 逻辑型, 公开, 当日期过去一天时,创建一个新的日志文件
.参数 历史日期, 文本型
.局部变量 当前日志日期, 文本型
.局部变量 当前时间, 日期时间型
.局部变量 当前年, 整数型
.局部变量 当前月, 整数型
.局部变量 当前日, 整数型
.局部变量 历史年, 整数型
.局部变量 历史月, 整数型
.局部变量 历史日, 整数型
.如果真 (到文本 (历史日期) = “”)
日志文件初始化 ()
返回 (真)
.如果真结束
当前时间 = 取现行时间 ()
当前日志日期 = 到文本 (取日期 (当前时间))
当前年 = 取年份 (到时间 (当前时间))
当前月 = 取月份 (到时间 (当前时间))
当前日 = 取日 (到时间 (当前时间))
历史年 = 取年份 (到时间 (历史日期))
历史月 = 取月份 (到时间 (历史日期))
历史日 = 取日 (到时间 (历史日期))
.如果真 (当前年 > 历史年 或 当前年 = 历史年 且 当前月 > 历史月 或 当前年 = 历史年 且 当前月 = 历史月 且 当前日 > 历史日)
删除过期日志 (10)
日志文件初始化 ()
返回 (真)
.如果真结束
返回 (假)
.子程序 写日志_单线程, , 公开
.参数 内容, 文本型, 参考
.局部变量 文件号, 整数型
根据日期生成日志文件名字 (当前日期)
文件号 = 打开文件 (日志文件, #改写, #无限制)
移到文件尾 (文件号)
写文本行 (文件号, 到文本 (取现行时间 ()) + “ ” + 内容)
关闭文件 (文件号)
.子程序 写日志_测试, , 公开
.参数 内容, 文本型, 参考
写日志_单线程 (“123”)
根据日期生成日志文件名字 (“2023年8月29日”)
写到文件 (日志文件, 读入文件 (日志文件) + 到字节集 (到文本 (取现行时间 ()) + “ ” + 内容 + #换行符))
根据日期生成日志文件名字 (“2024年8月28日”)
写到文件 (日志文件, 读入文件 (日志文件) + 到字节集 (到文本 (取现行时间 ()) + “ ” + 内容 + #换行符))
根据日期生成日志文件名字 (“2024年7月30日”)
写到文件 (日志文件, 读入文件 (日志文件) + 到字节集 (到文本 (取现行时间 ()) + “ ” + 内容 + #换行符))
根据日期生成日志文件名字 (“2024年8月27日”)
写到文件 (日志文件, 读入文件 (日志文件) + 到字节集 (到文本 (取现行时间 ()) + “ ” + 内容 + #换行符))
根据日期生成日志文件名字 (“2024年6月1日”)
写到文件 (日志文件, 读入文件 (日志文件) + 到字节集 (到文本 (取现行时间 ()) + “ ” + 内容 + #换行符))
.子程序 写日志_多线程初始化, , 公开, 将日志实际写入文件中
日志写入数量 = 1
启动线程 (&写日志_多线程_实际写入文件, , )
.子程序 写日志_多线程_实际写入文件, , 公开, 将日志实际写入文件中
.局部变量 文件号, 整数型
.局部变量 写入位置, 整数型
.局部变量 变量, 逻辑型
变量 = 真
写入位置 = 1
文件号 = 打开文件 (日志文件, #改写, #无限制)
.判断循环首 (变量)
.如果真 (日志写入数量 > 1)
.如果真 (根据日期生成日志文件名字 (当前日期))
关闭文件 (文件号)
文件号 = 打开文件 (日志文件, #改写, #无限制)
.如果真结束
移到文件尾 (文件号)
写文本行 (文件号, 日志缓冲BUFF [写入位置])
写入位置 = 写入位置 + 1
.如果真 (写入位置 ≥ 日志写入数量)
日志写入数量 = 1
写入位置 = 1
.如果真结束
.如果真结束
.判断循环尾 ()
.子程序 写日志_多线程, , 公开, 将日志写入环形BUFF中
.参数 内容, 文本型
.判断循环首 (日志写入数量 ≥ 200)
延时 (10)
.判断循环尾 ()
.如果真 (日志写入数量 ≤ 0)
日志写入数量 = 1
.如果真结束
内容 = 到文本 (取现行时间 ()) + “ ” + 内容
日志缓冲BUFF [日志写入数量] = 内容
日志写入数量 = 日志写入数量 + 1
.子程序 删除过期日志, , 公开
.参数 超过天数, 整数型
.局部变量 文件时间, 日期时间型
.局部变量 找到的文件, 文本型
.局部变量 文件夹路径, 文本型
.局部变量 所找文件的路径, 文本型
.局部变量 删除数量, 整数型
.局部变量 当前日志日期, 日期时间型
当前日志日期 = 取现行时间 ()
文件夹路径 = 取当前目录 () + “\” + “log” + “\”
找到的文件 = 寻找文件 (文件夹路径 + “*.txt”, )
.判断循环首 (找到的文件 ≠ “”)
所找文件的路径 = 文件夹路径 + 找到的文件
文件时间 = 取文件时间 (所找文件的路径)
.如果真 (取时间间隔 (当前日志日期, 文件时间, #日) > 到整数 (超过天数))
删除文件 (所找文件的路径)
删除数量 = 删除数量 + 1
写日志_多线程 (“成功删除超过” + 到文本 (超过天数) + “天的日志文件-” + 找到的文件)
.如果真结束
找到的文件 = 寻找文件 (, )
.判断循环尾 ()