java - JRuby on Rails 应用程序中的 log4j - 将日志重定向到单独的文件

标签 java ruby-on-rails logging log4j jruby

我想在我的 JRuby on Rails 应用程序中获得更精细的日志记录。我介绍了 log4j。我目前有一个如下所示的属性文件:

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

#
log4j.logger.Rails=INFO, A

log4j.appender.A=org.apache.log4j.RollingFileAppender
log4j.appender.A.File=/usr/share/tomcat6/logs/production.log
log4j.appender.A.MaxFileSize=10000KB
log4j.appender.A.MaxBackupIndex=5
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

为了让 Rails.logger 使用它,我弹出了以下初始化程序:

org.apache.log4j.PropertyConfigurator.configure("#{::Rails.root.to_s}/config/log4j.properties")

现在,我还希望能够做类似的事情:

Rails.logger.feature_1("记录到 feature_1.log")
Rails.logger.feature_N("记录到 feature_N.log")

实现这一目标的最佳方式是什么,而不是所有内容都进入一个日志文件?

另外请注意,我使用的适配器已在此处发布:http://squaremasher.blogspot.com/2009/08/jruby-rails-and-log4j.html

最佳答案

首先,您应该在 log4j.properties 文件中为您需要的每个“功能”定义一个 appender/logger 配置:

...
log4j.logger.Rails=INFO, A

log4j.appender.A=org.apache.log4j.RollingFileAppender
log4j.appender.A.File=/usr/share/tomcat6/logs/production.log

...
log4j.logger.feature_1=INFO, feature_1

log4j.appender.feature_1=org.apache.log4j.RollingFileAppender
log4j.appender.feature_1.File=/path/to/your/feature_1.log
...
log4j.logger.feature_N=INFO, feature_N

log4j.appender.feature_N=org.apache.log4j.RollingFileAppender
log4j.appender.feature_N.File=/path/to/your/feature_N.log

这样每个记录器都会有自己的严重性过滤器和目标文件。

然后,您可以根据您在月球的 Ruby 端调用的方法(来自您提供的示例适配器)选择它,而不是总是使用相同的记录器:

class Log4jAdapter

  def method_missing(meth, *args)
    # Checking the method name matches feature_N
    if /\Afeature_(\d+)\z/ =~ method.to_s
      # Retrieve the appropriate logger => getLogger('feature_N')
      logger = org.apache.log4j.Logger.getLogger(method.to_s)
      # Log !
      logger.log *args
    else
        puts "UNSUPPORTED METHOD CALLED: #{meth}"
    end
  end

end

未经测试,但我想您会明白的。

关于java - JRuby on Rails 应用程序中的 log4j - 将日志重定向到单独的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8998363/

相关文章:

mysql - 如何在 rails 中分配 AUTO_INCREMENT 值

ruby-on-rails - 如何为 nil :NilClass error? 修复未定义的方法 `split'

angular - 禁用 Angular 路由事件的日志记录

java - Log4j 中日志级别的不同布局

java - 从 Android 颜色转换为 HTML 颜色

java - 在屏幕上生成通知

java - Android 变量作用域;或者,我的绳子到底在哪里

ruby-on-rails - 我知道如何设置类方法,但如何动态设置实例方法?

mysql - 如何在 MySQL 中只记录原始查询?

java - 即使没有指定接口(interface),也可以针对接口(interface)编译 Java 类