问题:我想CRLF
从编码为LF
我有一个Apache2 httpd基于 Linux 的 Web 服务器,配置为提供*.log
由基于 Linux 的模拟器生成的(大型)日志文件()。
这些日志文件具有 Unix 样式的LF
结尾而不是 Windows 样式的结尾CRLF
。 CRLF
这也成为协议中文本文件的标准http
。
当我使用 Windows 中的浏览器查看它们时,它们会被加载到 Notepad.exe 中,并且所有文本都(错误地)在同一行上;除非我将服务器上的日志从 重命名
*.log
为*.txt
。
看起来 Microsoft Windows 可能正在进行*.txt
特殊处理,并在结尾出现时进行转换。
有了这些线索,我该如何更改设置,以便客户端用户能够正确查看文件,而不管他们的平台/浏览器如何。
更多问题细节:为什么我不能做显而易见的事情
分析日志,我发现以 mime-type和的形式.txt
提供,但切换到使用并没有解决问题。text/plain
.log
text/x-log
.log
text/plain
SetType
在生产系统中,我无法轻易地将文件更改为以 结尾.txt
。
对于我来说,日志数量太多、太大,无法使用(例如unix2dos
)进行转换并保存另一份副本。此外,这还会迫使我管理转换文件的额外缓存,这些缓存需要失效、清除等,或者更改原始文件,这可能会破坏使用这些文件的其他系统。
- 是否有一个 Apache httpd 配置参数可以告诉 Windows/Internet Explorer(和其他操作系统/浏览器)它在到达时需要
LF
扩展吗?CRLF
- 或者我能否以某种方式告诉 Apache在提供服务时动态地
LF
进行替换?CRLF
我尝试过
我查看了捆绑的 Apachemod_mime
模块及其指令AddType
和AddCharset
但这些都不能解决问题,甚至声称不能。
Apache 文档没有提及行尾问题。
该类型的 MIME 文档text
说明了内容必须采用 CRLF 格式。
字符集编码标准似乎没有考虑行尾。
答案1
看来您要费很大劲才能解决 Notepad 的一个(在我看来很严重)限制。是否可以在系统上安装更智能的文本编辑器,例如 Notepad++?
答案2
我采用的(不完美的)解决方案是使用 Apache 的mod_ext_filter
:
ExtFilterDefine logwin mode=output cmd=/usr/bin/unix2dos intype=text/x-log
AddOutputFilter logwin .log
# Note that apache2 defines .log as having mime-type text/x-log by default.
本质上,这意味着对于以 结尾的任何文件.log
,在传送给客户端之前都应该经过行尾转换器。
对于负载很重的机器来说,这不是一个好的解决方案,因为分叉unix2dos
比让 Apache 内部处理要慢。它还需要在每次读取文件时进行转换,效率很低。
遗憾的是,Apache 基金会没有为这种情况提供内置的 mod 过滤器,而且我也没有时间去编写/维护一个。
不过,我并不期望这台机器的负载太高,因此从工程工作量来衡量,这是一个很好的解决方案。
- 符合
mime
text/plain 的规格通过CRLF
在线编码 - 客户端无需采取任何特殊操作。虽然我很乐意使用更好的文本编辑器,但我不能指望所有用户都改用它
- 如果我需要移动网络服务器,重新配置很容易
- 不需要日志生成器使用非本机(非 unix)行尾格式