![这是一个坏主意。](https://linux22.com/image/150031/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E5%9D%8F%E4%B8%BB%E6%84%8F%E3%80%82.png)
我想知道当某些软件的输出未记录到文件而是记录到控制台时是否有任何缺点(性能方面)?
特定情况是运行 Docker 容器,因为某些进程被有意配置为登录 stdout。
对于文件,我唯一想到的问题是日志使用的空间,以及一些 IO,具体取决于日志记录的积极程度。
举个例子,假设我在 Docker 容器中有一个 Web 服务器应用程序,它将访问日志记录到 stdout(控制台),并且让我们想象容器持续运行 1 年,这种大缓冲区会保留在内存中(内核之一吗?) ,一直,或者内核最终会在一定限制后擦除它?
在这种情况下我是否应该担心内存耗尽和内核恐慌,或者我误解了概念?
(我知道当 app|container|node 关闭时,控制台会被刷新,与dmesg
清除时相同)
答案1
这是一个坏主意。
记录到系统控制台是将日志输出定向到的特殊情况任何真实终端或内核虚拟终端设备。那里没有不断增长的内核缓冲区。从终端显示屏顶部滚动出来的内容将会丢失。
然而,这对于记录 WWW 服务器来说是一个坏主意。
吸取教训“Bash 在特定传入请求后显示乱码“ 和不要向攻击者提供向您的终端写入任意内容的方法,特别是对于您的系统控制台。
并且不要认为 LAN 上不需要安全性。 总是接受东西的安全服务器任何网络。
将进程的标准错误和标准输出连接到管道,管道的另一端是以下提到的工具之一https://unix.stackexchange.com/a/505854/5132:
./要记录的内容 2>&1 |自行车日志/
这些工具保证文件logs/
占用的磁盘空间不超过指定的磁盘空间量,并在正确的点自动进行日志轮换。查看日志,即使使用像这样简单的东西,也less
可以确保攻击者提供的数据得到净化(在一定程度上),而不是直接将其按原样发送到终端设备。 (当然,不要使用 选项-R
。 )less