nginx_utils 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +86 -13
- data/bin/nginx_logrotate +29 -0
- data/bin/nginx_status +35 -0
- data/lib/nginx_utils/status.rb +7 -4
- data/lib/nginx_utils/version.rb +1 -1
- data/spec/nginx_utils/status_spec.rb +1 -1
- metadata +9 -5
data/README.md
CHANGED
@@ -8,7 +8,9 @@ Nginx utilities.
|
|
8
8
|
|
9
9
|
Add this line to your application's Gemfile:
|
10
10
|
|
11
|
-
|
11
|
+
```ruby
|
12
|
+
gem 'nginx_utils'
|
13
|
+
```
|
12
14
|
|
13
15
|
And then execute:
|
14
16
|
|
@@ -20,13 +22,34 @@ Or install it yourself as:
|
|
20
22
|
|
21
23
|
## Usage
|
22
24
|
|
23
|
-
|
25
|
+
From console:
|
26
|
+
|
27
|
+
$ nginx_logrotate -h
|
28
|
+
Usage: nginx_logrotate [options]
|
29
|
+
-d, --[no-]debug Debug mode. Run only log output to STDOUT.
|
30
|
+
--script_log=VAL Log file for script.
|
31
|
+
--log_level=VAL Log level of script log.
|
32
|
+
--root_dir=VAL Root directory of Nginx.
|
33
|
+
--target_logs=VAL Specify logs of target.
|
34
|
+
--retention=VAL Specify in days the retention period of log.
|
35
|
+
--pid_file=VAL PID file of Nginx
|
36
|
+
$ nginx_status -h
|
37
|
+
Usage: nginx_status [options]
|
38
|
+
--only-value The output only the value.
|
39
|
+
|
40
|
+
From ruby:
|
41
|
+
|
42
|
+
```ruby
|
24
43
|
require 'nginx_utils'
|
25
44
|
```
|
26
45
|
|
27
|
-
Logrotate
|
46
|
+
### Logrotate
|
28
47
|
|
29
|
-
|
48
|
+
Logs of rename target: `Dir.glob "#{root_dir}/**/#{target_logs}"`
|
49
|
+
Logs of delete target: `Dir.glob "#{root_dir}/**/#{target_logs}.*"`
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
# Following parameters are default.
|
30
53
|
params = {
|
31
54
|
debug: false,
|
32
55
|
script_log: "/tmp/nginx_rotate.log",
|
@@ -39,28 +62,78 @@ params = {
|
|
39
62
|
}
|
40
63
|
|
41
64
|
rotate = NginxUtils::Logrotate.new(params)
|
65
|
+
# == Configure
|
66
|
+
# rotate.config log_level: :worn
|
67
|
+
|
68
|
+
# == Accessor
|
69
|
+
# rotate.logger.formatter = proc { |severity, datetime, progname, msg|
|
70
|
+
# "#{datetime}: #{msg}\n"
|
71
|
+
# }
|
72
|
+
# rotate.rename_logs << add_rename_log
|
73
|
+
# rotate.delete_logs << add_delete_log
|
74
|
+
|
42
75
|
rotate.execute
|
43
76
|
```
|
44
77
|
|
45
|
-
|
78
|
+
Options that can be specified:
|
46
79
|
|
47
|
-
|
48
|
-
|
49
|
-
|
80
|
+
* `:debug` => `true` or `false`. If `:debug` is true, it is not execute.
|
81
|
+
* `:script_log` => `"/path/to/nginx_rotate.log"`. If `:script` is false, do not output logs.
|
82
|
+
* `:log_level` => `:debug` or `:info` or `:warn` or `:error` or `:fatal`.
|
83
|
+
* `:root_dir` => `"/path/to/nginx"`. Root directory of Nginx.
|
84
|
+
* `:target_logs` => `"*.log"`. Specify logs of target.
|
85
|
+
* `:prefix` => `Time.now.strftime("%Y%m%d%H%M%S")`. Prefix use to rename.
|
86
|
+
* `:retention` => `90`. Specify in days the retention period of log.
|
87
|
+
* `:pid_file` => `"/path/to/nginx.pid"`. Use to restart Nginx.
|
50
88
|
|
51
|
-
|
89
|
+
### Status
|
52
90
|
|
91
|
+
Require **HttpStubStatusModule**.
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
# http://localhost/nginx_status
|
95
|
+
NginxUtils::Status.get # => {active_connection: 1, accepts: 4, handled: 5, requests: 51, reading: 1, writing: 3, waiting: 2}
|
96
|
+
|
97
|
+
# Apache like
|
98
|
+
# http://example.com/server-status
|
99
|
+
NginxUtils::Status.get(host: "example.com", path: "/server-status")
|
53
100
|
```
|
54
|
-
|
101
|
+
|
102
|
+
### Logreader
|
103
|
+
|
104
|
+
LTSV:
|
105
|
+
|
106
|
+
The default format is `:ltsv`.
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
log_file = "/path/to/nginx/logs/access.log.ltsv"
|
110
|
+
reader = NginxUtils::Logreader.new(log_file)
|
55
111
|
reader.each do |line|
|
56
112
|
p line # => {time: "2013-05-19T08:13:14+00:00", host: "192.168.1.10", ...}
|
57
113
|
end
|
58
114
|
```
|
59
115
|
|
116
|
+
Combined:
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
log_file = "/path/to/nginx/logs/access.log.combined"
|
120
|
+
reader = NginxUtils::Logreader.new(log_file, format: :combined)
|
121
|
+
reader.each {|line| p line} # => {:remote_addr=>"x.x.x.x", :remote_user=>"-", :time_local=>"19/May/2013:23:14:04 +0900", :request=>"GET / HTTP/1.1", :status=>"200", :body_bytes_sent=>"564", :http_referer=>"-", :http_user_agent=>"-"}
|
122
|
+
```
|
123
|
+
|
124
|
+
Custom:
|
125
|
+
|
126
|
+
```ruby
|
127
|
+
log_file = "/path/to/nginx/logs/access.log.combined"
|
128
|
+
parser = /\[(.*)\]\s"(.*?)"/
|
129
|
+
reader = NginxUtils::Logreader.new(log_file, parser: parser)
|
130
|
+
reader.each {|line| p line.first} #=> ["19/May/2013:23:13:52 +0900", "GET / HTTP/1.1"]
|
131
|
+
```
|
132
|
+
|
60
133
|
Options that can be specified:
|
61
134
|
|
62
|
-
*
|
63
|
-
*
|
135
|
+
* `:format` => `:ltsv` or `:combined`. If parser is specified, format is automatically `:custom`.
|
136
|
+
* `:parser` => Parse with `String#scan`. Specified in Regexp.
|
64
137
|
|
65
138
|
## Contributing
|
66
139
|
|
@@ -68,4 +141,4 @@ Options that can be specified:
|
|
68
141
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
69
142
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
70
143
|
4. Push to the branch (`git push origin my-new-feature`)
|
71
|
-
5. Create new Pull Request
|
144
|
+
5. Create new Pull Request
|
data/bin/nginx_logrotate
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
require "optparse"
|
5
|
+
|
6
|
+
begin
|
7
|
+
require "nginx_utils"
|
8
|
+
rescue LoadError => e
|
9
|
+
puts e
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
|
13
|
+
# Option parse
|
14
|
+
options = {}
|
15
|
+
|
16
|
+
opt = OptionParser.new
|
17
|
+
Version = "0.0.1"
|
18
|
+
opt.on("-d", "--[no-]debug", "Debug mode. Run only log output to STDOUT.") {|v| options[:debug] = v}
|
19
|
+
opt.on("--script_log=VAL", "Log file for script.") {|v| options[:script_log] = v}
|
20
|
+
opt.on("--log_level=VAL", "Log level of script log.") {|v| options[:log_level] = v.to_sym}
|
21
|
+
opt.on("--root_dir=VAL", "Root directory of Nginx.") {|v| options[:root_dir] = v}
|
22
|
+
opt.on("--target_logs=VAL", "Specify logs of target.") {|v| options[:target_logs] = v}
|
23
|
+
opt.on("--retention=VAL", "Specify in days the retention period of log.") {|v| options[:retention] = v.to_i}
|
24
|
+
opt.on("--pid_file=VAL", "PID file of Nginx") {|v| options[:pid_file] = v}
|
25
|
+
|
26
|
+
opt.parse! ARGV
|
27
|
+
|
28
|
+
rotate = NginxUtils::Logrotate.new(options)
|
29
|
+
rotate.execute
|
data/bin/nginx_status
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
require "optparse"
|
5
|
+
|
6
|
+
begin
|
7
|
+
require "nginx_utils"
|
8
|
+
rescue LoadError => e
|
9
|
+
puts e
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
|
13
|
+
# Option parse
|
14
|
+
options = {}
|
15
|
+
|
16
|
+
opt = OptionParser.new
|
17
|
+
Version = "0.0.1"
|
18
|
+
opt.on("--only-value", "The output only the value.") {|v| options[:only_value] = v}
|
19
|
+
|
20
|
+
opt.parse! ARGV
|
21
|
+
|
22
|
+
if ARGV.size > 0
|
23
|
+
host = ARGV.shift
|
24
|
+
result = NginxUtils::Status.get host: host
|
25
|
+
else
|
26
|
+
result = NginxUtils::Status.get
|
27
|
+
end
|
28
|
+
|
29
|
+
if options[:only_value]
|
30
|
+
puts result.values.join("\t")
|
31
|
+
else
|
32
|
+
puts "Active Connections: #{result[:active_connection]}"
|
33
|
+
puts "Accepts: #{result[:accepts]} Handled: #{result[:handled]} Requests: #{result[:requests]}"
|
34
|
+
puts "Reading: #{result[:reading]} Writing: #{result[:writing]} Waiting: #{result[:waiting]}"
|
35
|
+
end
|
data/lib/nginx_utils/status.rb
CHANGED
@@ -3,15 +3,18 @@
|
|
3
3
|
module NginxUtils
|
4
4
|
module Status
|
5
5
|
class << self
|
6
|
-
def get(options={
|
6
|
+
def get(options={})
|
7
|
+
host = options[:host] || "localhost"
|
8
|
+
port = options[:port] || 80
|
9
|
+
path = options[:path] || "/nginx_status"
|
7
10
|
begin
|
8
|
-
req = Net::HTTP::Get.new(
|
9
|
-
res = Net::HTTP.start(
|
11
|
+
req = Net::HTTP::Get.new(path)
|
12
|
+
res = Net::HTTP.start(host, port){|http| http.request(req)}
|
10
13
|
status = res.body.split("\n")
|
11
14
|
server = status[2].split.map{|i| i.to_i}
|
12
15
|
rww = status[3].split.select{|i| /^[0-9]+$/ =~ i}.map{|i| i.to_i}
|
13
16
|
{
|
14
|
-
|
17
|
+
active_connections: status[0].split(":").last.gsub(/\s/, "").to_i,
|
15
18
|
accepts: server[0],
|
16
19
|
handled: server[1],
|
17
20
|
requests: server[2],
|
data/lib/nginx_utils/version.rb
CHANGED
@@ -7,7 +7,7 @@ describe NginxUtils do
|
|
7
7
|
describe ".get" do
|
8
8
|
it "should get status" do
|
9
9
|
body = "Active connections: 1 \nserver accepts handled requests\n 4 5 51 \nReading: 1 Writing: 3 Waiting: 2 \n"
|
10
|
-
status = {
|
10
|
+
status = {active_connections: 1, accepts: 4, handled: 5, requests: 51, reading: 1, writing: 3, waiting: 2}
|
11
11
|
response = double("http response mock", body: body)
|
12
12
|
Net::HTTP.should_receive(:start).and_return(response)
|
13
13
|
expect(NginxUtils::Status.get).to eq(status)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nginx_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -78,7 +78,9 @@ dependencies:
|
|
78
78
|
description: The various utilities on nginx
|
79
79
|
email:
|
80
80
|
- i2bskn@gmail.com
|
81
|
-
executables:
|
81
|
+
executables:
|
82
|
+
- nginx_logrotate
|
83
|
+
- nginx_status
|
82
84
|
extensions: []
|
83
85
|
extra_rdoc_files: []
|
84
86
|
files:
|
@@ -88,6 +90,8 @@ files:
|
|
88
90
|
- LICENSE.txt
|
89
91
|
- README.md
|
90
92
|
- Rakefile
|
93
|
+
- bin/nginx_logrotate
|
94
|
+
- bin/nginx_status
|
91
95
|
- lib/nginx_utils.rb
|
92
96
|
- lib/nginx_utils/logreader.rb
|
93
97
|
- lib/nginx_utils/logrotate.rb
|
@@ -113,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
117
|
version: '0'
|
114
118
|
segments:
|
115
119
|
- 0
|
116
|
-
hash: -
|
120
|
+
hash: -837549919504176739
|
117
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
122
|
none: false
|
119
123
|
requirements:
|
@@ -122,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
126
|
version: '0'
|
123
127
|
segments:
|
124
128
|
- 0
|
125
|
-
hash: -
|
129
|
+
hash: -837549919504176739
|
126
130
|
requirements: []
|
127
131
|
rubyforge_project:
|
128
132
|
rubygems_version: 1.8.25
|