如何使用 NLog 从 docker 容器中获取 UDP 或 TCP 日志



如何配置docker和Nlog以具有tcp日志记录?我使用 log4view 和 udp 日志记录在我的机器上顺利运行,配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Debug"
internalLogFile="c:Tempinternal-nlog.txt">

<targets>
<target xsi:type="File" name="file" fileName="c:TempxRayServices-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
<target name="udp" xsi:type="Network" address="udp4://localhost:9999"
layout="${log4jxmlevent}" newline="True" />
</targets>
<target name="tcp" xsi:type="Network" address="tcp4://localhost:9995"
layout="${log4jxmlevent}" newline="True" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="file,udp,tcp" />
</rules>
</nlog>

我还使用上述配置中的文件目标将 docker 容器中的日志写入文件,然后在启动 docker 映像时将 docker 目录映射到我的系统目录,如下所示(简化为仅保留基本要素(:

docker run --rm --name myName  -p 9995:9995 -p 9999:9999/udp --network myLocalNet --mount "type=bind,source=C:Temp,destination=C:Temp" myImage 

这有效,我得到了可用的 txt 文件日志。 我真的很想使用Log4view。

就我而言,出于安全原因,我需要使用--network myLocalNet。

是否可以在使用--network myLocalNet时进行tcp(或udp(日志记录。

请注意,在上面的命令中,我尝试映射端口 9999,但我没有收到 udp 日志(我猜测是因为 --network myLocalNet(。 在日志记录配置和 docker 配置中,我需要以某种方式使我的计算机 IP 地址对 docker 容器可见,因为日志是从容器发送到我的计算机的。

更新:根据@LinPy的反馈,我添加了/udp 标志,我还映射了一个 seaparate tcp 端口并更新了日志记录配置。 该配置在本地适用于 tcp 和 udp,但仍然不是来自容器。

我还在 docker 文件中添加了 EXPOSE 9999/udp 和 EXPOSE 9995

尝试公开TCPUDP

docker run --rm --name myName -p 9999:9999/udp -p 9999:9999 --network myLocalNet --mount "type=bind,source=C:Temp,destination=C:Temp" myImage

您不必使用 EXPOSE 打开任何端口或指定 -p 参数来执行端口映射,因为它不是传入连接,NLog 不会打开端口。NLog 连接到您定义的终结点。

因此,要使其正常工作,您只需将localhost:9999更改为<your-ip-host>:9999

最新更新