我只是想知道是否存在以下事情。
我有一个TCP通信器,可以与数千台设备保持通信。
目前,TCP通信器将所有事件记录在一个日志文件中。
现在,是否可以记录与不同文件中的每个设备的通信。每个设备的IMEI号都不同。因此记录器将检查名称是否等于设备的IMEI号的文件。如果文件存在,logger将开始记录该文件中设备的事件,否则它将创建一个新文件,其中IMEI作为文件名,并开始记录该文件中的事件。
(我们正在用Java开发我们的应用程序。)
答案 0 :(得分:3)
LogBack是未来,它就在这里!
作为log4j的后继者并且完全投诉slf4j框架,logback可能是满足您需求的简单(和干净)方式。
我不是专家,但我想SiftingAppender可能是正确答案。应该有一个鉴别器选项。也许你可以构建自己的鉴别器,扩展SiftingAppender,或者从Janino库获得一些额外的帮助。
希望这有帮助!
答案 1 :(得分:1)
如果您自己实施记录器,那么没有什么可以阻止您这样做 例如,将日志功能作为参数提供您当前正在与之通信的设备的编号,并按照您描述的方式实现。
答案 2 :(得分:1)
如果你正在使用我强烈推荐的Apache log4j,可以通过扩展AppenderSkeleton来创建自定义日志记录appender,为单个连接编写唯一文件就像使用标准文件I / O一样简单变量文件名。
答案 3 :(得分:0)
如果您使用的是java.util.logging
,请查看Handler
base class,如果您使用的是log4j,请查看Appender
。在这两种情况下,您都需要以某种方式获取与消息关联的IMEI,因此编写日志消息的代码可以选择适当的文件。
有两种方法可以做到这一点。
首先是分别扩展日志事件类(LogRecord
或LoggingEvent
)。这将允许您使用包含IMEI的事件进行日志记录。但是,这并不考虑在与设备进行对话时由其他库等执行的日志记录。
另一种选择是使用ThreadLocal。无论何时收到消息或正在制定消息,都要设置与套接字关联的IMEI。确保日志记录发生在同一个线程中,并且任何排队都在日志处理程序/ appender中完成。如果您不熟悉这种方法,请查找/询问有关ThreadLocals的问题。我相信Log4J的NDC
和MDC
实现了这种策略,但我没有尝试在appender上对上下文进行专门的处理。
最后,请注意,如果您确实想要保持“数千”日志文件处于打开状态,则某些操作系统将耗尽文件句柄。根据文件的数量,您可能需要考虑将日志消息(使用IMEI)写入数据库,或者执行某种基于LRU的文件关闭。在后者中,基本上没有文件句柄用于暂时没有触及的日志文件。