【问题标题】:Implementing logging实现日志记录
【发布时间】:2011-08-23 23:57:04
【问题描述】:

我只是想知道是否存在以下内容。

我有一个 TCP 通信器,它可以与数千个设备保持通信。

目前,TCP 通信器将所有事件记录在一个日志文件中。

现在,是否可以在不同文件中记录与每个设备的通信。每个设备的IMEI号都不一样。因此,记录器将检查名称等于设备 IMEI 号的文件是否存在。如果文件存在,logger 将开始在该文件中记录设备的事件,否则它将创建一个以 IMEI 作为文件名的新文件并开始在该文件中记录事件。

(我们正在用 Java 开发我们的应用程序。)

【问题讨论】:

  • 您使用的是什么日志记录实用程序? java.util.logging?还是 log4j、slf4j?

标签: java logging


【解决方案1】:

LogBack 是未来,它就在这里!

作为 log4j 的继承者创建并完全符合 slf4j 框架,logback 可能是满足您需求的简单(和干净)方式。

我不是专家,但我猜SiftingAppender 可能是正确的答案。你应该有一个鉴别器选项。也许您可以构建自己的鉴别器,扩展 SiftingAppender,或者从 Janino 库中获得一些额外的帮助。

希望这会有所帮助!

【讨论】:

  • SiftingAppender 旨在处理这种情况。只需在 logback-user 邮件列表中提出问题以获得更多帮助。
  • @Gevorg & Ceki 感谢您的回答。我们使用了 SiftingAppender,它帮助我们满足了我们的要求。
【解决方案2】:

如果您自己实现记录器,没有什么可以阻止您这样做。
例如,将 log 函数作为参数提供您当前正在与之通信的设备的编号,并按照您描述的方式实现它。

【讨论】:

    【解决方案3】:

    如果您使用我强烈推荐的Apache log4j,请通过扩展AppenderSkeleton 创建自定义日志附加程序,并为各个连接编写唯一文件,这将与使用可变文件名执行标准文件I/O 一样简单。

    【讨论】:

      【解决方案4】:

      如果您使用的是java.util.logging,请查看Handler base class,如果您使用的是log4j,请查看Appender。在这两种情况下,您都需要以某种方式获取与消息关联的 IMEI,以便编写日志消息的代码可以选择适当的文件。

      有两种方法可以做到这一点。

      首先是扩展日志事件类(分别为LogRecordLoggingEvent)。这将允许您使用包含 IMEI 的事件进行日志记录。但是,这不考虑在与设备执行对话时由其他库等执行的日志记录。

      另一种选择是使用 ThreadLocal。每当您收到消息或正在制定消息时,设置与套接字关联的 IMEI。确保日志记录发生在同一个线程中,并且任何排队都在日志处理程序/附加程序中完成。如果您不熟悉这种方法,请查找/询问有关 ThreadLocals 的问题。我相信 Log4J 的 NDCMDC 实现了这种策略,但我没有尝试在 appender 上对上下文进行专门的处理。

      最后,请注意,如果您确实在考虑保持“数千个”日志文件处于打开状态,某些操作系统将耗尽文件句柄。根据文件的数量,您可能需要考虑将日志消息(使用 IMEI)写入数据库,或者执行某种基于 LRU 的文件关闭。在后者中,您基本上不会有一段时间未触及的日志文件的文件句柄。

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多