3

我正在开发基于别人框架,netty和spring的顶部的游戏服务器。

而且我想知道使用 log4j 为每个游戏室生成单独的文件是否是一种好方法。由于许多游戏室服务器必须保持打开大量日志文件。另一方面,如果只有一个日志文件,那将是一团糟,在分析问题时需要解析和过滤。

当我需要知道如何实现它时,如果许多日志文件仍然是一个好方法。我看过这个问题configure log4j to log to log to custom at runtime,但第一个答案并不清楚,如何最小化每次尝试写入单独的日志文件所需的代码行。我已经通过放入配置文件尝试了第二个答案

log4j.appender.logfile.File=${logfile.name}

但框架有

PropertyConfigurator.configure(System.getProperty("log4j.configuration"));

如果在开始时未指定日志文件,则会失败。

欢迎任何想法和意见!谢谢

UPD:这个链接对我来说似乎也很有帮助。Log4j 记录到单独的文件但仍然:这是个好主意以及如何以最少的编码动态切换输出日志文件。

4

2 回答 2

5

真的,归根结底,为游戏室拥有多个日志文件将是矫枉过正。文件 I/O 会对性能产生影响,即使可以忽略不计。此外,作为程序员,我们可以使用许多工具来解析和过滤信息,事后这样做似乎更合理。

例如,只要每个游戏室在记录时匹配特定模式,您就可以轻松地使用 grep 和 Linux>运算符解析游戏室 X 的所有数据,然后写入另一个文件,您可以在其中单独分析它。让您的生产服务器执行此操作,当您可能会或可能不会查看日志时,并不是对资源的最佳利用。

例如,运行这个命令可以快速获得我需要的关于游戏室 X 的所有信息:

grep "game room x" mainLog.log > outputToAnalyze.log
于 2012-09-27T03:04:56.823 回答
2

我同意 jmort253,但如果你真的想要每个房间有一个文件,请为每个房间创建一个附加程序:

如果房间是静态的,只需在 log4j 配置文件中定义附加程序,如果不在运行时执行:

这正是这里接受的答案所说的:

  SimpleLayout layout = new SimpleLayout();    
  FileAppender appender = new FileAppender(layout,"<room_file_name>",false);    
  logger.addAppender(appender);

基本上,您不需要配置文件,那里的代码替换它并使用它们的文件名动态定义附加程序,所以我建议:

  1. 编写一个方法来创建接收文件名作为参数的动态附加程序(并且可能返回记录器或接收记录器并将附加程序添加到其中)
  2. 在创建房间的地方调用该方法
  3. 将带有新附加程序的记录器分配给每个房间并使用它
于 2012-09-27T21:01:02.400 回答