【问题标题】:log4j in a JRuby on Rails app - redirecting logs to a separate fileJRuby on Rails 应用程序中的 log4j - 将日志重定向到单独的文件
【发布时间】:2012-01-25 05:41:26
【问题描述】:

我想在我的 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("Log to feature_1.log")
Rails.logger.feature_N("Log to feature_N.log")

实现这一点的最佳方法是什么,所以并非所有内容都保存在一个日志文件中?

另外需要注意的是,我正在使用博客中提到的适配器:http://squaremasher.blogspot.com/2009/08/jruby-rails-and-log4j.html

【问题讨论】:

    标签: java ruby-on-rails logging log4j jruby


    【解决方案1】:

    首先,您应该在 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多