2017-06-06 54 views
1

我有一個簡單的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()); 

,當我直接從控制檯運行它,這工作得很好,但有同樣的問題,當我從碼頭工人運行/守護進程。所以現在我很困惑。

回答

2

這不是太多的答案,但萬一別人運行到這個問題,我能得到通過登錄使用NLOG庫here工作。