gpt4 book ai didi

c# - Docker缺少log4net ConsoleAppender日志

转载 作者:行者123 更新时间:2023-12-02 18:15:51 25 4
gpt4 key购买 nike

我有一个具有以下log4net配置的简单C#程序:

<log4net>
<appender name="stdout" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%%-5level - %message%newline" />
</layout>
</appender>

<root>
<level value="DEBUG" />
<appender-ref ref="stdout" />
</root>
</log4net>

和以下代码(为清晰起见,缩写为):
public static void Main(String[] args)
{
var log = LogManager.GetLogger("Logger");
log.Info("Hello From Logger");
Console.WriteLine("Hello From Console");
}

我正在Ubuntu 16.04系统上使用.NET 4.5 mono进行编译和运行。当我使用控制台运行程序时,输出是预期的:
$ mono Program.exe
INFO - Hello From Logger
Hello From Console

但是,当我以分离模式在Docker容器中运行相同的程序(即“docker run -d”)然后检查日志时,我仅从Console.WriteLine获取日志:
$ docker logs <container_id>
Hello From Console

在尝试跟踪此问题时,我尝试使用守护程序工具( more info here)运行该程序,它说明了相同的行为,使我相信这是log4net而不是docker的问题。
我还为log4net编写了一个自定义附加程序,该附加程序仅执行Console.Write(我相信它与ConsoleAppender的功能相同,但是我想消除任何其他可能的变量):
public class CustomAppender: AppenderSkeleton
{
protected override void Append(LoggingEvent loggingEvent)
{
Console.Write(RenderLoggingEvent(loggingEvent));
}
}

但是没有运气。
任何对log4net都有深入了解的人都可以指出我可能在做错什么的地方,或者解释一下log4net可以对stdout做些什么,以便其他应捕获该流的程序不能这样做吗?

更新:情节变厚了!我编写了一个快速而肮脏的可执行文件,该文件使用Process类执行示例程序。然后,它从示例程序中获取标准输出,并使用Console.WriteLine编写它,如下所示:
Process proc = new Process();
proc.StartInfo.FileName = "/path/to/example.exe";
proc.StartInfo.UseShellExecute = false;
proc.StartInto.RedirectStandardOutput = true;
proc.Start();
Thread.Sleep(1000);
Console.WriteLine(proc.StandardOutput.ReadToEnd());

当我直接从控制台运行它时,这可以很好地工作,但是当我从docker / daemonize运行它时,同样有问题。所以现在我真的很困惑。

最佳答案

这不是一个很大的答案,但是如果其他人遇到了这个问题,我可以使用NLog库here使日志工作。

关于c# - Docker缺少log4net ConsoleAppender日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44389517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com