`
serryzhao
  • 浏览: 115640 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

log4r 1.0.5 的DateFileOutPutter有个bug

阅读更多
当指定了输出文件后log日志并没有按照追加的形式记录,而是不断的被覆盖掉了,而他的父类FileOutputter反而能按追加的形式产生文件。
看了一下源码,少了对已有文件的处理,例如日志的路径、名称等

1.0.5
                                                                      
   
require "log4r/outputter/fileoutputter"                                   
require "log4r/staticlogger"                                              
                                                                          
module Log4r                                                              
                                                                          
  # Additional hash arguments are:                                        
  #                                                                       
  # [<tt>:dirname</tt>]         Directory of the log file                 
  # [<tt>:date_pattern</tt>]    Time.strftime format string (default is "%
                                                                          
  class DateFileOutputter < FileOutputter                                 
    DEFAULT_DATE_FMT = "%Y-%m-%d"                                         
                                                                          
    def initialize(_name, hash={})                                        
      @DatePattern = (hash[:date_pattern] or hash['date_pattern'] or      
                      DEFAULT_DATE_FMT)                                   
      @DateStamp = Time.now.strftime( @DatePattern);                      
      _dirname = (hash[:dirname] or hash['dirname'])                      
      # hash[:dirname] masks hash[:filename]                              
      if _dirname                                                         
        if not FileTest.directory?( _dirname)                             
          raise StandardError, "'#{_dirname}' must be a valid directory", 
        end                                                               
        @filebase = File.basename( $0, '.rb') + ".log"                    
      else                                                                
        @filebase = File.basename((hash[:filename] or hash['filename'] or 
      end                                                                 
      hash['filename'] = File.join(_dirname,                              
                    @filebase.sub(/(\.\w*)$/, "_#{@DateStamp}" + '\1'))   
      super(_name, hash)                                                  
    end                                                                   
                                                                          
    #######                                                               
    private                                                               
    #######                                                               
                                                                          
    # perform the write                                                   
    def write(data)                                                       
      change if requiresChange                                            
      super                                                               
    end                                                                   
                                                                          
    # construct a new filename from the DateStamp                         
    def makeNewFilename                                                   
        @DateStamp = Time.now.strftime( @DatePattern);                    
        @filename = File.join(File.dirname(@filename),                    
                    @filebase.sub(/(\.\w*)$/, "_#{@DateStamp}" + '\1'))   
    end                                                                   
                                                                          
    # does the file require a change?                                     
    def requiresChange                                                    
      _DateStamp = Time.now.strftime( @DatePattern);                      
      if not _DateStamp == @DateStamp                                     
        @DateStamp = _DateStamp                                           
        return true                                                       
      end                                                                 
      false                                                               
    end                                                                   
                                                                          
    # change the file                                                     
    def change                                                            
      begin                                                               
        @out.close                                                        
      rescue                                                              
        Logger.log_internal {                                             
          "DateFileOutputter '#{@name}' could not close #{@filename}"     
        }                                                                 
      end                                                                 
      makeNewFilename                                                     
      @out = File.new(@filename, (@trunc ? "w" : "a"))                    
      Logger.log_internal {                                               
        "DateFileOutputter '#{@name}' now writing to #{@filename}"        
      }                                                                   
    end                                                                   
  end                                                                     
                                                                          
end                                                                   


1.1.7

                                                                                     
require "log4r/outputter/fileoutputter"                                              
require "log4r/staticlogger"                                                         
                                                                                     
module Log4r                                                                         
                                                                                     
  # Additional hash arguments are:                                                   
  #                                                                                  
  # [<tt>:dirname</tt>]         Directory of the log file                            
  # [<tt>:date_pattern</tt>]    Time.strftime format string (default is "%Y-%m-%d")  
                                                                                     
  class DateFileOutputter < FileOutputter                                            
    DEFAULT_DATE_FMT = "%Y-%m-%d"                                                    
                                                                                     
    def initialize(_name, hash={})                                                   
      @DatePattern = (hash[:date_pattern] or hash['date_pattern'] or                 
                      DEFAULT_DATE_FMT)                                              
      @DateStamp = Time.now.strftime( @DatePattern);                                 
      _dirname = (hash[:dirname] or hash['dirname'])                                 
      # hash[:dirname] masks hash[:filename]                                         
      if _dirname                                                                    
        if not FileTest.directory?( _dirname)                                        
          raise StandardError, "'#{_dirname}' must be a valid directory", caller     
        end                                                                          
      end                                                                            
                                                                                     
      _filename = (hash[:filename] or hash['filename'])                              
      if _filename.nil?                                                              
        @filebase = File.basename( $0, '.rb') + ".log"                               
      else                                                                           
        @filebase = File.basename((hash[:filename] or hash['filename'] or ""))       
      end                                                                            
                                                                                     
      # Get rid of the 'nil' in the path                                             
      path = [_dirname, @filebase.sub(/(\.\w*)$/, "_#{@DateStamp}" + '\1')].compact  
      hash[:filename] = hash['filename'] = File.join(path)                           
                                                                                     
      super(_name, hash)                                                             
    end                                                                              
                                                                                     
    #######                                                                          
    private                                                                          
    #######                                                                          
                                                                                     
    # perform the write                                                              
    def write(data)                                                                  
      change if requiresChange                                                       
      super                                                                          
    end                                                                              
                                                                                     
    # construct a new filename from the DateStamp                                    
    def makeNewFilename                                                              
        @DateStamp = Time.now.strftime( @DatePattern);                               
        @filename = File.join(File.dirname(@filename),                               
                    @filebase.sub(/(\.\w*)$/, "_#{@DateStamp}" + '\1'))              
    end                                                                              
                                                                                     
    # does the file require a change?                                                
    def requiresChange                                                               
      _DateStamp = Time.now.strftime( @DatePattern);                                 
      if not _DateStamp == @DateStamp                                                
        @DateStamp = _DateStamp                                                      
        return true                                                                  
      end                                                                            
      false                                                                          
    end                                                                              
                                                                                     
    # change the file                                                                
    def change                                                                       
      begin                                                                          
        @out.close                                                                   
      rescue                                                                         
        Logger.log_internal {                                                        
          "DateFileOutputter '#{@name}' could not close #{@filename}"                
        }                                                                            
      end                                                                            
      makeNewFilename                                                                
      @out = File.new(@filename, (@trunc ? "w" : "a"))                               
      Logger.log_internal {                                                          
        "DateFileOutputter '#{@name}' now writing to #{@filename}"                   
      }                                                                              
    end                                                                              
  end                                                                                
                                                                                     
end                                                                                  

                                           
分享到:
评论

相关推荐

    Python库 | django-rlog-1.0.5.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:django-rlog-1.0.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    vlc-1.0.5.zip

    这个版本的历史相对较早,因此可能不包含后来版本中的一些新功能和优化,但它对于那些需要在旧系统或低配置设备上运行,或者需要测试兼容性的人来说,依然有其价值。 VLC的核心特性包括支持多种视频和音频格式,...

    esp32-1.0.5.zip

    总的来说,`esp32-1.0.5.zip`是一个重要的资源包,它为ESP32的开发提供了必要的软件基础,使开发者能够利用ESP32的强大功能,开发出各种创新的物联网和嵌入式应用。无论是初学者还是经验丰富的开发者,都能从中受益...

    cpdetector_1.0.5.zip

    "cpdetector_1.0.5.zip" 是一个压缩包文件,其中包含了 "cpdetector_1.0.5.jar" 这个Java可执行文件。从这个标题和描述,我们可以推测"cpdetector"是一个软件工具,可能用于检测或分析某种特定的计算机系统组件或...

    arduino-1.0.5-windows

    描述中提到它是“最新”的,虽然现在可能有更高级的版本,但在当时发布时,1.0.5版确是Windows用户最新的选择,并且它支持中文界面,这对于中文用户来说非常友好。 Arduino IDE是开源的,这意味着它的源代码可供...

    jodeplugin_1.0.5.zip

    标题“jodeplugin_1.0.5.zip”暗示我们正在处理一个软件插件的压缩包,版本号为1.0.5。这个插件很可能用于扩展或增强某个应用程序的功能,而“jode”可能是该插件的名字或者是与其相关的开发平台或框架。描述中的...

    KEmulator 1.0.5 中文版

    PC中最强的J2ME虚拟机 2012元月又出更新了 1.0.5 [2012.01.02] Fixed several bug chinese language pack details of the changes

    jxls1.0.5报表工具

    jxls1.0.5是该工具的一个版本,它提供了一系列增强功能和改进,帮助开发者更便捷地处理Excel数据的导出和导入。 ### 1. jxls-core-1.0.5.jar 这是jxls的核心组件,包含了处理Excel模板和数据的主要类和接口。它...

    一键安装安卓驱动_V1.0.5.zip

    "一键安装安卓驱动_V1.0.5.zip" 是一个专门为简化安卓驱动安装过程而设计的工具,尤其对于新手用户来说,这是一个非常实用的解决方案。 首先,我们要理解驱动程序的必要性。在开发环境或进行设备调试时,开发者通常...

    pandas1.0.5.pdf

    版本1.0.5是这个强大工具包的一个稳定版本,由Wes McKinney领导的Pandas开发团队在2020年6月17日发布。Pandas的出现极大地简化了数据科学家和分析师的工作,它提供了高效的数据结构和数据分析方法,使得数据清洗、...

    vlc-1.0.5-intel.dmgvlc-1.0.5-intel 万能播放软件

    vlc-1.0.5-intel.dmgvlc-1.0.5-intel 万能播放软件vlc-1.0.5-intel.dmgvlc-1.0.5-intel 万能播放软件vlc-1.0.5-intel.dmgvlc-1.0.5-intel 万能播放软件

    VLC播放器1.0.5 安装版

    VLC播放器1.0.5 安装版 提供给可以上CSDN但是不能上外网的朋友

    avrdude-GUI 1.0.5

    而`avrdude-GUI 1.0.5`则是`avrdude`的一个图形化界面扩展,为用户提供了更为直观和便捷的操作体验。 `avrdude`本身是一个开源的命令行工具,主要用于编程AVR微控制器系列,这些微控制器在许多Arduino板上都有使用...

    bcdautofix_v1.0.5

    bcdautofix_v1.0.5是一款专用于修复多系统启动项和恢复原始系统开机画面的工具。在深入理解这个工具之前,我们首先要了解一些基础概念。 **启动配置数据(BCD)** BCD(Boot Configuration Data)是Windows Vista及...

    ezmorph-1.0.5.jar

    ezmorph-1.0.5.jar java

    p0sixspwn v1.0.5 mac

    在2013年1月6日,p0sixspwn的1.0.5版本发布,专门为MAC用户提供了一个简单易用的界面,帮助用户绕过苹果的软件限制,打开他们的iOS设备的大门。 越狱是指通过特殊手段解除苹果对其设备的严格控制,允许用户安装非...

    evasi0n 7 win 1.0.5

    标题中的“evasi0n 7 win 1.0.5”指的是一个针对iOS设备的越狱工具,特别设计用于Windows操作系统。evasi0n是著名的越狱团队开发的一系列越狱软件之一,而这个版本(1.0.5)是针对iOS 7系统的一个更新。 描述中提到...

    Keil.STM32F1xx_DFP.1.0.5.zip

    在1.0.5版本的更新中,可能包含了对之前版本的bug修复、性能优化或新增的外设支持。对于开发者而言,及时更新到最新版本的DFP,可以确保项目利用到最新的功能,并且避免因已知问题带来的困扰。 在使用Keil.STM32F1...

    pdf_renderer-1.0.5.jar

    PDF Renderer 1.0.5 是一个专门用于解析PDF文档的Java库,它提供了一种在Java应用程序中处理和显示PDF内容的方式。这个名为“pdf_renderer-1.0.5.jar”的文件是一个JAR(Java Archive)包,它是Java平台上的可执行...

Global site tag (gtag.js) - Google Analytics