一个ruby脚本在日志文件上运行尾部?

时间:2011-12-16 17:32:59

标签: ruby

我想编写一个ruby脚本,该脚本从具有文件名的配置文件中读取,然后当我运行脚本时,它将获取每个文件的尾部并输出控制台。

这样做最好的方法是什么?

4 个答案:

答案 0 :(得分:4)

看一下File::Tail gem。

答案 1 :(得分:2)

您可以从ruby脚本中调用linux tail -number_of_lines file_name命令,让它在控制台或捕获输出上打印并自行打印(如果您需要在打印之前对这些行执行某些操作)

答案 2 :(得分:1)

我们有一个配置文件,其中包含日志文件列表;例如,像这样:

---
- C:\fe\logs\front_end.log
- C:\mt\logs\middle_tier.log
- C:\be\logs\back_end.log

配置文件的格式为yaml simple sequence,因此假设我们将此文件命名为'settings.yaml'

获取每个文件尾部并输出控制台的ruby脚本可能是这样的:

require 'yaml'
require 'file-tail'

logs = YAML::load(File.open('settings.yaml'))
threads = []

logs.each do |the_log|
  threads << Thread.new(the_log) { |log_filename|
    File.open(log_filename) do |log|
      log.extend(File::Tail)
      log.interval = 10
      log.backward(10)
      log.tail { |line| p "#{File.basename(the_log,".log")} - #{line}" }
    end
  }
end

threads.each { |the_thread| the_thread.join }

注意:显示我希望在其前面添加的每行,以及它所源自的文件的名称,...这对我来说是一个不错的选择,但您可以编辑脚本以根据需要进行更改;尾部参数是相同的。

如果您的环境中缺少file-tail,请点击@Mark Thomas在其服装中发布的链接;即你需要:

> gem install file-tail

答案 3 :(得分:0)

我发现file-tail宝石有点马车。我将写入文件,它将再次读取整个文件,而不仅仅是附加的行。即使我将Index JSON: 76 Insert card: [WIN] Update version Windows Index JSON: 77 Error - TypeError: Cannot read property 'fullname' of undefined - [LZ] Clean /tmp/ Insert card: [LZ] Clean /tmp/ 设置为import * as React from "react"; import ReactDOM from 'react-dom'; import * as TestUtils from 'react-dom/test-utils'; import { } from "mocha"; import Select from "@material-ui/core/Select"; import MenuItem from "@material-ui/core/MenuItem"; let container; beforeEach(() => { container = document.createElement('div'); document.body.appendChild(container); }); afterEach(() => { document.body.removeChild(container); container = null; }); describe("Testing Select component", () => { test('start empty, open and select second option', (done) => { //render the component ReactDOM.render(<Select displayEmpty={true} value={""} onChange={(e) => { console.log(e.target.value); }} disableUnderline classes={{ root: `my-select-component` }} > <MenuItem value={""}>All</MenuItem> <MenuItem value={"1"}>1</MenuItem> <MenuItem value={"2"}>2</MenuItem> <MenuItem value={"3"}>3</MenuItem> </Select>, container); //open filter TestUtils.Simulate.click(container.querySelector('.my-select-component')); const secondOption = container.ownerDocument.activeElement.parentElement.querySelectorAll('li')[1]; TestUtils.Simulate.click(secondOption); done(); }); }); ,也发生了这种情况。我最终写了自己的书,并想在其他人正在寻找文件尾gem的Ruby替代品的情况下在这里分享。您可以找到仓库here。它使用non_blocking io,因此它将立即捕获对该文件的修改。如果您可以使用Ruby编程语言进行编程,则可以轻松解决一个警告。 log.backward硬编码为-1。