容器内运行Django Shell时日志无法发送至Datadog的解决方法
解决容器内Shell会话日志同步至Datadog的方法
以下是几种可行的实用方案,按需选择:
方案1:重定向Shell输出到文件,配置Datadog Agent采集该文件
这是最直接的方式,把Shell会话的输出持久化到文件后,让Agent自动采集:
- 进入容器后,启动Shell时主动重定向输出:
bash >> /var/log/shell_session.log 2>&1 - 修改Datadog Agent的日志采集配置(通常路径为
/etc/datadog-agent/conf.d/logs.d/conf.yaml),添加如下规则:logs: - type: file path: /var/log/shell_session.log service: your-service-name source: shell sourcecategory: shell_session - 重启容器内的Datadog Agent:
datadog-agent restart
方案2:转发Shell会话输出到容器主进程的stdout/stderr
如果你的Datadog Agent已经在采集容器主进程的日志,可以把Shell会话的输出转发到主进程的标准流:
- 使用
docker exec进入容器时,通过管道把输出同步到容器主进程的stdout/stderr:
这样Shell的所有输出会被转发到容器主进程的标准输出/错误流,而Agent已经在采集这些流,就能自动同步到Datadog。docker exec -it <容器ID/名称> bash 2>&1 | docker exec -i <容器ID/名称> tee /proc/1/fd/1 /proc/1/fd/2
方案3:配置Shell全局自动日志记录
通过修改Shell的全局配置,让所有新启动的Shell会话自动记录日志:
- 编辑容器内的全局bash配置文件
/etc/bash.bashrc,添加以下内容:# 避免重复日志 if [ -z "$SESSION_LOGGED" ]; then export SESSION_LOGGED=1 # 将所有Shell输出重定向到日志文件 exec >> /var/log/shell_global.log 2>&1 fi - 同样在Datadog Agent的日志配置中添加对
/var/log/shell_global.log的采集规则,重启Agent即可。
另外也可以通过syslog转发:在/etc/bash.bashrc中添加命令日志到syslog,再配置Agent采集syslog的对应设施,比如:
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]*[ ]*//") [$RETRN_VAL]"'
然后在Agent配置中添加syslog采集规则,过滤local6的日志消息。
内容的提问来源于stack exchange,提问作者Fredy
相关产品推荐
相关产品推荐

