我有一个简单的C#程序,其log4net配置如下:
<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");
}我正在Ubuntu16.04系统上使用.NET 4.5Mono编译和运行这个程序。当我使用控制台运行程序时,输出如预期的那样:
$ mono Program.exe
INFO - Hello From Logger
Hello From Console但是,当我在分离模式的Docker容器中运行相同的程序(即"docker运行-d")并检查日志时,我只从Console.WriteLine获得日志:
$ docker logs <container_id>
Hello From Console在试图跟踪这个问题时,我尝试使用守护进程工具(这里有更多的信息)运行这个程序,它展示了相同的行为,使我相信这是log4net而不是docker的问题。我还为log4net编写了一个只执行Console.Write的自定义附录(我相信这与ConsoleAppender的功能相同,但我希望消除任何其他可能的变量):
public class CustomAppender: AppenderSkeleton
{
protected override void Append(LoggingEvent loggingEvent)
{
Console.Write(RenderLoggingEvent(loggingEvent));
}
} 但没有运气。任何对log4net有深入了解的人能告诉我我在哪里做错了什么吗?或者解释一下log4net可以做些什么来进行规范,这样其他应该捕获该流的程序就不会了吗?
更新:情节变复杂了!我编写了一个快速而肮脏的可执行文件,它使用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 / daemonize运行它时,也会遇到同样的问题。所以现在我真的很困惑。
发布于 2017-06-08 00:37:58
这不是一个很好的答案,但是如果其他人遇到了这个问题,我可以使用NLog库这里进行日志记录。
https://stackoverflow.com/questions/44389517
复制相似问题