当前位置: 首页 > 知识库问答 >
问题:

从docker容器中对日志进行结构化日志记录

夹谷苗宣
2023-03-14

从docker容器中将结构化日志写入journald的最佳方式是什么?

例如,我有一个使用sd_journal_send而不是更改应用程序的应用程序,我尝试通过

-v/var/log/systemd/journal:/var/log/systemd/journal

docker journald输出日志记录选项有哪些限制?它似乎不支持应用程序编写不仅仅是消息字段。

--

所以我发现我需要-v/dev/log://dev/log

C程序可以这样写systemd日记:

#include <systemd/sd-journal.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
        sd_journal_send("MESSAGE=Hello World!",
                        "MESSAGE_ID=52fb62f99e2c49d89cfbf9d6de5e3555",
                        "PRIORITY=5",
                        "HOME=%s", getenv("HOME"),
                        "TERM=%s", getenv("TERM"),
                        "PAGE_SIZE=%li", sysconf(_SC_PAGESIZE),
                        "N_CPUS=%li", sysconf(_SC_NPROCESSORS_ONLN),
                        NULL);
        return 0;
}

这将写入日记并添加自定义字段,如HOME、TERM、PAGE_SIZE等。当我使用journalbeat将这些字段发送到ELK堆栈时,这些字段最终很好地出现在elasticsearch中,我可以直接搜索它们。

然而,docker似乎只是从应用程序中提取stdout,并将其添加到日志中,只添加了几个字段。例如container_id。

当在docker容器中使用这样的程序,然后从服务文件中运行它们时,会产生一个小问题。

1)我必须通过一些目录和设备文件才能用sd_journal_send写入它。

2)如果从systemd.service文件启动容器,并希望使用JournalCTL-U servicename并查看消息,则无法看到这些日志消息,因为它们以不同的路由进入日记,并且与运行它们的服务没有关联。

共有1个答案

谭俊
2023-03-14

最终的解决方案很简单。

我转而以纯JSON方式编写消息。所以journalctl-u现在可以工作并显示包含json数据的消息字段。

然后我使用journalbeat将其发送到LogStash。

filter {
  json {
    source => "message"
  }
}
 类似资料:
  • 我试图熟悉docker生态系统,并尝试设置mysql数据库容器。使用这看起来像: 我的conf目录包含一个文件: 不幸的是,我没有这样得到任何日志文件。设置本身是正确的,并且使用了cnf文件。连接到容器并创建3个文件后,将它们添加到并重新启动容器,日志记录按预期工作。 我很确定这是一个常见的场景,我目前让它运行的方法看起来真的很愚蠢。正确的做法是什么? 我可以通过在Dockerfile中移动所有这

  • 本文向大家介绍Docker 容器日志分析,包括了Docker 容器日志分析的使用技巧和注意事项,需要的朋友参考一下 查看容器日志 先使用  docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine 命令启动一个nginx容器。如果没有异常,会得到容器ID如  d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3

  • 「Allen 谈 Docker 系列」 DaoCloud 正在启动 Docker 技术系列文章,每周都会为大家推送一期真材实料的精选 Docker 文章。主讲人为 DaoCloud 核心开发团队成员 Allen(孙宏亮),他是 InfoQ 「Docker 源码分析」专栏作者,已出版《Docker 源码分析》一书。Allen 接触 Docker 近两年,爱钻研系统实现原理,及 Linux 操作系统。

  • 我是JAVA的新手。 我想问一下如何使用java生成像下面这样的日志。

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 我正在使用python日志记录我的程序。所有日志当前都打印在stdout上,但我希望使用POST REST调用将它们发送到远程日志服务器。当前,我的程序发出了多个日志记录的POST请求。有没有更优化的方式发送日志,我可以捆绑多个日志在一个POST请求?