2017-06-06 2 views
1

ich ein einfaches C# Programm mit dem folgenden log4net-Konfiguration haben:Docker fehlende log4net ConsoleAppender Protokolle

<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> 

Und der folgende Code (kurz für Klarheit):

public static void Main(String[] args) 
{ 
    var log = LogManager.GetLogger("Logger"); 
    log.Info("Hello From Logger"); 
    Console.WriteLine("Hello From Console"); 
} 

Ich bin Kompilieren und das mit .NET 4.5 mono auf einem Ubuntu 16.04-System ausführen. Wenn ich das Programm über die Konsole ausgeführt wird die Ausgabe wie erwartet:

$ mono Program.exe 
INFO - Hello From Logger 
Hello From Console 

Allerdings, wenn ich das gleiche Programm in einem Docker Behälter in frei stehenden Modus laufe (dh „Docker Lauf -d“) und dann die überprüfen Protokolle, ich das Protokoll nur aus der Console.WriteLine erhalten:

$ docker logs <container_id> 
Hello From Console 

Bei dem Versuch, diese ausfindig zu machen, habe ich versucht, das Programm läuft das daemonize Werkzeug (more info here) verwenden und es das gleiche Verhalten gezeigt, führt mich zu glauben, Es war ein Problem mit log4net statt docker. Ich schrieb auch eine benutzerdefinierte appender für log4net die Console.Write nur, dass (ich glaube, dass die gleiche Funktionalität wie ConsoleAppender ist, aber ich wollte alle anderen möglichen Variablen eliminieren):

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

Aber kein Glück. Kann jemand mit einem tiefen Wissen über log4net mich darauf hinweisen, wo ich etwas falsch machen könnte, oder erklären, was Log4net tun könnte, so dass andere Programme, die diesen Stream erfassen sollten, dies nicht tun?

UPDATE: Die Handlung verdichtet sich! Ich schrieb eine schnelle und schmutzige ausführbare Datei, die die Process-Klasse verwendet, um mein Beispielprogramm auszuführen. Es greift dann das stdout aus dem Beispielprogramm und schreibt sie mit Console.WriteLine, etwa so:

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()); 

Dies funktioniert gut, wenn ich es direkt von der Konsole laufen, aber hat das gleiche Problem, wenn ich es von Docker laufen/dämonisieren So, jetzt bin ich wirklich verwirrt.

Antwort

2

Es ist nicht viel von einer Antwort, aber für den Fall, dass jemand anderes dieses Problem auftritt, konnte ich Protokollierung mit der NLog-Bibliothek here arbeiten.

Verwandte Themen