Docker缺lesslog4net ConsoleAppender日志

我有一个简单的C#程序,具有以下log4netconfiguration:

<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 

在试图追踪这个问题的时候,我试着使用守护进程工具来运行这个程序( 这里有更多的信息 ),并且说明了相同的行为,导致我相信这是log4net而不是docker的问题。 我也写了一个log4net的自定义appender,只做Console.Write(我相信它和ConsoleAppender的function是一样的,但是我想消除其他可能的variables):

 public class CustomAppender: AppenderSkeleton { protected override void Append(LoggingEvent loggingEvent) { Console.Write(RenderLoggingEvent(loggingEvent)); } } 

但没有运气。 任何对log4net有深入了解的人都可以指出我可能做错什么,或者说明log4net可以做什么来标准输出,以便其他应该捕获该stream的程序不会这样做?

更新:情节变厚了! 我写了一个快速而脏的可执行文件,它使用Process类来执行我的示例程序。 然后从示例程序抓取stdout,并用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/守护进程运行它。 所以现在我真的很困惑。

这不是一个很好的答案,但是如果有人遇到这个问题,我可以通过在这里使用NLog库来使日志工作。