繁体   English   中英

Apache 日志行太长

[英]Apache log line too much long

我有带有 mod-sec 的 Cloud Foundry 和 php 应用程序。

该应用程序从浏览器接收 json POST。 该帖子包含几张以 base 64 编码的图像,Apace 将其剪裁为几行:

2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT 11:49:31 httpd modsec body":["{\"image1\":\"data:image/png;base64, ...
2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT tTHNrVze+6IgS/ftH89uE2lw

有没有办法连接这些日志?

我希望拥有:

2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT 11:49:31 httpd modsec body":["{\"image1\":\"data:image/png;base64, ...  tTHNrVze+6IgS/ftH89uE2lw\"}

我认为这不是 Apache Web 服务器或 mod_sec 的问题。 Cloud Foundry 将从在其上运行的应用程序读取日志,这些日志写入 STDOUT/STDERR。 This is the way you should be logging if you have an app running on Cloud Foundry, and if you're deploying a PHP app to Cloud Foundry that is how the PHP buildpack will configure PHP and the Apache Web Server to host your PHP application.

您不能简单地登录到文件,因为在 Cloud Foundry 上运行的应用程序的文件系统是短暂的。 它会在快乐的时候工作,但是当出现故障并且您的应用程序崩溃时,它将无法工作。 当应用程序崩溃时,文件系统(包括您写入的日志)将消失,这使得故障排除变得非常困难。

关于您看到的行为,Cloud Foundry 日志记录系统对单行日志条目有大小限制。 如果您尝试编写超出限制的单行日志条目,日志系统将自动拆分该行,您最终会得到两个日志行。 我怀疑这就是这里发生的事情。

我看了一点,但在分割之前找不到记录的最大值。 我能找到的最好的是这个关于设置的讨论,它提供了一些关于它的历史 不过,它似乎并没有对事物的设置方式提供清晰的解释。

由于我找不到正式记录的值,我想测试和验证长度。 为此,我将一个测试应用程序部署到 Pivotal Web 服务(运行最新版本的 OSS Cloud Foundry)并写了一些长日志行(如果您想查看测试代码,请告诉我)。 在分割线之前我能得到的最大值是 61441 字节(我在测试中重复了a字符,如果你有像这样的多字节字符,它会更快地分割)。 这与上面讨论链接中提到的旧行为相匹配。 您的里程可能会有所不同,具体取决于您使用的 CF 版本和平台配置方式。

不管限制的确切值是多少,总会有一些限制。 您可以尝试重构您的日志条目,即事后将它们缝合在一起,或者您可以将信息存储在其他地方。 使用数据库之类的服务或将日志条目直接发送到 syslog。

Syslog 是一个不错的选择,但 HTTPD 的内置支持要求 syslogd 在本地运行,它不在 Cloud Foundry 容器内。 使用管道日志功能并使用外部程序发送日志可能更容易。 这是一个这样做的例子

不要依赖终端打印的日志,有时它们很好,因为它们有 colors。 然而,最好和最完整的选择是依赖日志文件,因为它们不应该有缩写(希望如此)。

至于 Apache 有两种类型的 apache httpd 服务器日志文件:

  1. 错误日志
  2. 访问日志

根据您使用的操作系统,您可能会在不同的位置找到日志文件。

要找到准确的 apache 日志文件位置,可以使用grep命令:

grep ErrorLog /usr/local/etc/apache22/httpd.conf
grep ErrorLog /etc/apache2/apache2.conf
grep ErrorLog /etc/httpd/conf/httpd.conf

示例 output 可能是: ErrorLog "/var/log/httpd-error.log"

访问日志也一样:

grep CustomLog /usr/local/etc/apache22/httpd.conf
grep CustomLog /etc/apache2/apache2.conf
grep CustomLog /etc/httpd/conf/httpd.conf

另一种可能的解决方案是将base-64 object 直接打印到文件中。

一种可能性是查看 Apache ErrorLogFormat指令。 这使您可以简化每个 Apache 日志中的信息,因此您可以创建一种可以为您提供更短宽度(更少冗长)的格式,这可能对您的屏幕有所帮助。

我知道没有办法在 Apache 中连接日志。 它只是在侦听 PHP error_log命令,因此 PHP 代码可以将其捆绑起来,并且只调用error_log一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM