跨语言系统(Java、C++、Python)应使用哪个日志库

11 投票
3 回答
3364 浏览
提问于 2025-04-15 23:00

我有一个系统,里面有一个中心的Java控制器,它负责启动分析过程,这些过程可能是用C++、Java或者Python写的(大部分是C++)。现在这些过程都在同一台服务器上运行。你有什么建议来

  • 创建一个中心日志,让所有的过程都可以写入这个日志
  • 如果将来我把一些过程推到另一台服务器上,怎么才能支持分布式日志呢?

谢谢!

3 个回答

1

我会使用Apache log4cxx 或 Apache log4j。它们很高效,能够把日志分层管理,这样可以让你的日志更有条理。这项技术已经被验证了很长时间,可靠性不错。

目前,它支持多种输出方式,比如控制台、文件、图形界面组件、远程套接字服务器、NT事件记录器,还有远程的UNIX Syslog守护进程。你也可以选择异步记录日志,也就是不需要等日志写完再继续其他操作。

那么,如何支持分布式日志记录呢?比如可以使用远程套接字服务器的输出方式。

5

我建议使用平台自带的日志记录工具,在Posix系统上是syslog,而在Windows上是事件日志。

如果你用C++,可以直接调用平台提供的原生接口。

我知道Python在Posix系统上有系统调用的封装,而在Windows上可以通过PyWin32扩展来使用事件日志。我想现在应该有人为Java也做了类似的封装。

更新

关于syslog和多个文件的问题。syslog支持“设施”的概念,通过设施你可以把不同的日志发送到不同的文件。不过,设施是预定义的;虽然有8个通用的设施,从LOG_LOCAL0LOG_LOCAL7,但你不能随意定义新的设施。

另外,syslog守护进程决定了每个设施/级别的日志信息该发送到哪里。你可能需要调整syslog守护进程的配置,以便让每个设施的日志发送到不同的文件。

1

Apache有一些跨平台的日志库,这些库可以让你用不同的编程语言记录日志,使用的接口也差不多。不过可惜的是,它们没有Python的接口,不过你可以试着用log4cpp和Boost.Python自己做一个。

我参与的一个项目使用这些库把日志记录到数据库里,这样就可以实现“分布式日志”,也就是把日志信息集中到一个地方。我得承认,我对这种方式不是很喜欢。另一个项目则是把日志记录到本地的日志系统。Windows事件日志有一些分布式日志的功能,但据我所知,syslog没有。

虽然我没有使用过,但可能更合适的选择是Facebook的Scribe项目。它的功能符合你的需求,还包括Python的接口。不过,它使用了Thrift,而Thrift在Windows上的C++不太好用(也就是说,Thrift编译器生成的C++代码只在UNIX系统上能用)。你可以尝试用Cygwin来解决这个问题,但我不能保证这个方法一定有效。

撰写回答