惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
博客园_首页
美团技术团队
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
J
Java Code Geeks
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
雷峰网
雷峰网
爱范儿
爱范儿

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
把 syslog-only 的应用程序的日志重定向到 stdout
beyondstars · 2025-11-24 · via V2EX

背景

最近在部署容器化的 MX ,其中要用到 OpenDKIM 这个 milter (负责给出站邮件附上 dkim 签名,并检查入站邮件的 dkim 签名),opendkim 有一个问题就是我不知道怎么配才能让它把日志写到 stdout ,它只会往 syslog 写日志,这就是我说的 syslog-only 应用程序。

容器化的实例最好还是把日志写到 stdout ,方便 container supervisor 统一收集和管理,也具有通用性。我可以把宿主机的 /dev/log socket 以 bind mount 的方式挂载到容器的 mount ns ,然而这种做法破坏了容器的自包含性,会让容器部署依赖于宿主机的 syslog socket 的具体位置。并且在公有云 PaaS 或者权限受限的环境下,访问宿主机的 syslog 服务(或修改其配置让它将来着容器的日志转发到特定端点)并不总是可能的。

什么是 syslog ? syslog 它既是一个动态链接库提供的一个函数,也是一种日志分发的方式,依赖于 syslog 打印日志的应用程序称为 syslog client ,一般通过 socket 向本机的 syslog server 通信,syslog server 决定对各个应用发来的日志作何处理。

解决方案

A. 挂载 (bind mount) 宿主机的 syslog socket 到容器内部,一般位于 /dev/log ,实际上在我的机器上这是一个 symbol link ,指向一个 systemd-journald 负责监听的 socket ,这样就可以让宿主机的 syslog server (systemd-journald) 扮演容器看来缺失了的 syslog server 的角色。前面说了为什么这种做法不行。

B. 我们说了 syslog 函数一般是通过动态链接的方式实现的,也就是说 app 自己的二进制可能没有 syslog client 的实现逻辑,这个逻辑是复用动态链接库里实现好了的 syslog client 的代码,系统通过解析 syslog 函数到真正的实现(一个 PIE shared object 文件)来使得 app 能以符合 syslog client 规范的行为向 syslog socket 发送日志。理论上,可以通过 LD_PRELOAD 的方式,劫持 app 调用的 syslog 函数。我们自己实现一个仿 syslog 函数,和 app 调用的 syslog 函数的签名一样,然后把收到的日志打到 stdout 。这种方案比较复杂,需要在容器构建时,编译这个 PIE shared object 文件,对于 multi-arch 镜像,也需要为每一种 arch 编译一份 shared object 文件。还需要在容器构建过程中安装额外的 toolchain 。

C. 在容器里启动一个轻量级的 syslog server 。这是最简单的、最合理的。既然 app 需要 syslog 才能工作,那就给他一个真的。

思路

  1. 在构建容器的过程中,安装 syslog-ng 软件包,生成或复制一份 syslog-ng 配置文件到容器镜像内。
  2. syslog-ng 的自定义配置思想主要是把所有收集而来的日志转发到一个具名管道,透过 mkfifo 命令创建该管道,或者让 syslog-ng 自动创建。
  3. 使用自定义的容器内启动脚本,使用 --no-caps 参数启动 syslog-ng ,让 shell 读取具名管道,把内容导给一个后台运行的 cat 进程。
  4. 完成一切准备工作后才启动真正要启动的应用。

具体实现代码

Dockerfile:

FROM debian:trixie

RUN  \
  apt-get -y update && \
  DEBIAN_FRONTEND=noninteractive apt-get -y --no-install-recommends install opendkim opendkim-tools syslog-ng && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* 

COPY <<EOF /etc/syslog-ng/syslog-ng.conf
destination d_pipe {
    pipe("/var/log/any.log.pipe");
};

source src { system(); };

log {
    source(src);
    destination(d_pipe);
};
EOF

COPY <<EOF /entrypoint.sh
#!/bin/bash

mkfifo /var/log/any.log.pipe
syslog-ng --no-caps

cat </var/log/any.log.pipe &

exec /usr/sbin/opendkim -f -x /etc/opendkim/opendkim.conf
EOF

RUN chmod +x /entrypoint.sh

CMD [ "/entrypoint.sh" ]