我假设Windows Server 2016存在某些问题。有什么想法要检查吗?
默认情况下,Windows设置为以这种方式工作。来自
File timestamp not updating on 2008 but does on 2003:
在2003年,打开资源管理器中的日志文件夹,您可以看到每次更新日志时时间戳和文件大小会实时更改。
在2008年,大多数情况下,除非以其他方式交互,否则不会有任何变化...
是的,其中一些属性已在2008年被禁用。
例如,如果您想要查看/使用“上次访问”时间,则需要启用此属性的跟踪。
您可以通过将HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate设置为0来启用此功能(该值为REG_DWORD)。
请注意,这可能会影响繁忙文件服务器的磁盘IO性能!
因此,该行为已更改以提高性能。
从性能调整Web服务器中:
该系统全局开关NtfsDisableLastAccessUpdate(REG_DWORD)1位于HKLM \ System \ CurrentControlSet \ Control \ FileSystem下,并默认设置为1。通过禁用上次访问文件或目录的日期和时间戳更新,此开关可以减少磁盘I / O负载和延迟。 Windows Server 2016,Windows Server 2012 R2,Windows Server 2012,Windows Server 2008 R2和Windows Server 2008的干净安装默认启用此设置,您无需调整它。早期版本的Windows未设置此密钥。如果您的服务器运行较早版本的Windows,或者已升级到Windows Server 2016,Windows Server 2012 R2,Windows Server 2012,Windows Server 2008 R2或Windows Server 2008,则应启用此设置。
似乎该设置仍可在Windows Server 2016中使用。
我认为Java代码在flush()方面是正确的,因为在Windows Server 2008上的Java 8上相同的类会导致File Explorer进行更新。当运行TYPE和Notepad时,我也看到时间戳记录与系统时钟匹配,但晚于“上次修改”时间。
刷新不等于同步。每个记录发布后,FileHandler
只执行刷新操作。Windows未设置强制写入元数据到文件系统。来自在不关闭文件的情况下修改文件时,“日期修改”属性不更新。:
在2008年,即使按F5刷新视图,日志文件上的“上次修改”字段也不会更新,除非另一个程序尝试打开该文件或停止实用程序。
资源管理器从NTFS获取其信息,通过使用cmd提示符和“dir”,我们发现直到关闭对文件的句柄,文件的NTFS元数据才会更新。
刷新文件夹信息只会访问NTFS元数据缓存,但显式查询文件将强制磁盘I/O以获取属性 - 这是Vista引入的设计更改,旨在减少不必要的磁盘I/O以提高性能。
有一些例外情况:
- 在某些情况下,“dir文件名”足以刷新元数据。
- “特殊”文件夹可能会被处理得不同,例如用户配置文件,我们不希望有大量文件并且希望能够依赖所呈现的文件数据。
- 内核过滤驱动程序可能会更改行为,因为它们“添加、删除或更改其他驱动程序的功能”。
由于解决方法是任何进程打开并关闭句柄到日志文件,因此编写了一个工具来执行此操作,并获取文件信息,使用以下API:
- CreateFile
- GetFileInformationByHandle
- CloseHandle
您可以尝试使用FileHandler创建的文件名打开FileInputStream。
只有在DOS TYPE运行或在记事本中打开/关闭(不保存)文件,似乎会导致文件资源管理器和DOS DIR更新。
我发现唯一一种通用的从外部过程更新元数据的方法是通过交互式地使用文件资源管理器选择一个文件:
explorer /select, c:\test\file.txt
很可能这与记事本中发生的情况非常相似。
我喜欢你使用 TYPE
命令的方式。你可以将其与 nul 一起使用以忽略输出。
type filename.log > NUL
通过使用元数据开关运行dir
可能会强制更新元数据:
dir /A /R /Q filename.log > nul
commons
日志记录下运行Java 8)。本地二进制文件(例如DLL)似乎没有出现这个问题。 - lafual