Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 带有预分配内存的日志模块_Logging_Data Structures_Compression_Buffer Overflow_Text Compression - Fatal编程技术网

Logging 带有预分配内存的日志模块

Logging 带有预分配内存的日志模块,logging,data-structures,compression,buffer-overflow,text-compression,Logging,Data Structures,Compression,Buffer Overflow,Text Compression,我正在编写一个日志机制,其余代码将使用该机制将字母数字数据记录到文件中。系统中的每个其他模块都将发送字母数字句子(最多两个单词),以便连续写入文件。问题是,我只得到了一小部分预先分配的内存,用于数据结构和这些日志消息的内存存储。如果流入量大于可以写入磁盘的量,则日志消息将被丢弃 我想在我的日志模块中的客户机和内存存储之间加入一种压缩机制,这样我就可以保存尽可能多的消息 我目前的设计: 客户端---->日志模块--->压缩并存储在内存缓冲区1中 写入线程: 写入时,将缓冲区1与缓冲区2切换,并将缓

我正在编写一个日志机制,其余代码将使用该机制将字母数字数据记录到文件中。系统中的每个其他模块都将发送字母数字句子(最多两个单词),以便连续写入文件。问题是,我只得到了一小部分预先分配的内存,用于数据结构和这些日志消息的内存存储。如果流入量大于可以写入磁盘的量,则日志消息将被丢弃

我想在我的日志模块中的客户机和内存存储之间加入一种压缩机制,这样我就可以保存尽可能多的消息

我目前的设计:

客户端---->日志模块--->压缩并存储在内存缓冲区1中

写入线程: 写入时,将缓冲区1与缓冲区2切换,并将缓冲区1写入文件。在此期间,客户端将写入缓冲区2

外部脚本: 解压缩并显示日志消息

问题: 我可以使用什么样的好的字母数字压缩算法或好的数据结构来捕获尽可能多的数据(在上面的压缩阶段)

如果可能的话,我想要一种算法,它不会将压缩代码存储在中间数据结构中——也就是说,如果系统崩溃,我希望能够解压缩到目前为止写入文件的任何内容

迄今为止: 为我们将要使用的每个字符分配一个代码。似乎没有那么灵活

大多数日志消息都是简单的文本语句

问题:我可以使用什么样的好的字母数字压缩算法,或者可以使用什么样的好的数据结构来捕获尽可能多的数据(在上面的压缩阶段)

一般来说,算法速度越慢、占用内存越多,压缩比就越好。不同的编解码器会做出不同的权衡,即使在某些编解码器中,您也可以调整不同的参数以产生不同的权衡

对于不同的数据,编解码器的性能也往往非常不同。有几个基准浮动,但这只会给你一个总体概念的表现;要真正选择最好的,你需要用你的数据进行测试,并进行自己的测量

至于在进程崩溃时避免数据丢失,根据您当前的设计,您需要的是支持刷新的流式编解码器。每次记录完一条消息后,您都希望告诉编解码器刷新。这方面的API将取决于编解码器,但通常情况下,您最终会得到如下结果

foo_compress(stream, output, input);
foo_flush(stream);
fwrite(stream->output, 1, stream->output_size, file);
fflush(stream);
一些库提供了用于读取/写入磁盘的API(允许您跳过
fwrite
/
flush
)。我想到了壁球、gzip和lzham,但可能还有其他的。不过,在大多数情况下,库只是压缩到缓冲区,您负责将缓冲区写入文件

这里的主要障碍是很多算法不支持刷新。在我脑海中,gzip、LZAM、brotli、bzip2、lzma、zstd和我认为lz4f支持刷新。如果您进行大量刷新,bzip2的性能可能不会很好,而且如果这是一个新系统,那么可能没有太多理由使用gzip或lzma(zstd几乎在所有方面都优于gzip,brotli和LZAM几乎在所有方面都优于lzma)

这样说,如果您只是试图避免由于代码中的崩溃而导致的数据丢失(即,当程序崩溃时,您希望保存数据,但不太担心OS崩溃),那么您可能需要考虑将压缩和I/O代码分离到一个单独的进程中。在这一点上,您最终得到了类似于syslog的东西,或者更新的结构化日志API,比如,或者令人不快的API