如何将非 pid 1 进程的日志重定向到dockerlogs,最终目标是将它们重定向到gelf?
docker容器中有 2 个进程:
1) pid 1 进程
2) 非 pid 1 进程写入路径中的日志文件
关注docker docs 特别是
nginx官方镜像创建了一个从/dev/stdout到/var/log/nginx/access.log的符号链接,并创建了另一个从/dev/stderr到/var/log/nginx/error.log的符号链接,覆盖了日志文件并导致日志被发送到相关的特殊设备。
没有帮助。只有pid 1进程日志被重定向到dockerlogs
执行的步骤:
1ln -sf /dev/stdout _path_在Dockerfile 中
2 将更新后的镜像作为容器运行。
3docker logs -f _containerid_ 只显示pid 1进程的日志
哪个州
Docker 支持不同的日志驱动程序,用于存储和/或流式传输主容器进程(pid 1)的容器标准输出和标准错误日志
所以这可能是没有看到非pid 1进程日志的原因。
尽管如此,仍然不明白为什么ln -sf /dev/stdout /var/log/mysql/error.log创建的符号链接不起作用。
我想使用graylog作为中央日志服务器,目前我只是使用slf4j Logger“slf4j-api”作为Java日志框架来登录我的java应用程序。我可以使用 SLF4J 将日志记录发送到 Graylog 吗?或者我需要哪些额外的库才能将这些日志发送到 Graylog?
刚开始进入Graylog2并希望通过GELF输入记录一些Java应用程序.因此我使用了库log4j2并添加了graylog2-gelfclient.所有依赖项都得到满足并且程序正在运行.但是我的Logmanager初始化会引发以下错误:
ERROR StatusLogger appenders contains an invalid element or attribute "GELF"
Run Code Online (Sandbox Code Playgroud)
我的代码只是将错误记录到记录器:
static final Logger logger = LogManager.getLogger(Application.class);
public static void main(String[] args) {
logger.error("This is an error log entry");
}
}
Run Code Online (Sandbox Code Playgroud)
我的log4j2.xml文件配置为使用GELF和GelfAppender:
<configuration status="OFF">
<appenders>
<GELF name="gelfAppender" server="192.168.1.1" port="12201" hostName="myhost"/>
</appenders>
<loggers>
<root level="info">
<appender-ref ref="gelfAppender"/>
</root>
</loggers>
</configuration>
Run Code Online (Sandbox Code Playgroud)
有人熟悉这个问题吗?谢谢你的帮助.
我有docker-compose.yaml如下
问题:我的问题是标准输出打印或写入它的日志出现在灰色日志中 - 但只是在命令 /usr/bin/tini 下的那些 - foo1.start。当我尝试使用以下
docker exec -it [container_hash] bash
命令进入服务的 docker 容器时:启动命令,例如 echo "Hello" 或运行我将在其中执行的 python 脚本import sys; sys.stdout.write("Hello again")--> 在 Graylog UI 中收到的消息中不会出现这些消息。
知道为什么没有通过在容器内执行 shell 命令或脚本来收集 stdout 吗?并且仅从作为 make file 命令的结果运行的内容中收集打印?
我不理解这种行为,因为我将所有标准输出通过管道传输到 docker-compose 中的 gelf 日志驱动程序。
编辑:如何在撰写中使用 graylog 的说明来自这里
version: '3.4'
services:
foo1:
ports:
- target: 8081
published: 8084
mode: host
networks:
- dev-net
command: make foo1.start
logging:
driver: gelf
options:
gelf-address: udp://localhost:12201
some-mongo:
image: "mongo:3"
networks:
- dev-net …Run Code Online (Sandbox Code Playgroud) 我可以在 Docker 文档中看到:https : //docs.docker.com/config/containers/logging/gelf/
在 GELF 中,每条日志消息都是一个包含以下字段的字典:...您自己配置的任何自定义字段
这是否意味着此驱动程序支持自定义字段?
我想为每个 GELF 消息添加自定义字段环境。我怎样才能做到这一点?
我正在尝试设置GrayLog2服务器,需要使用GELF HTTP输入监听器.我做了一个小型的C#控制台程序,它将测试日志发送到服务器.然而,似乎只有几条消息实际上是由gl2解析的,我无法弄清楚为什么.例如,以下程序应创建5个日志pr.第二.无论运行多长时间,Gl2总共可以获得1或2个日志.有没有人成功使用GELF HTTP输入,我在这里缺少什么?
do
{
var client = new RestClient("http://10.8.0.39:12201");
var request = new RestRequest("gelf", Method.POST);
request.RequestFormat = DataFormat.Json;
var glog2 = new GLogEntry
{
host = "example.org",
short_message = "Short message...",
};
request.AddBody(glog2);
client.ExecuteAsync(request, r => { });
Thread.Sleep(200);
} while (1 == 1);
Run Code Online (Sandbox Code Playgroud) 我们有一个日志记录流,其中我们的 java 应用程序填充 MDC,该 MDC 通过 log4j2 传输到 syslog 到中央 rsyslog 安装。在这里,我们广泛使用了 MDC。我们的设置是这样的:
<Syslog name="syslog" format="RFC5424" host="localhost" port="514" protocol="UDP"
appName="messaging_platform.${application}" mdcId="mdc" includeMDC="true" facility="LOCAL5" connectTimeoutMillis="100" ignoreExceptions="false">
<LoggerFields>
<KeyValuePair key="class" value="%c"/>
<KeyValuePair key="classname" value="%c{1}"/>
<KeyValuePair key="exception" value="%ex{full}"/>
<KeyValuePair key="method" value="%method"/>
<KeyValuePair key="line" value="%line"/>
<KeyValuePair key="application_name" value="${application}"/>
<KeyValuePair key="sequenceNumber" value="%sequenceNumber"/>
<KeyValuePair key="application_version" value="${application.version}"/>
<KeyValuePair key="marker" value="%marker"/>
<KeyValuePair key="thread" value="%thread"/>
<KeyValuePair key="system_nano_time" value="%nano"/>
<KeyValuePair key="app_uptime" value="%relative"/>
</LoggerFields>
</Syslog>
Run Code Online (Sandbox Code Playgroud)
我正在尝试将其转换为使用 graylog,似乎 GELF 是推荐的传输协议。我找到了多个库来做到这一点,并从GelfLayoutlog4j2 的内置开始。但那不支持LoggerFields。
那么将这些字段放入 Graylog 的推荐方法是什么?如果我做
<Socket name="Graylog" protocol="udp" host="localhost" …Run Code Online (Sandbox Code Playgroud) 我想从docker容器中获取stdout日志并将它们发送到ELK堆栈.到目前为止,我知道Docker中有一个GELF日志记录驱动程序.
不过,我想不通我怎么能分析ERROR,WARNING或DEBUG从消息的消息,并把它们在一个新的领域像log_level在日志消息码头工人将它们发送到ELK之前.
日志消息应该是这样的:
{
"client": "127.0.0.1",
"user": "frank",
"timestamp": "2000-10-10 13:55:36 -0700",
"method": "GET",
"uri": "/apache_pb.gif",
"protocol": "HTTP/1.0",
"status": 200,
"size": 2326,
"message": "[ERROR] Error connecting to MongoDB",
"_logLevel" : "ERROR"
}
Run Code Online (Sandbox Code Playgroud)
"_logLevel" : "ERROR"在发送给ELK之前添加了哪个docker.
谢谢.
我正在尝试将 Web 服务输入/输出作为 xml 插入 Graylog 中。为此,我使用了“GELFJ - 用于 Log4j 的 GELF Appender 和用于 JDK Logging 的 GELF Handler”。这是示例代码:
public static void main(String[] args) throws IOException {
GelfSender gelfSender = new GelfTCPSender("172.21.120.139", 12201);
String xmlMessage = readFile("c:\\temp\\xml.xml");
GelfMessage message = new GelfMessage("short message", "long message", System.currentTimeMillis(), "1");
message.setHost("localhost");
message.addField("XML", xmlMessage);
message.addField("LEN", xmlMessage.length());
if (message.isValid()) {
GelfSenderResult result = gelfSender.sendMessage(message);
Exception exception = result.getException();
if (exception != null) {
exception.printStackTrace();
}
} else {
System.err.println("Message is not valid!");
}
}
Run Code Online (Sandbox Code Playgroud)
这是 …