易语言系列——日志系统

想给项目软件写一个日志系统,各个论坛找了半天,没找到合适的,自己写了个。

主要实现以下内容:

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
        写日志_多线程 (“成功删除超过” + 到文本 (超过天数) + “天的日志文件-” + 找到的文件)
    .如果真结束

    找到的文件 = 寻找文件 (, )
.判断循环尾 ()

长时间运行的程序(例如服务器程序),或者流程复杂的多线程程序,打日志几乎是必需的,然而易这个圈子我到目前为止没有见过任何一个正经的日志轮子。 关于无锁 :无锁直接在未知的项目中大量使用的话,可能会比有锁的日志安全。 关于性能 :开启自动轮替,比 CreateFile + WriteFile + 临界资源 直接写慢一点, 但是要注意 ,后者没有自动轮替,而且后者的自动轮替实现起来相对复杂,而且轮替的过程中容易阻塞、死锁或者丢失日志,而打日志最重要的就是【千万不要丢失日志】。 什么是自动轮替: 英文名 LogRotate,例如日志文件隔了一天就要换一个文件,否则文件越来越大,而且也不好整理和管理。比如默认每隔一天轮替一次。 我在这个日志系统里还加入了按照文件大小轮替,比如默认 100MB 轮替一次,太大了分析起来很吃力,编辑器带不动(我的日志不会太多,所以我自己使用会按照 10MB 来轮替,但是如果你的日志很频繁,轮替大小设置太小就会影响性能了)。 关于代码 : 代码从某天想起到成型也没有多久(事实上今天才算写了个雏形),没有经历过正式的项目,经历了好几个版本所以也没有整理得很好看(相对的,可读性也还算可以了)。注释不多,对原理感兴趣的可以自行面向搜索引擎理解,不懂也可以交流。 吐槽 : 易的自定义数据类型真的慢啊。。。感谢 kyozy 指点,以后能不用自定义数据类型就不用了。 最后,这是个简陋的轮子,希望各位多多扩展和贡献代码,一个人的精力有限,所涉及的项目规模和场景也有限,所以... 我觉得这是个简陋但是很有意义的源码,希望各位与我一起完成它。 源码下载: 测试看  _临时子程序()  下面的  测试_无锁日志()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值