none
日志程序中关于日志内容输出的问题 RRS feed

  • 问题

  • 前几天问了一个关于对象池的问题。借助于对象池,我想实现日志的输出。

    在程序中,打印日志时,时常会非常多。而且极可能是多线程下打印。所以,我的想法是,创建日志对象接口 ILogger ,确定如果从对象池里抽取一个日志对象 Content ,将需要打印的日志内容及附加信息写到Content里,然后将此Content放入到待输出队列,由别一个线程(TaskX)从队列里抽取Content并打印。

    我做了一个测试 ConsoleApplication里

    for i -> 1000

        logger.Info("dddddddddddddddddddd");

        logger.Error("dddddddddddddddddddd");

        logger.Warn("dddddddddddddddddddd");

        logger.Fatal("dddddddddddddddddddd");

        Console.WriteLine("第 { x+ 1}组 的 日志")

    然后,我发现,我的控制台已显示输出完成。然后TaskX的抽取过程并没有与前面同步,或相差无几。 TaskX 使用TaskFactory创建,抽取时间隔 Thread.Sleep(1)

    ,我想可能是输入太快。于是我在 for 里设置 Thread.Sleep( .... ) ,这里如果 是300毫秒及以上可以全部将日志输出,小于这个值则不行。

    有没有改进的方案?


    • 已编辑 jinli.zh 2017年12月1日 12:28 修改
    2017年12月1日 6:46

全部回复

  • Hi,

    欢迎在MSDN论坛发帖。

    你是说 TaskX 抽取的log的记录(content), 少于console 输出的吗? 丢失了一些context?  你有没有尝试使用事件的方式来通知别的线程来去东西呢?

    这样就不需要sleep来浪费CPU的资源.

    你可以使用 Synchronization Events and Wait Handles 这种方式来通知另外一个线程来读取数据。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月4日 5:49
    版主
  • 版主,我没有表达TaskX抽取的的Content少吧?

    而且是说实际上 ConcurrentQueue 在TryDequeue上很耗时,即时我将Thread.Sleep(1)去掉, Task的cpu占用率也没有达到100%,此过程是在While 里。

    2017年12月4日 11:52
  • Hi,

    >>,我发现,我的控制台已显示输出完成。然后TaskX的抽取过程并没有与前面同步,或相差无几.

    你是说抽取的过程,只是和console 输出的程序不同步? 并没有少内容?

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月6日 6:24
    版主
  • 是的 console输出完成,task里的 tryDequeue还没有做完。
    2017年12月6日 12:30
  • Hi,

    如果你想让console 和 trydequeue 保持在一个速度上面,我觉得可能需要用线程的同步来完成。

    让console 做完以后,去通知trydequeue ,然后trydequeue 完成通知console。 

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月7日 9:18
    版主
  • 好吧。我的本意是说 tryDeueue耗时啊。我是想要更快的出队
    2017年12月7日 11:47
  • Hi,

    如果你想让task 的出队的更快,你可以设置它的优先级,优先级越高的,那它被执行的速度,也就会越快。

    TaskSettings.Priority property

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月8日 8:54
    版主