2017-06-06 6 views
1

J'ai un programme simple C# avec la configuration log4net suivante:Docker log4net manquant journaux 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> 

et le code suivant (en abrégé par souci de clarté):

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

Je compile et en cours d'exécution en utilisant .NET 4.5 mono sur un système Ubuntu 16.04. Quand je lance le programme en utilisant la console la sortie est comme prévu:

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

Cependant, quand je lance ce même programme dans un récipient en mode détaché Docker (par exemple, « docker run -d »), puis vérifiez la journaux, je ne le log de la Console.WriteLine:

$ docker logs <container_id> 
Hello From Console 

Tout en essayant de suivre cette baisse, j'ai essayé d'exécuter le programme en utilisant l'outil de daemonize (more info here) et illustré le même comportement, me conduit à croire c'était un problème avec log4net au lieu de docker. J'ai aussi écrit un appender sur mesure pour log4net qui ne fait que Console.Write (je crois que c'est la même fonctionnalité que ConsoleAppender, mais je voulais éliminer les autres variables possibles):

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

Mais pas de chance. Quelqu'un avec une connaissance approfondie de log4net peut-il me dire où je pourrais faire quelque chose de mal, ou expliquer ce que log4net pourrait faire à stdout de telle sorte que d'autres programmes qui devraient capturer ce flux ne le font pas?

MISE À JOUR: L'intrigue s'épaissit! J'ai écrit un exécutable rapide et sale qui utilise la classe Process pour exécuter mon programme d'exemple. Il saisit alors le stdout du programme exemple et écrit avec Console.WriteLine, comme ceci:

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

Cela fonctionne très bien quand je le lance directement à partir de la console, mais a le même problème quand je le lance à partir docker/démoniser. Alors maintenant je suis vraiment confus.

Répondre

2

Ce n'est pas vraiment une réponse, mais au cas où quelqu'un d'autre rencontrerait ce problème, j'ai réussi à faire fonctionner la journalisation en utilisant la bibliothèque NLog here.