我想编写一个ruby脚本,该脚本从具有文件名的配置文件中读取,然后当我运行脚本时,它将获取每个文件的尾部并输出控制台。
这样做最好的方法是什么?
答案 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。