我有一個簡單的C#程序具有以下log4net的配置:碼頭工人失蹤log4net的是ConsoleAppender日誌
<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
然而,當我在分離模式下運行以泊塢容器此相同的程序(即,「運行搬運工-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的能夠做的到標準輸出,使得應該捕捉流其他程序不?
UPDATE:情節增厚!我寫了一個快速而髒的可執行文件,它使用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());
,當我直接從控制檯運行它,這工作得很好,但有同樣的問題,當我從碼頭工人運行/守護進程。所以現在我很困惑。