关于日志记录:应该在每次写入时打开/关闭日志文件流,还是在桌面应用程序的生命周期中保持打开状态?

您所在的位置:网站首页 苹果打不开文件要下载什么应用程序 关于日志记录:应该在每次写入时打开/关闭日志文件流,还是在桌面应用程序的生命周期中保持打开状态?

关于日志记录:应该在每次写入时打开/关闭日志文件流,还是在桌面应用程序的生命周期中保持打开状态?

2024-07-14 02:09:58| 来源: 网络整理| 查看: 265

日志类应该在每次写入日志文件时打开/关闭日志文件流,还是应该在应用程序的整个生命周期中保持日志文件流打开,直到完成所有日志记录?

我问一个桌面应用程序的上下文中。 我见过人们同时使用两种方法,并且想知道哪种方法可以为记录器带来最佳的全方位结果。

如果您经常进行读/写操作,那么通过一次打开/关闭操作就可以在整个生命周期内保持打开文件的效率。

您可能需要定期刷新或在每次写入后刷新,以防万一您的应用程序崩溃,您可能并没有将所有数据写入文件。在基于Unix的系统上使用fflush,在Windows上使用FlushFileBuffers。

如果您也在Windows上运行,则可以将CreateFile API与FILE_FLAG_NO_BUFFERING一起使用,以在每次写入时直接进入文件。

最好在文件的整个生命周期内保持打开状态,因为每次打开/关闭文件时,如果文件正在使用中,可能会失败。例如,您可能有一个备份应用程序,该应用程序在备份文件时运行并打开/关闭文件。这可能会导致您的程序无法访问您自己的文件。理想情况下,您希望始终保持文件打开状态,并在Windows上指定共享标志(FILE_SHARE_READ)。在基于Unix的系统上,共享将是默认设置。

相关讨论 这会允许另一个程序从文件中读取吗? 使用apache和log4j,我知道您可以在程序编写新消息时减少使用-f来查看新消息。 这是否意味着log4j打开和关闭文件,或者即使通过apache打开文件仍能从中读取更少的文件?

通常,正如其他所有人所说,请保持文件打开以提高性能(打开是一个相对较慢的操作)。但是,您需要考虑如果保持打开文件状态并且人们删除日志文件或截断日志文件会发生什么情况。这取决于开放时间使用的标志。 (我正在处理Unix-类似的考虑因素可能适用于Windows,但我会接受比我更精通的技术人员的校正)。

好。

如果有人看到日志文件增长到例如1 MiB,然后将其删除,则应用程序将不再是明智之举,并且Unix将保持日志数据的安全,直到应用程序关闭日志为止。此外,用户会感到困惑,因为他们可能创建了一个与旧名称相同的新日志文件,并对为什么应用程序"停止记录"感到困惑。当然没有。它只是记录到其他人无法获得的旧文件。

好。

如果有人注意到日志文件已增长到例如1 MiB,然后将其截断,则该应用程序也不是更明智的选择。但是,取决于打开日志文件的方式,您可能会得到奇怪的结果。如果未使用O_APPEND(说POSIX)打开文件,则程序将继续以其当前偏移量写入日志文件,并且文件的前1 MiB将显示为零字节流-这很容易混淆程序查看文件。

好。

如何避免这些问题?

好。

使用O_APPEND打开日志文件。 定期在文件描述符上使用fstat()并检查st_nlink是否为零。

好。

如果链接计数为零,则有人删除了您的日志文件。是时候关闭它了,然后重新打开一个新的。与stat()或open()相比,fstat()应该很快;它基本上是从已经在内存中的东西直接复制信息,不需要名称查找。因此,您可能应该在每次要编写时都这样做。

好。

意见建议:

好。

确保有一种机制可以告诉程序切换日志。 确保在消息中记录完整的日期和时间。

好。

我遇到了浪费时间而不是日期的应用程序。今天早些时候,我有一个消息文件,其中包含一些从8月17日开始的条目(其中一条消息不小心在时间之后包含了消息中的日期),然后是从今天开始的某些条目,但是我只能说是因为我创建了它们。如果我在几周的时间内查看日志文件,就无法确定它们是在哪一天创建的(尽管我会知道它们的创建时间)。这种事情很烦人。

好。

您可能还会看看Apache之类的系统是什么—它们具有处理日志文件的机制,并且具有处理日志轮换的工具。注意:如果应用程序确实保持打开单个文件,不使用附加模式并且不计划日志轮换或大小限制,那么对于日志文件增长或开始时带有零块的情况,您无能为力。而不是定期重新启动应用程序。

好。

您应确保尽快完成对日志的所有写入。如果使用文件描述符,则只有内核缓冲存在;这可能是可以接受的,但请考虑open()的O_SYNC或O_DSYNC选项。如果使用文件流I / O,请确保每个写入后均跟随fflush()。如果您有多线程应用程序,请确保每个write()都包含完整的消息;否则,请转至第二页。不要尝试分别编写消息的各个部分。对于文件流I / O,您可能需要使用flockfile()和亲戚将操作分组在一起。使用文件描述符I / O,您可能可以使用dprintf()对文件描述符进行格式化的I / O(尽管并不确定dprintf()会对write()进行一次调用),或者也许可以在单个操作中写入单独的数据段。

好。

顺便说一句,"包含"零的磁盘块实际上并未分配在磁盘上。通过创建每个文件只有几个GiB的文件,您可以真正搞定人们的备份策略,但是除最后一个磁盘块外的所有文件都只包含零。基本上(为简洁起见,省略了错误检查和文件名生成):

好。

1234int fd = open("/some/file", O_WRITE|O_CREATE|O_TRUNC, 0444); lseek(fd, 1024L * 1024L * 1024L, 0); write(fd,"hi", 2); close(fd);

这在磁盘上占用一个磁盘块-但在(未压缩)备份上为1 GiB(并更改),在还原时为1 GB(并更改)。反社会的,但可能的。

好。

好。

相关讨论 我发现这是一个很好的答案-它涵盖了其他答案未涵盖的"文件已删除"和"截断"之类的主题。

为了提高性能,请保持打开状态。为了安全起见,请经常冲洗。

这将意味着运行时库在包含大量数据之前不会尝试缓冲写入操作-在写入之前,您可能会崩溃!

这是一个权衡。每次打开和关闭文件都会在程序崩溃时更有可能在磁盘上更新文件。另一方面,打开文件,寻找末尾并将数据附加到文件中涉及一些开销。

在Windows上,您无法在文件打开时对其进行移动/重命名/删除操作,因此打开/写入/关闭可能对长时间运行的流程很有帮助,在该过程中,您有时可能希望在不中断旧日志内容的情况下进行归档作家。

在大多数情况下,我会保持打开状态,并使用fflush()使文件更可能在程序崩溃时保持最新状态。

通常最好保持打开状态。

如果您担心能否从其他进程读取它们,则需要确保用于打开/创建它们的共享模式允许其他人读取它们(但显然不能写入它们)。

如果您担心崩溃时会丢失数据,则应定期刷新/提交它们的缓冲区。

我倾向于将它们保持打开状态-但使用文件共享权限设置它们以允许其他阅读器打开它们,并确保您将每条消息都刷新日志输出。

我讨厌程序在运行时甚至不允许您查看日志文件,或者不刷新日志文件并且滞后于正在发生的情况的程序。

我可以想到几个您不想一直打开文件的原因:

如果在几个不同的应用程序,用户或应用程序实例之间共享日志文件,则可能存在锁定问题。 如果您没有正确清除流缓冲区,则当该应用崩溃时,您可能会丢失最后几个条目,而您最需要它们。

另一方面,即使在追加模式下,打开文件也可能很慢。最后,归结为您的应用程序在做什么。

我看不出有任何理由要关闭它。

另一方面,关闭和重新打开会花费一些额外的时间。

相关讨论 实际上是在同一只手

打开和关闭。可以在系统崩溃的情况下从损坏的文件中拯救您。

相关讨论 每次都可以冲洗。 当然可以,但为什么要打扰呢? 性能? 如果不测量,那还为时过早...

对于大型应用程序,我通常要做的是在应用程序运行期间保持日志文件处于打开状态,并有一个单独的线程定期将内存中的日志内容刷新到HDD。 文件打开和关闭操作需要系统调用,如果您浏览较低级别的文件,这将需要很多工作。

我会在每次写入(或批量写入)时打开和关闭。如果这样做在桌面应用程序中导致性能问题,则可能是您过于频繁地写入日志文件(尽管我确信可能有很多写入的正当理由)。

作为您应用程序的用户,我希望它不保持文件打开状态,除非它是应用程序的真正要求。在系统崩溃等情况下可能会出错的一件事。

每次关闭文件的好处是,操作系统将保证将新消息写入磁盘。如果您让文件保持打开状态并且程序崩溃,则可能不会编写全部内容。您也可以通过执行fflush()或使用与您使用的语言等效的方法来完成相同的操作。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭